Как автоматизировать развертывание Elixir-Phoenix с помощью Distillery и edeliver в Ubuntu 16.04

Вступление

Https://elixir-lang.org/[Elixir], построенный на языке программирования Erlang, является функциональным языком программирования, популярным благодаря своей ориентации на производительность труда разработчиков и простоте написания. параллельные и масштабируемые приложения.

Phoenix - это веб-фреймворк, построенный на Elixir для создания высокопроизводительных веб-приложений.

А в сочетании с двумя дополнительными инструментами - Distillery и edeliver - вы можете полностью автоматизировать развертывание проектов Phoenix из своей разработки. среда для производственного сервера.

Distillery компилирует приложения Elixir в единый пакет, который затем можно развернуть в другом месте. Он также генерирует пакеты, которые допускают hot-swapping кода, что означает, что вы можете обновлять живые приложения без простоев. Все это может быть сделано с минимальной конфигурацией с вашей стороны, что отличает Distillery от многих других опций.

edeliver автоматизирует этот процесс сборки и развертывания, выполняя повторяющиеся задачи, такие как сборка приложения, передача собранного пакета на сервер, миграция базы данных и запуск / обновление сервера. При необходимости вы можете даже настроить edeliver для промежуточной промежуточной настройки.

В этом руководстве вы установите Erlang, Elixir и Phoenix 1.3 на локальном компьютере для разработки и на производственном сервере, упростите обмен данными по SSH между двумя расположениями, а затем создадите пример проекта Phoenix для сборки и развернуть с помощью edeliver. Наконец, вы обезопасите производственный сервер с помощью обратного прокси-сервера Nginx и SSL-сертификата.

К концу урока у вас будет одна команда, которая может:

  • создать релиз Phoenix, совместимый с вашей производственной средой

  • разверните выпуск в своей производственной среде

  • запустите ваше приложение в производственной среде

  • Горячая замена текущей производственной версии путем развертывания новой версии без простоев

Предпосылки

Перед началом убедитесь, что у вас есть следующее:

  • Основанная на Ubuntu машина локальной разработки. Хотя инструкции этого руководства написаны для локальной машины разработки на основе Ubuntu, одним из преимуществ этого процесса развертывания является то, что он полностью независим от производственной среды. Инструкции по настройке локальных машин для разработки в других операционных системах см. В official установочной документации Elixir. Или, чтобы настроить remote машину для разработки на основе Ubuntu, следуйте https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04, чтобы ознакомиться с этим руководством по начальной настройке сервера].

  • Учетная запись пользователя без полномочий root с привилегиями sudo на производственном сервере Ubuntu 16.04 с ОЗУ не менее 1 ГБ, настроенная с помощью первых четырех шагов в https://www.digitalocean.com/community/tutorials/initial-server-setup -with-ubuntu-16-04 [это начальное руководство по настройке сервера].

  • Поскольку наша цель - автоматизировать процесс развертывания, не вводите парольную фразу SSH при выполнении шага 4 руководства по установке. Кроме того, обязательно разрешите доступ к порту + 4000 + на шаге 7 руководства по установке с помощью команды + sudo ufw allow 4000+. Именно этот порт мы будем использовать для тестирования Phoenix на протяжении всего этого урока.

  • Nginx установлен на рабочем сервере, следуя инструкциям https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04, как установить Nginx в Ubuntu 16.04].

  • Полностью зарегистрированное доменное имя. В этом руководстве будет использоваться + example.com +. Вы можете приобрести доменное имя на https://namecheap.com [Namecheap], получить его бесплатно на Freenom или использовать регистратор домена по вашему выбору. ,

  • Обе следующие записи DNS настроены для вашего сервера. Вы можете следовать thutorial этого имени хоста для получения подробной информации о том, как их добавить.

  • Запись A с ++, указывающая на публичный IP-адрес вашего сервера.

  • Запись A с + www. +, Указывающая на публичный IP-адрес вашего сервера.

  • Nginx защищен с помощью сертификата SSL, следуя https://www.digitalocean.com/community/tutorials/how-to-set-up-let-s-encrypt-with-nginx-server-blocks-on-ubuntu-16- 04 [эта настройка Let’s Encrypt с блоками сервера Nginx в Ubuntu 16.04 учебник]. Обязательно выберите опцию 2 + Redirect + в шаге 4 учебного пособия по настройке Nginx, поскольку это обеспечит автоматическое перенаправление на HTTPS на производственном сервере, который мы создаем в этом учебном пособии.

Шаг 1 - Установка Elixir и Phoenix на локальной машине разработки

Поскольку Elixir работает на виртуальной машине Erlang, нам нужно установить виртуальную машину, прежде чем мы сможем установить сам Elixir. И поскольку мы хотим убедиться, что мы используем самую последнюю стабильную версию Erlang, мы установим Erlang из репозитория Erlang Solutions.

Сначала загрузите и добавьте репозиторий Erlang Solutions на свой локальный компьютер для разработки.

cd ~
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

Теперь обновите ваш список пакетов и установите пакет + esl-erlang +, который предоставляет как язык программирования Erlang, так и полезные инструменты, библиотеки и промежуточное программное обеспечение, совместно именуемое платформой Erlang / OTP.

sudo apt-get update
sudo apt-get install esl-erlang

Затем установите Elixir.

sudo apt-get install elixir

Затем используйте Mix - инструмент для сборки, поставляемый в комплекте с Elixir, для создания проектов Elixir и управления зависимостями - чтобы установить собственный менеджер пакетов Elixir, Hex, который вы позже будете использовать для установки Phoenix.

Часть + local + этой команды говорит Mix установить локально + hex +.

mix local.hex

Когда будет предложено подтвердить установку, введите + Y +.

OutputAre you sure you want to install "https://repo.hex.pm/installs/1.5.0/hex-0.17.1.ez"? [Yn]
* creating .mix/archives/hex-0.17.1

Теперь используйте Hex для установки архива Phoenix 1.3.0 Mix, Zip-файла, который содержит все, что вам нужно для создания нового базового проекта Phoenix, из которого можно построить.

mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new-1.3.0.ez

Снова, когда будет предложено подтвердить установку, введите + Y +.

OutputAre you sure you want to install "https://github.com/phoenixframework/archives/raw/master/phx_new-1.3.0.ez"? [Yn]
* creating .mix/archives/phx_new-1.3.0

С Elixir и Phoenix, установленными на локальном компьютере разработчика, давайте установим необходимые нам части на производственном сервере.

Шаг 2 - Установка Elixir и Phoenix на рабочий сервер

Поскольку нам нужно, чтобы наш проект Phoenix работал как на локальной машине разработки, так и на производственном сервере, нам потребуется установить все одинаковые языки и инструменты в обоих местах.

Используя те же команды из ссылки: # step-1-% E2% 80% 94-Установка-эликсир-и-Феникс-на-локальной-машине разработки [Шаг 1], загрузите и добавьте репозиторий Erlang Solutions в свой производственный сервер.

cd ~
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

Обновите список пакетов и установите пакет + esl-erlang +.

sudo apt-get update
sudo apt-get install esl-erlang

Установите Эликсир.

sudo apt-get install elixir

Используйте Mix для установки Hex.

mix local.hex

Когда будет предложено подтвердить установку, введите + Y +.

OutputAre you sure you want to install "https://repo.hex.pm/installs/1.5.0/hex-0.17.1.ez"? [Yn]
* creating .mix/archives/hex-0.17.1

Теперь и локальная машина разработки, и рабочий сервер готовы к запуску Phoenix, но давайте упростим подключение к производственному серверу с локальной машины разработки, настроив псевдоним хоста SSH.

Шаг 3 - Настройка псевдонима хоста SSH

Поскольку наша цель - полностью автоматизированный процесс развертывания, мы сгенерировали пару ключей SSH во время ссылки: #prerequisites [начальная настройка рабочего сервера], которая не запрашивает парольную фразу.

Прямо сейчас мы можем подключиться с локальной машины разработки к производственному серверу с помощью команды + ssh -i ~ / .ssh / @ +.

Здесь мы подключаемся к + example.com + как пользователь * sammy *. Флаг + -i + указывает SSH использовать файл закрытого ключа, расположенный в + ~ / .ssh / private_key_file + для соединения.

Мы можем сделать эту команду - и сам процесс развертывания - еще проще, настроив псевдоним хоста SSH, который автоматически знает, какой закрытый ключ, пользователь и домен следует использовать при подключении к производственному серверу.

Откройте + ~ / .ssh / config + на локальном компьютере разработчика для редактирования.

nano ~/.ssh/config

И скопируйте в следующих строках.

~ / .Ssh / конфигурации

Host
   HostName
   User
   IdentityFile

Строка + Host + предоставляет псевдоним, который идентифицирует эту конкретную конфигурацию. Чтобы было легче запомнить, мы используем наше доменное имя. Строка + HostName + указывает SSH, к какому хосту подключаться. Строка + User + позволяет SSH знать, к какому пользователю подключаться, а + IdentityFile + сообщает SSH, какой файл закрытого ключа использовать.

Сохраните ваши изменения и закройте файл.

Наконец, проверьте конфигурацию, подключившись к производственному серверу.

ssh

Вы должны были установить соединение без указания пользователя, файла личного ключа или домена. Если вы не смогли подключиться, следуйте инструкциям на экране и проследуйте предыдущие шаги, чтобы решить проблему.

Теперь, когда мы упростили подключение к производственному серверу, мы можем создать образец проекта Phoenix для развертывания.

Шаг 4 - Создание тестового проекта

По умолчанию при создании нового проекта Phoenix он настраивается с помощью адаптера базы данных PostgreSQL и Brunch - сборки веб-приложения на основе JavaScript. орудие труда. Чтобы избежать этой дополнительной сложности, мы создадим простой проект Phoenix с именем + myproject + без адаптера базы данных и без Brunch, передав флаги + - no-ecto + и + - no-brunch + соответственно.

Перейдите в свой домашний каталог и создайте новый проект.

cd ~
mix phx.new --no-ecto --no-brunch

Вывод включает в себя каталоги и файлы, созданные Phoenix в качестве скаффолдинга для проекта + myproject +, приглашение подтвердить, что вы хотите установить необходимые зависимости, а также инструкции о том, как запустить встроенный сервер Phoenix.

Введите + Y +, когда будет предложено подтвердить установку.

Output* creating myproject/config/config.exs
* creating myproject/config/dev.exs
* creating myproject/config/prod.exs
...

Fetch and install dependencies? [Yn]
* running mix deps.get
* running mix deps.compile

We are all set! Go into your application by running:

   $ cd myproject

Start your Phoenix app with:

   $ mix phx.server

You can also run your app inside IEx (Interactive Elixir) as:

   $ iex -S mix phx.server

Теперь давайте посмотрим, работает ли наш тестовый проект.

Перейдите в каталог + myproject + и выполните команду + mix phx.server +, чтобы скомпилировать проект и запустить сервер.

cd ~/myproject
mix phx.server

Выходные данные сообщают вам количество и типы файлов, скомпилированных Phoenix, предупреждают о проблемах, с которыми он столкнулся на этом пути, и, в случае успеха, сообщают, где можно достичь проекта.

Когда вы в первый раз скомпилируете приложение на основе Elixir на своем локальном компьютере разработки, вам будет предложено установить Rebar, инструмент построения и зависимости для Erlang, на который полагается Mix. Введите + Y + в командной строке.

Output==> file_system
Compiling 6 files (.ex)
Generated file_system app
...
Could not find "rebar3", which is needed to build dependency :ranch
I can install a local copy which is just used by Mix
Shall I install rebar3? (if running non-interactively, use "mix local.rebar --force") [Yn]
...
Compiling 11 files (.ex)
Generated myproject app
[info] Running MyprojectWeb.Endpoint with Cowboy using http://0.0.0.0:4000

Чтобы проверить текущую настройку, укажите в своем браузере http: // localhost: 4000. Вы должны увидеть домашнюю страницу Phoenix Framework по умолчанию, которая приветствует вас в Phoenix. Если вы этого не сделаете, убедитесь, что ваш брандмауэр разрешает подключения через порт + 4000 +, а затем просмотрите выходные данные вашего терминала для получения дальнейших инструкций.

Убедившись, что все работает, дважды нажмите + CTRL + C +, чтобы остановить сервер, чтобы он был готов к дальнейшей настройке по ссылке: # step-5-% E2% 80% 94-configuring-the-project-to -использование ликеро-водочного завода [шаг 5].

Теперь, когда у вас есть полнофункциональный локальный проект Phoenix, давайте настроим его на использование Distillery и edeliver.

Шаг 5 - Настройка проекта для использования ликеро-водочного завода и edeliver

Проекты Phoenix хранят сведения о конфигурации, такие как порт, на котором выполняется проект, и URL-адрес хоста проекта в + config / prod.exs +, поэтому мы начнем с редактирования этого файла, чтобы сообщить Phoenix, как достичь проекта в производственной среде.

Откройте + config / prod.exs + на вашем локальном компьютере для редактирования.

nano ~/myproject/config/prod.exs

Найдите следующий блок кода:

Config / prod.exs

...
config :myproject, MyprojectWeb.Endpoint,
 load_from_system_env: true,
 url: [host: "example.com", port: 80],
 cache_static_manifest: "priv/static/cache_manifest.json"
...

Когда для + load_from_system_env + установлено значение + true +, Phoenix получает порт, на котором должен выполняться проект, из переменной окружения + PORT + по умолчанию. Это упоминается как порт HTTP.

+ Url: [host] + и + url: [port] + используются для генерации ссылок в проекте. Эта разница между HTTP и URL особенно полезна при настройке прокси, где конечная точка прокси находится на другом порту, чем проект Phoenix.

Для простоты мы установим жесткий код в порт HTTP, на котором работает + myproject +. Это уменьшит количество движущихся частей, что, в свою очередь, повысит надежность нашего процесса автоматического развертывания.

В дополнение к параметрам по умолчанию, которые мы будем изменять, мы также добавим две новые опции.

Опция + server + указывает Distillery настроить проект на загрузку HTTP-сервера при запуске, чего мы и хотим в полностью автоматизированном процессе развертывания.

Опция + code_reloader + указывает проекту обновлять все подключенные веб-браузеры при каждом изменении кода проекта. Хотя это может быть очень полезной функцией при разработке, она не предназначена для производственных сред, поэтому мы ее отключим.

Теперь измените конфигурацию по умолчанию.

Config / prod.exs

...
config :myproject, MyprojectWeb.Endpoint,

 url: [host: "", port: 80],
 cache_static_manifest: "priv/static/manifest.json"


...

Сохраните и закройте + config / prod.exs + после внесения изменений.

Когда мы создали проект + myproject + в ссылке: # step-4-% E2% 80% 94-creation-a-test-project [Шаг 4], Phoenix автоматически сгенерировал файл + .gitignore +, который мы будем нужно в ссылке: # step-6-% E2% 80% 94-configuring-edeliver-and-винокурня [Шаг 6], когда мы отправляем изменения кода на сервер сборки с edeliver.

По умолчанию этот файл + .gitignore + указывает Git игнорировать зависимости и создавать файлы, чтобы хранилище не становилось слишком большим. Кроме того, этот файл говорит Git игнорировать + prod.secret.exs +, файл в каталоге + config + всех проектов Phoenix, который содержит очень важную информацию, такую ​​как пароли производственной базы данных и секреты приложений для подписи токенов.

Поскольку для правильной работы проекта + myproject + на рабочем сервере требуется + prod.secret.exs +, и мы не можем переместить его туда с помощью Git, нам придется перенести его на сервер вручную.

В вашем домашнем каталоге на рабочем сервере создайте новый каталог с именем + app_config +. Здесь вы будете хранить + prod.secret.exs.

cd ~
mkdir app_config

Теперь используйте + scp +, чтобы скопировать + prod.secret.exs + в каталог + app_config + на рабочем сервере.

scp ~/myproject/config/prod.secret.exs :/home//app_config/prod.secret.exs

Наконец, убедитесь, что передача произошла, перечислив содержимое + app_config + на производственном сервере.

ls ~/app_config

Если вы не видите + prod.secret.exs + в выходных данных, просмотрите терминал на вашей локальной машине для разработки для получения дополнительной информации.

С + prod.secret.exs + на производственном сервере мы готовы установить Distillery для процесса сборки и edeliver для развертывания, включив их в + mix.exs +, основной файл конфигурации для `+ myproject + проект.

Откройте + mix.exs + на вашей локальной машине для разработки.

nano ~/myproject/mix.exs

Теперь найдите следующий блок кода:

Зависимости в mix.exs

 ...
 defp deps do
   [
     {:phoenix, "~> 1.3.0"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_html, "~> 2.10"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"}
   ]
 end
 ...

+ deps + - это закрытая функция, которая явно определяет все зависимости нашего проекта + myproject +. Хотя это не является строго обязательным, это помогает поддерживать организованную конфигурацию проекта.

Добавьте + edeliver + и + винокурня + в список зависимостей.

Зависимости в mix.exs

 ...
 defp deps do
   [
     {:phoenix, "~> 1.3.0"},
     {:phoenix_pubsub, "~> 1.0"},
     {:phoenix_html, "~> 2.10"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.11"},
     {:cowboy, "~> 1.0"}


   ]
 end
 ...

Сохраните ваши изменения и закройте + mix.exs +.

Теперь скажите + mix +, чтобы получить новые зависимости, чтобы они были доступны во время выполнения.

cd ~/myproject/
mix deps.get

Вывод говорит нам, что + edeliver + и + винокурня + были успешно добавлены в наш проект.

OutputResolving Hex dependencies...
Dependency resolution completed:
 ...
* Getting edeliver (Hex package)
 Checking package (https://repo.hex.pm/tarballs/edeliver-1.4.4.tar)
 Fetched package
* Getting distillery (Hex package)
 Checking package (https://repo.hex.pm/tarballs/distillery-1.5.2.tar)
 Fetched package

Наконец, перезапустите сервер Phoenix на локальном компьютере разработчика, чтобы проверить текущую конфигурацию.

mix phx.server

Укажите в браузере http: // localhost: 4000. Вы должны увидеть ту же домашнюю страницу Phoenix по умолчанию, которую вы видели по ссылке: # step-4-% E2% 80% 94-creation-a-test-project [Шаг 4]. Если вы этого не сделаете, пересмотрите предыдущие шаги и просмотрите терминал вашего локального компьютера разработки для получения дополнительной информации.

Когда вы будете готовы продолжить, дважды нажмите «+ CTRL + C +», чтобы остановить сервер, чтобы он был готов к дальнейшей настройке на следующем шаге.

Установив Distillery и edeliver, мы готовы настроить их для развертывания.

Шаг 6 - Настройка Edeliver и ликеро-водочного завода

Ликеро-водочный завод требует файл конфигурации сборки, который не создается по умолчанию. Однако мы можем сгенерировать конфигурацию по умолчанию, запустив + mix release.init +.

Перейдите в каталог + myproject + на вашей локальной машине для разработки и сгенерируйте файл конфигурации.

cd ~/myproject
mix release.init

Выходные данные подтверждают, что файл был создан, и содержат дальнейшие инструкции о том, как редактировать и создавать выпуск.

OutputAn example config file has been placed in rel/config.exs, review it,
make edits as needed/desired, and then run `mix release` to build the release

edeliver будет искать выпуски в каталоге + rel / + при выполнении горячих обновлений, но Distillery по умолчанию помещает выпуски в каталог + _build +. Итак, давайте изменим файл конфигурации Distillery по умолчанию + rel / config.exs +, чтобы разместить производственные выпуски в нужном месте.

Откройте + rel / config.exs + в вашем редакторе.

nano rel/config.exs

Найдите следующий раздел:

отн / config.exs

...
environment :prod do
 set include_erts: true
 set include_src: false
 set cookie: :"f3a1[Q^31~]3~N=|T|T=0NvN;h7OHK!%%c.}$)iP9!X|TS[X@sqG=m`yBYVt4/`:"
end
...

Этот блок сообщает Distillery, как мы хотим, чтобы он создавал автономные производственные пакеты выпуска. + include_erts + указывает, хотим ли мы объединить систему исполнения Erlang, что полезно, если в целевой системе не установлены Erlang или Elixir. + include_src + указывает, хотим ли мы включать файлы исходного кода. И значение + cookie + используется для аутентификации узлов Erlang для связи друг с другом.

Закройте файл.

Теперь мы готовы к настройке edeliver, но нам придется создать его файл конфигурации вручную.

Перейдите в каталог + myproject + на своей локальной машине разработки и создайте новый каталог с именем + .deliver +, затем откройте новый файл в + .deliver / config + для редактирования.

cd ~/myproject
mkdir .deliver
nano .deliver/config

В этом файле мы укажем детали сборочных и производственных серверов. Поскольку мы используем один и тот же сервер как для сборки, так и для производства, наш хост и пользователь одинаковы для сборки и производства. Кроме того, мы выполним сборку в каталоге + app_build + и поместим скомпилированные производственные файлы в каталог + app_release +.

Скопируйте следующее в файл.

deliver/config
APP=""

BUILD_HOST=""
BUILD_USER=""
BUILD_AT="/home//app_build"

PRODUCTION_HOSTS=""
PRODUCTION_USER=""
DELIVER_TO="/home//app_release"

Затем мы создадим символическую ссылку в папке сборки на + prod.secret.exs +, файл, который мы передали в каталог + app_config + на рабочем сервере по ссылке: # step-5-% E2% 80% 94-Конфигурирование проекта-для-использования-ликероводочного завода и edeliver [Шаг 5]. Эта символическая ссылка создается внутри ловушки edeliver. В каждой точке процесса сборки, этапа и развертывания edeliver вызывает определенный хук. Для нашей автоматической установки развертывания мы слушаем хук + pre_erlang_get_and_update_deps +, который вызывается до того, как edeliver получит наши зависимости и начнет компиляцию.

Добавьте следующее к + .deliver / config +.

deliver/config
pre_erlang_get_and_update_deps() {
 local _prod_secret_path="/home//app_config/prod.secret.exs"
 if [ "$TARGET_MIX_ENV" = "prod" ]; then
   __sync_remote "
     ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs'
   "
 fi
}

Сохраните и закройте файл, когда вы закончите редактирование.

Поскольку edeliver использует Git для передачи кода из последнего коммита на сервер сборки для дальнейших действий, последний шаг перед развертыванием - создание Git-репозитория для нашего проекта.

В каталоге + myproject + на вашем локальном компьютере разработки используйте команду + git init +, чтобы создать пустой репозиторий Git.

cd ~/myproject
git init

Прежде чем мы добавим наши файлы в индекс Git, нам также нужно добавить каталог, содержащий наши tar-релизы, в файл + .gitignore +. В противном случае репозиторий Git станет очень большим по размеру после нескольких выпусков.

echo ".deliver/releases/" >> .gitignore

Затем добавьте полный набор файлов из проекта + myproject + в область подготовки Git, чтобы они были включены в следующий коммит.

git add .

Теперь установите идентичность, которую Git должен ассоциировать с этим хранилищем. Это поможет вам отследить, откуда произошли изменения в вашем проекте.

git config user.email ""
git config user.name ""

Наконец, зафиксируйте файлы в хранилище, используя опцию + -m +, чтобы описать причину фиксации.

git commit -m "Setting up automated deployment"

Выходные данные повторяют ваше сообщение о фиксации, а затем сообщают о количестве измененных файлов, количестве вставленных строк и именах файлов, которые были добавлены в хранилище.

Output[master (root-commit) e58b766] Setting up automated deployment
39 files changed, 2344 insertions(+)
create mode 100644 .deliver/config
...

Теперь, когда наш проект полностью настроен на Git и Distillery и edeliver, мы готовы к нашему первому развертыванию.

Шаг 7 - Развертывание проекта

Одним из преимуществ этого процесса развертывания является то, что вы будете выполнять практически все на локальном компьютере разработки, редко когда нужно будет прикасаться к производственному серверу.

Давайте теперь выполним все проекты myproject, отправив проект + myproject + на рабочий сервер.

Во-первых, используйте + mix + на своем локальном компьютере для разработки выпуска проекта и перенесите его на сервер сборки с помощью edeliver.

cd ~/myproject
mix edeliver build release

Выходные данные обновляют информацию о каждом шаге процесса сборки в реальном времени и, если все работает должным образом, сообщают, что сборка прошла успешно.

OutputBUILDING RELEASE OF MYPROJECT APP ON BUILD HOST

-----> Authorizing hosts
-----> Ensuring hosts are ready to accept git pushes
-----> Pushing new commits with git to:
-----> Resetting remote hosts to fc86f878d96...
-----> Cleaning generated files from last build
-----> Fetching / Updating dependencies
-----> Compiling sources
-----> Generating release
-----> Copying release 0.0.1 to local release store
-----> Copying myproject.tar.gz to release store

RELEASE BUILD OF MYPROJECT WAS SUCCESSFUL!

Если ваша сборка не удалась, edeliver укажет строку кода, которую он пытался выполнить, когда столкнулся с проблемой. Вы можете использовать эту информацию для устранения проблемы.

После завершения сборки перенесите выпуск на рабочий сервер.

mix edeliver deploy release to production

Еще раз, выходные данные обновляют вас о каждом шаге процесса в реальном времени и, если все работает, сообщают вам, что сборка была выпущена в производство.

OutputDEPLOYING RELEASE OF MYPROJECT APP TO PRODUCTION HOSTS

-----> Authorizing hosts
-----> Uploading archive of release 0.0.1 from local release store
-----> Extracting archive myproject.0.1.tar.gz

DEPLOYED RELEASE TO PRODUCTION!

Если вы столкнулись с проблемой развертывания, проверьте вывод в терминале для получения дополнительной информации.

Наконец, запустите проект + myproject + на производственном сервере.

mix edeliver start production

Выходные данные сообщают пользователю, что проект выполняется как, хост, на котором он выполняется, и путь к выпуску, который он использует на рабочем сервере. Ответ будет + START DONE! +.

OutputEDELIVER MYPROJECT WITH START COMMAND

-----> starting production servers

production node:

 user    :
 host    :
 path    : /home//app_release
 response:

START DONE!

Протестируйте процесс развертывания, указав в браузере + http: //: 4000 +. Вы должны снова увидеть домашнюю страницу Phoenix Framework по умолчанию. Если вы этого не сделаете, дважды проверьте, что порт + 4000 + открыт на рабочем сервере, а затем обратитесь к терминалу локального компьютера разработчика для получения дополнительной информации.

Теперь, когда мы проверили весь процесс сборки и развертывания, давайте сделаем еще один шаг вперед, выполнив обновление кода без простоев на рабочем сервере.

Шаг 8 - Обновление проекта без простоя производства

Одной из особенностей нашего процесса сборки и развертывания является возможность горячей замены кода, обновления проекта на рабочем сервере без простоев. Давайте внесем некоторые изменения в проект, чтобы попробовать это.

Откройте файл домашней страницы проекта для редактирования.

nano ~/myproject/lib/myproject_web/templates/page/index.html.eex

Найдите следующую строку:

~ / MyProject / веб / шаблоны / страница / index.html.eex

...
<h2><%= gettext "Welcome to %{name}", name: "Phoenix!" %></h2>
...

Теперь замените эту строку следующим:

<h2>Hello, World!</h2>

Сохраните и закройте файл.

Теперь, когда мы обновили кодовую базу, нам также нужно увеличить версию приложения. Номер версии упрощает отслеживание выпусков и откат к предыдущим версиям, если это необходимо.

Откройте + mix.exs + на вашей локальной машине для разработки.

nano ~/myproject/mix.exs

Найдите следующий блок:

mix.exs

 ...
 def project do
   [app: :myproject,
    version: "0.0.1",
    elixir: "~> 1.2",
    elixirc_paths: elixirc_paths(Mix.env),
    compilers: [:phoenix, :gettext] ++ Mix.compilers,
    build_embedded: Mix.env == :prod,
    start_permanent: Mix.env == :prod,
    deps: deps()]
 end
 ...

Увеличить версию с + 0.0.1 + до + 0.0.2 +.

mix.exs

 ...
 def project do
   [app: :myproject,
    version: "",
    elixir: "~> 1.2",
    elixirc_paths: elixirc_paths(Mix.env),
    compilers: [:phoenix, :gettext] ++ Mix.compilers,
    build_embedded: Mix.env == :prod,
    start_permanent: Mix.env == :prod,
    deps: deps()]
 end
 ...

Затем сохраните и закройте файл.

Теперь нам нужно добавить и зафиксировать наши изменения в Git, чтобы edeliver знал, что он должен отправить их на сервер сборки.

git add .
git commit -m "Changed welcome message"

Наконец, мы готовы оперативно заменить наши изменения. На этот раз у нас есть одна команда, которая эквивалентна трем связанным командам, которые мы использовали в ссылке: # step-7-% E2% 80% 94-deploying-the-project [Шаг 7].

С помощью одной команды соберите, разверните и перезапустите приложение на рабочем сервере.

mix edeliver upgrade production

Еще раз, вывод выводит нас через каждый шаг процесса в реальном времени и, в случае успеха, заканчивается на «+ UPGRADE DONE! +».

OutputEDELIVER MYPROJECT WITH UPGRADE COMMAND

-----> Upgrading to revision 2fc28b6 from branch master
-----> Detecting release versions on production hosts
-----> Deploying upgrades to 1 online hosts
-----> Checking whether installed version 0.0.1 is in release store
-----> Building the upgrade from version 0.0.1
-----> Authorizing hosts
-----> Validating * version 0.0.1 is in local release store
-----> Ensuring hosts are ready to accept git pushes
-----> Pushing new commits with git to:
-----> Resetting remote hosts to 2fc28b6...
-----> Cleaning generated files from last build
-----> Checking out 2fc28b6...
-----> Fetching / Updating dependencies
-----> Compiling sources
-----> Checking version of new release
-----> Uploading archive of release 0.0.1 from local release store
-----> Extracting archive myproject_0.0.1.tar.gz
-----> Generating release
-----> Removing built release 0.0.1 from remote release directory
-----> Copying release 0.0.2 to local release store
-----> Copying myproject.tar.gz to release store
-----> Upgrading production hosts to version 0.0.2
-----> Authorizing hosts
-----> Uploading archive of release 0.0.2 from local release store
-----> Upgrading release to 0.0.2

UPGRADE DONE!

Чтобы убедиться, что все работает, перезагрузите + http: //: 4000 + в вашем браузере. Вы должны увидеть новое сообщение. Если вы этого не сделаете, повторите предыдущие шаги и проверьте свой терминал на наличие дополнительных сообщений об ошибках и предупреждений.

Процесс развертывания теперь сокращен до одной команды, и мы также используем одну из самых известных функций Erlang - горячую замену кода. В качестве последнего штриха давайте укрепим наше приложение в производстве, разместив его за прокси-сервером Nginx.

Шаг 9 - Настройка обратного прокси на производственном сервере

Хотя мы можем напрямую выставлять наше приложение в Интернете, обратный прокси-сервер обеспечит лучшую безопасность. Для простоты настройки, поддержки SSL и возможности настраивать заголовки ответов HTTP, мы будем использовать Nginx для нашего прокси.

Если вы следили за настройкой Давайте зашифруем с помощью блоков серверов Nginx в руководстве по Ubuntu 16.04] в предварительных условиях, вы должны были уже создать отдельный блок сервера Nginx на производственном сервере только для нашего проекта.

Откройте файл конфигурации этого блока сервера для редактирования.

sudo nano /etc/nginx/sites-available/

Во-первых, нам нужно сообщить Nginx, где находится наш проект Phoenix и какой порт он прослушивает. Так как мы обслуживаем наш проект через порт «+ 4000 » локально, мы сообщаем Nginx, что наша конечная точка прокси находится в «+127.0.0.1: 4000».

Скопируйте следующий код в файл конфигурации над блоком конфигурации сервера по умолчанию.

/etc/nginx/sites-available/example.com

upstream phoenix {
   server 127.0.0.1:4000;
}

Теперь в том же файле найдите следующий блок кода:

/etc/nginx/sites-available/example.com

   ...
       location / {
               # First attempt to serve request as file, then
               # as directory, then fall back to displaying a 404.
               try_files $uri $uri/ =404;
       }
   ...

Чтобы прокси работал, нам нужно указать Nginx перенаправить все соединения с веб-сервером в наш проект Phoenix, включая заголовок запроса, IP-адрес сервера, через который был проксирован клиент, и IP-адрес клиента. сам.

Мы также настроим Nginx для пересылки входящих запросов с помощью WebSockets - протокола обмена сообщениями между веб-серверами и клиентами, который обновляет стандартное HTTP-соединение без сохранения состояния с постоянным.

В Phoenix есть функция под названием «Каналы», которую мы не изучали в этом руководстве, но для каналов требуется поддержка WebSockets. Без этой конфигурации каналы не будут работать, потому что запросы WebSocket не будут поступать на сервер.

Замените предыдущий блок + location + следующим:

/etc/nginx/sites-available/example.com

 location / {
   allow all;

   # Proxy Headers
   proxy_http_version 1.1;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header Host $http_host;
   proxy_set_header X-Cluster-Client-Ip $remote_addr;

   # WebSockets
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";

   proxy_pass http://phoenix;
 }

Сохраните и закройте файл, чтобы продолжить.

Теперь проверьте новую конфигурацию Nginx.

sudo nginx -t

Nginx должен сообщить, что с синтаксисом все в порядке и тест прошел успешно. Если нет, следуйте инструкциям на экране для решения проблемы.

Перезапустите Nginx, чтобы распространить изменения.

sudo systemctl restart nginx

Наконец, в целях безопасности, запретите доступ к вашему приложению по HTTP через порт + 4000 +.

sudo ufw delete allow 4000

Затем проверьте статус UFW.

sudo ufw status

На этом этапе брандмауэр должен разрешать только SSH и Nginx доступ.

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

Наконец, проверьте, что все работает, указав вашему браузеру + https: // +.

Теперь у вас есть полностью автоматизированный процесс сборки и развертывания и рабочий сервер, защищенный как обратным прокси-сервером, так и сертификатом SSL.

Заключение

Несмотря на то, что мы настроили edeliver для сборки и развертывания нашего проекта Phoenix на производственном сервере с помощью одной команды, еще многое можно сделать.

Большинство производственных приложений Phoenix используют базу данных. В How для развертывания приложений Elixir-Phoenix с MySQL в Ubuntu 16.04, вы продолжите работать с этим приложением, добавив базу данных MySQL и внедрив новые функции в производство.

Если ваша производственная инфраструктура состоит из кластера узлов Phoenix, вы можете использовать edeliver для развертывания и выполнения горячей замены на всех узлах одновременно.

Или, если вам нужна установка с большей надежностью, вы можете создать полноценную промежуточную инфраструктуру и использовать edeliver для управления процессом подготовки и развертывания.

Чтобы узнать больше об этих темах или о расширении вашей текущей установки edeliver в целом, посетите страницу проекта official на GitHub.

Related