Деплой Phoenix-приложений через Edeliver. Часть 1

Для Rails-разработчиков гем capistrano — привычное решение с отличной документацией, надёжность которого уже не раз была доказана в продакшне; многие без колебаний выбрали бы его для развёртывания своих приложений. В Elixir/Phoenix пока не существует такого же лёгкого пути. Опрос, проведённый Джошем Адамсом, показал, что 33% Elixir-разработчиков действуют по ситуации, 30% используют Docker, ещё 30% разворачивают свои приложения на Heroku и только 14% делают это в edeliver, тогда как все оставшиеся опрошенные прибегают к помощи других технологий. В этой статье я покажу, как происходит разворот Phoenix-приложения на практике.

Стоит отметить, что на данный момент сделать это не так уж и просто. Выступая на конференции, посвящённой Elixir и рассуждая о практическом развертывании Elixir-приложений, Пит Гамаш обронил забавную фразу: «Будет больно. Очень больно». Основная суть проблемы, на мой взгляд, заключается в том, что на сегодняшний день полностью отсутствует представление о том, как нужно производить развёртывание приложений на Elixir/Erlang. Многие Elixir-разработчики имеют за спиной опыт программирования на Rails, а значит, их разум затуманен идеей capistrano. Пожалуй, с похожей проблемой сталкиваются пользователи Subversion, изучая Git.

«Правильный» способ развёртывания приложений на платформе Erlang/OTP коренным образом отличается от способов развёртывания приложений на других платформах. Считается, что виртуальная машина Erlang будет работать непрерывно. Изменения в тексте программы незамедлительно подгружаются в виртуальную машину без простоя. Для вселенной Rails характерно развёртывание в виде воркер-процессов. При обновлении кода запускаются новые воркеры и уничтожаются старые, а чтобы справиться с простоем, старые запросы продолжают свою работу в старых воркерах, пока те не будут уничтожены, в то время как новые запросы помещаются в новые воркеры (см. Phusion Passenger, Puma и Unicorn). В последнее время популярно развёртывание Rails-приложений в качестве Docker-контейнеров, которые сами по себе являются абсолютно самодостаточными и изолированными от ОС хостинга процессами.

Разворачивать Phoenix-приложения в Docker-контейнерах не возбраняется, но если выбрать этот путь, то все преимущества незамедлительного обновления кода в виртуальной машине Erlang и отсутствия простоя сойдут на нет.

План действий

Для получения успешного результата необходимо помнить, что развёртывание должно происходить в определённом порядке. Мой личный опыт был не слишком удачным. Мне хотелось получить всё и сразу: я начал с edeliver, после парочки неудачных попыток почитал кое-что о релизах, потом открыл для себя distillery — новейший инструмент для создания релизов. Последний шаг занял у меня достаточно много времени, так как я был далёк от понимания центральной идеи edeliver — идеи релизов.

Полагаю, у вас уже должны быть установлены Erlang, Elixir, NodeJS и NPM, но если это не так, то следуйте этой инструкции.

Итак, план:

  1. Создать новое Phoenix-приложение.
  2. Создать релиз distillery.
  3. Провести локальное тестирование релиза.
  4. Подготовить ОДИН сервер в облаке. Сегодня никаких Erlang-кластеров :)
  5. Развернуть релиз в продакшн, используя edeliver.
  6. Устранить ошибки.
  7. Что дальше?
Ну что, приступим?
© 2017 / Россия Любые мысли и вопросы пишите на elixir@wunsh.ru.