Развертывание на Fly.io
Исходный кодОсновная цель этого руководства — запустить приложение Phoenix на Fly.io.
Fly.io подготовила собственное руководство по Elixir/Phoenix: Fly.io/docs/elixir/getting-started/. Мы оставим это руководство, но за самой актуальной информацией обращайтесь к ним!
Что нам понадобится
Для этого руководства нам понадобится только работающее приложение Phoenix. Если вам нужно простое приложение для развертывания, следуйте руководству «Начало работы».
Можно просто выполнить:
$ mix phx.new my_app
Разделы
Разобьем этот процесс на несколько шагов, чтобы отслеживать ход работы.
- Установка CLI Fly.io
- Регистрация в Fly.io
- Развертывание приложения на Fly.io
- Кластеризация приложения
- Дополнительные советы по Fly.io
- Полезные ресурсы Fly.io
Установка CLI Fly.io
Следуйте инструкциям здесь, чтобы установить Flyctl — интерфейс командной строки для платформы Fly.io.
Регистрация в Fly.io
Мы можем зарегистрировать учетную запись с помощью CLI.
$ fly auth signup
Или войти в систему.
$ fly auth login
Для большинства приложений Fly предлагает бесплатный тариф. При создании учетной записи требуется указать данные кредитной карты, чтобы предотвратить злоупотребления. Подробнее см. на странице тарифов.
Развертывание приложения на Fly.io
Чтобы сообщить Fly о вашем приложении, выполните fly launch в каталоге с исходным кодом. Это создаст и настроит приложение Fly.io.
$ fly launch
Команда проверит исходный код, обнаружит проект Phoenix и выполнит mix phx.gen.release --docker за вас! Она создаст для вас Dockerfile.
Команда fly launch задаст несколько вопросов.
- Вы можете задать имя приложения или сгенерировать случайное имя.
- Выберите организацию (по умолчанию —
personal). Организации позволяют пользователям Fly.io совместно использовать приложения и ресурсы. - Выберите регион для развертывания. По умолчанию выбирается ближайший регион Fly.io. Полный список регионов можно посмотреть здесь.
- Настроит для вас базу данных Postgres.
- Соберет Dockerfile.
- Развернет ваше приложение!
Команда fly launch также создала для вас файл fly.toml. В нем можно задать значения ENV и другие параметры конфигурации.
Хранение секретов на Fly.io
Возможно, вы захотите задать для приложения некоторые секреты.
Используйте fly secrets, чтобы настроить их.
$ fly secrets set MY_SECRET_KEY=my_secret_value
Повторное развертывание
Чтобы развернуть изменения приложения, используйте fly deploy.
$ fly deploy
Примечание. На компьютерах с Apple Silicon (M1) Docker выполняет кроссплатформенные сборки с помощью qemu, что не всегда работает. Если возникает ошибка сегментации, например такая:
=> [build 7/17] RUN mix deps.get --only => => # qemu: uncaught target signal 11 (Segmentation fault) - core dumped
Можно использовать удаленный сборщик Fly, добавив флаг --remote-only:
$ fly deploy --remote-only
Вы всегда можете проверить состояние развертывания:
$ fly status
Проверьте журналы приложения:
$ fly logs
Если все выглядит хорошо, откройте приложение на Fly:
$ fly open
Кластеризация приложения
Elixir и виртуальная машина Erlang обладают удивительной возможностью объединяться в кластер и беспрепятственно обмениваться сообщениями между узлами. В Phoenix уже предусмотрены все необходимые настройки — перед развертыванием нужно лишь задать соответствующие переменные среды.
Если для развертывания приложения вы использовали fly launch, эти переменные среды уже заданы. В противном случае откройте rel/env.ssh.eex и добавьте:
export ERL_AFLAGS="-proto_dist inet6_tcp"
export RELEASE_DISTRIBUTION="name"
export RELEASE_NODE="${FLY_APP_NAME}-${FLY_IMAGE_REF##*-}@${FLY_PRIVATE_IP}"
export ECTO_IPV6="true"
export DNS_CLUSTER_QUERY="${FLY_APP_NAME}.internal"
Первые три переменные среды обрабатываются Elixir и Erlang/VM:
-
ERL_AFLAGS— настраивает Erlang для использования IPv6 при распределенной работе -
RELEASE_DISTRIBUTION— настраивает именованные узлы Erlang -
RELEASE_NODE— назначает узлу имя на основе имени приложения Fly и ссылки на развертывание
Последние две переменные обрабатываются вашим config/runtime.exs:
-
ECTO_IPV6— подключение к базе данных с использованием IPv6 -
DNS_CLUSTER_QUERY— настраивает приложение для поиска других узлов с помощью указанного DNS-запроса
Дополнительные советы по Fly.io
Подключение оболочки IEx к работающему узлу
Elixir позволяет подключить оболочку IEx к работающему узлу в производственной среде.
Для этого необходимо выполнить несколько предварительных действий. Сначала нужно установить SSH-подключение к нашей машине на Fly.io.
На этом шаге для вашей учетной записи создается корневой сертификат, а затем выпускается сертификат.
$ fly ssh issue --agent
После настройки SSH откроем консоль.
$ fly ssh console Connecting to my-app-1234.internal... complete / #
Если все прошло гладко, вы подключены к оболочке на машине! Теперь нужно запустить удаленную оболочку IEx. Dockerfile для развертывания настроен так, чтобы помещать приложение в /app. Поэтому команда для приложения с именем my_app будет выглядеть так:
$ app/bin/my_app remote Erlang/OTP 23 [erts-11.2.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:1] Interactive Elixir (1.11.2) - press Ctrl+C to exit (type h() ENTER for help) iex(my_app@fdaa:0:1da8:a7b:ac4:b204:7e29:2)1>
Теперь у нас запущена оболочка IEx на узле! Можно безопасно отключиться, нажав CTRL+C, CTRL+C.
Запуск нескольких экземпляров
Есть два способа запустить несколько экземпляров.
- Масштабировать приложение, запустив несколько экземпляров в одном регионе.
- Добавить экземпляр в другой регион (несколько регионов).
Для начала рассмотрим исходную конфигурацию с одним развертыванием.
$ fly status ... Instances ID VERSION REGION DESIRED STATUS HEALTH CHECKS RESTARTS CREATED f9014bf7 26 sea run running 1 total, 1 passing 0 1h8m ago
Масштабирование в одном регионе
Увеличим количество экземпляров до двух в текущем регионе.
$ fly scale count 2 Count changed to 2
Проверив состояние, мы увидим результат.
$ fly status ... Instances ID VERSION REGION DESIRED STATUS HEALTH CHECKS RESTARTS CREATED eb4119d3 27 sea run running 1 total, 1 passing 0 39s ago f9014bf7 27 sea run running 1 total, 1 passing 0 1h13m ago
Теперь у нас есть два экземпляра в одном регионе.
Убедимся, что они объединены в кластер. В оболочке IEx можно спросить у подключенного узла, какие другие узлы ему видны.
$ fly ssh console -C "/app/bin/my_app remote"
iex(my-app-1234@fdaa:0:1da8:a7b:ac2:f901:4bf7:2)1> Node.list [:"my-app-1234@fdaa:0:1da8:a7b:ac4:eb41:19d3:2"]
Подсказка IEx показана, чтобы отображать IP-адрес узла, к которому мы подключены. Запрос Node.list возвращает другой узел. Наши два экземпляра подключены друг к другу и объединены в кластер!
Масштабирование в нескольких регионах
С помощью Fly легко развертывать экземпляры ближе к пользователям. Благодаря DNS пользователи направляются в ближайший регион, где расположено ваше приложение. Подробнее о регионах Fly.io можно прочитать здесь.
Вернемся к исходной конфигурации с одним экземпляром в sea — Сиэтле, штат Вашингтон (США), — и добавим регион ewr — Парсиппани, штат Нью-Джерси (США). Так экземпляры будут размещены на обоих побережьях США.
$ fly regions add ewr Region Pool: ewr sea Backup Region: iad lax sjc vin
Из состояния видно, что мы находимся только в одном регионе, поскольку задано количество экземпляров 1.
$ fly status ... Instances ID VERSION REGION DESIRED STATUS HEALTH CHECKS RESTARTS CREATED cdf6c422 29 sea run running 1 total, 1 passing 0 58s ago
Добавим второй экземпляр и посмотрим, как он развернется в ewr.
$ fly scale count 2 Count changed to 2
Теперь по состоянию видно, что у нас два экземпляра в двух регионах!
$ fly status ... Instances ID VERSION REGION DESIRED STATUS HEALTH CHECKS RESTARTS CREATED 0a8e6666 30 ewr run running 1 total, 1 passing 0 16s ago cdf6c422 30 sea run running 1 total, 1 passing 0 6m47s ago
Убедимся, что они объединены в кластер.
$ fly ssh console -C "/app/bin/my_app remote"
iex(my-app-1234@fdaa:0:1da8:a7b:ac2:cdf6:c422:2)1> Node.list [:"my-app-1234@fdaa:0:1da8:a7b:ab2:a8e:6666:2"]
Мы развернули два экземпляра приложения на западном и восточном побережьях Северной Америки и объединили их в кластер! Пользователи будут автоматически направляться на ближайший к ним сервер.
Платформа Fly.io поддерживает встроенное распределение, упрощая кластеризацию распределенных узлов Elixir в нескольких регионах.
Полезные ресурсы Fly.io
Открыть панель управления учетной записью
$ fly dashboard
Развернуть приложение
$ fly deploy
Показать состояние развернутого приложения
$ fly status
Получить доступ к журналам и просматривать их в реальном времени
$ fly logs
Увеличить или уменьшить масштаб приложения
$ fly scale count 2
Дополнительную информацию см. в документации Fly.io по Elixir.
В документации Fly.io рассматриваются такие темы, как:
Устранение неполадок
См. разделы «Устранение неполадок» и «Устранение неполадок в Elixir».
Посетите сообщество Fly.io, чтобы найти решения и задать вопросы.
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/fly.html