Деплой Elixir-додатків

Deploy Exilir Applications
Дана стаття бере участь у конкурсі від Wunsh.ru — російськомовне співтовариство Elixir. Практики і просто співчуваючі — приєднуйтесь!
У статті розглянуто процес налаштування програми для релізу на віддалений сервер. Для такого не легкого справи в світі Elixir існує два хороших проекту, перший це
Distillery
, якої робить білд програми і другий це
Edeliver
, якій дозволяє здійснювати гарячу заміну коду. Нижче наведено базові інструкції по використанню цих двох бібліотек на прикладі найпростішого Elixir-додатки. А також стаття розповість яким чином можна покращити деплой завдяки використанню
docker
контейнерів.
Distillery
Distillery
призначений для автоматизації генерації релізів Elixir проектів! Є спадкоємцем Exrm від того ж автора. Дуже простий у використанні.
насамперед необхідно додати
distillery
в залежності проекту. А після виконати
mix deps.get
.
def application do
[
mod: {Single, []},
applications: [:logger, :cowboy, :plug]
]
end

defp deps do
[{:cowboy, "~> 1.1.2"},
{:plug, "~> 1.3.0"},
{:distillery, "~> 1.0"}]
end

Щоб створити конфігураційний файл
distillery
необхідно в директорії проекту виконати наступну команду:
mix release.init

Ця команда створить
rel
каталог з файлом
config.exs
.
Distillery
має велику кількість настроюваних параметрів. Файл, що згенерував автоматично, відразу ж підійшов.
Для того, щоб зробити білд програми для розгортання в "бою" режимі, необхідно виконати наступну команду:
MIX_ENV=prod mix release --env=prod

Ця команда створить архів
_build/prod/rel/<name>/releases/<version>/<name>.tar.gz
з зібраними додатком. Далі цей архів необхідно доставити на прод. сервер, де потрібно розпакувати і запустити додаток. Це можливо зробити за допомогою простенького
shell
скрипта, але це не кращий варіант, так як буде downtime.
deploy.sh
#!/bin/sh

REMOTE_USER="www"
REMOTE_HOST="host"

APP_NAME="single"
APP_FOLDER="/home/$REMOTE_USER/$APP_NAME"

SERVER=$REMOTE_USER@$REMOTE_HOST

echo "Enter the version of the application"
read VERSION

if !(ssh $SERVER "[ -d $APP_FOLDER/tmp/ ]") then
echo "Preparing directory structure"
ssh $SERVER "mkdir -p $APP_FOLDER/tmp/"
fi

echo "Copying release to server in $APP_FOLDER"
scp _build/prod/rel/$APP_NAME/releases/$VERSION/$APP_NAME.tar.gz $SERVER:$APP_FOLDER/tmp/

echo "Stopping the old version"
ssh $SERVER "cd $APP_FOLDER && bin/$APP_NAME stop"

echo "Extracting archive with release"
ssh $SERVER "cd $APP_FOLDER/tmp/ && tar -xzf $APP_NAME.tar.gz -C $APP_FOLDER"

echo "Running the new version"
ssh $SERVER "cd $APP_FOLDER && PORT=80 bin/$APP_NAME start"

Залишилося тільки перевірити доступність пропозиції.
curl -i http://host
HTTP/1.1 200 OK
server: Cowboy
date: Thu, 09 Feb 2017 11:28:08 GMT
content-length: 9
cache-control: max-age=0, private, must-revalidate
content-type: text/plain; charset=utf-8

Single v1

Можна спростити доставку програми на прод. сервер використовуючи
Edeliver
.
Edeliver
Edeliver
— по суті своїй написана на Elixir надбудова над набором сценаріїв bash, яка вміє збирати і розгортати Elixir і Erlang програми, а також здійснювати гаряче оновлення коду.
насамперед необхідно додати
edeliver
в залежності проекту. А після виконати
mix deps.get
.
def application do
[
mod: {Single, []},
applications: [:logger, :cowboy, :plug, :edeliver]
]
end

defp deps do
[{:cowboy, "~> 1.1.2"},
{:plug, "~> 1.3.0"},
{:distillery, "~> 1.0"},
{:edeliver, "~> 1.4.2"}]
end

Всі налаштування для
Edeliver
зберігаються у файлі
.deliver/config
. У ньому можна вказати різного роду оточення. Наприклад BUILD, STAGING і PRODUCTION.
APP="single"

BUILD_HOST="host"
BUILD_USER="www"
BUILD_AT="/home/www/single/tmp"

PRODUCTION_HOSTS="host"
PRODUCTION_USER="www"
DELIVER_TO="/home/www/single"

Для того, щоб зробити білд програми для розгортання в "бою" режимі, необхідно виконати наступну команду:
env MIX_ENV=prod mix edeliver build release

Потім, щоб доставити білд на потрібне оточення (в даному випадку production) необхідно виконати:
mix edeliver deploy release to production --version=0.1.0

Дана команда лише завантажить зібраний реліз на віддалений сервер, але не запустить сам додаток.
Для запуску програми призначена наступна командою:
mix edeliver start production

Якщо ви робили білд у відмінному від production оточенні, ви можете отримати не працездатний додаток. Це пов'язано з тим, що при складанні програми використовуються NIF'и (native implemented functions), які на різних машинах можуть бути… різні.
Залишилося тільки перевірити доступність пропозиції.
curl -i http://host
HTTP/1.1 200 OK
server: Cowboy
date: Thu, 09 Feb 2017 11:28:08 GMT
content-length: 9
cache-control: max-age=0, private, must-revalidate
content-type: text/plain; charset=utf-8

Single v2

Трохи про Docker і Distillery
Тут мені нічого розповісти, краще прочитайте відмінний переклад від Wunsh ось цієї статті http://teamon.eu/2017/deploying-phoenix-to-production-using-docker/
Heroku
Деплой Elixir додатків на Heroku дуже простий, все що потрібно, так це додати билдпак до вже існуючого додатком
heroku buildpacks:set https://github.com/HashNuke/heroku-buildpack-elixir

Або створити новий додаток із зазначенням даного билдпака.
heroku create --buildpack "https://github.com/HashNuke/heroku-buildpack-elixir.git"

Даний билдпак може бути налаштований за прикладом з офіційно репозиторію.
Потім всі, як ви звикли, просто виконайте:
git push heroku master

Висновок
Якщо вам цікавий функціональний мова програмування Elixir або ви просто співчуває то раджу вам приєднатися до Telegram-каналу https://telegram.me/proelixir про Elixir.
У вітчизняного Elixir спільноти починає з'являтися єдина площадка в особі проекту Wunsh.ru. Зараз у проекту є тематична розсилка, в якій немає нічого нелегального, раз в тиждень буде приходити лист з підбіркою статей про Elixir російською мовою.
Література
http://bitwalker.org/posts/2016-07-21-distillery-vs-exrm-vs-relx/
https://shovik.com/blog/6-deploying-phoenix-apps-for-rails-developers
https://github.com/bitwalker/distillery
https://github.com/boldpoker/edeliver
https://github.com/HashNuke/heroku-buildpack-elixir
http://blog.plataformatec.com.br/2016/06/deploying-elixir-applications-with-edeliver/
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.