Spec-Zone.ru › Phoenix

Развертывание на 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.

Запуск нескольких экземпляров

Есть два способа запустить несколько экземпляров.

  1. Масштабировать приложение, запустив несколько экземпляров в одном регионе.
  2. Добавить экземпляр в другой регион (несколько регионов).

Для начала рассмотрим исходную конфигурацию с одним развертыванием.

$ 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, чтобы найти решения и задать вопросы.

← Предыдущая страница Развертывание с помощью релизов
Следующая страница → Развертывание на Gigalixir

Пакет Hex Предварительный просмотр Hex (текущий файл) Скачать версию ePub

Создано с помощью ExDoc (v0.40.3) для языка программирования Elixir

© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/fly.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API