NetrunНа главную

Сайты и приложения

Как выложить приложение на Elixir и Phoenix в интернет

· 5 мин чтения

Коротко

Приложение на Elixir и Phoenix выкладывается в интернет без аренды сервера: загрузите исходный код вместе с файлом mix.exs — платформа сама поставит зависимости, соберёт проект и выдаст публичную ссылку с HTTPS. Три условия, без которых Phoenix потом не отвечает по ссылке: слушать порт из переменной окружения PORT и адрес 0.0.0.0, задать секрет SECRET_KEY_BASE в переменных окружения и, если приложение запускается собранным релизом, явно включить сервер переменной PHX_SERVER=true — иначе оно стартует без ошибок, но ничего не слушает. Папки _build и deps в архив класть не нужно: зависимости ставятся при сборке.

Обычно хостинг Elixir начинается с аренды сервера: поставить туда Erlang и Elixir нужных версий, собрать релиз, положить рядом базу, повесить перед приложением nginx, выпустить сертификат и добиться, чтобы всё это поднималось после перезагрузки. Сам Phoenix при этом обычно готов ещё в первый вечер, а публикация растягивается на несколько выходных, никак не связанных с кодом.

В Netrun это выглядит иначе: вы загружаете папку с исходным кодом, платформа видит в корне mix.exs, ставит зависимости, собирает проект и выдаёт публичную ссылку с HTTPS. Ни сервера, ни nginx, ни ручного сертификата. Ниже — шесть шагов от папки с кодом до рабочей ссылки и три места, на которых спотыкаются именно проекты на Elixir.

  1. Оставьте в архиве исходники и mix.exs#

    В корне проекта должен лежать файл mix.exs — по нему платформа понимает, что перед ней Elixir, и ставит зависимости; рядом полезно оставить mix.lock, чтобы версии библиотек совпали с вашими. Папки _build и deps в архив класть не нужно: это результат сборки на вашей машине, он только раздувает загрузку и иногда мешает. А вот папку priv/static оставьте как есть: там лежат иконка, robots.txt и картинки, и если вы уже собрали стили и скрипты, они уедут вместе с кодом и точно окажутся на месте.

  2. Читайте порт из переменной окружения#

    Порт задаёт платформа и передаёт его в переменной окружения PORT, а слушать нужно адрес 0.0.0.0, а не localhost. На практике это одна правка в config/runtime.exs: взять порт через System.get_env("PORT") и передать в настройки эндпоинта вместе с ip: {0, 0, 0, 0}. Захардкоженный 4000 — причина номер один, по которой ссылка потом не открывается. Важно, что читать окружение нужно именно в config/runtime.exs: файл config/prod.exs выполняется во время сборки, и значений секретов там ещё нет.

  3. Задайте SECRET_KEY_BASE в секретах#

    В боевом режиме Phoenix не стартует без секрета SECRET_KEY_BASE — им подписываются сессии и куки. Сгенерируйте значение командой mix phx.gen.secret и отдайте его платформе: при настройке проекта Netrun спросит секреты и подставит их в переменные окружения в зашифрованном виде, в архиве и репозитории они лежать не будут. Если Phoenix собирает абсолютные ссылки и письма, после первой публикации добавьте туда же адрес проекта в переменную PHX_HOST — иначе в ссылках останется localhost.

  4. Включите сервер, если приложение запускается релизом#

    Это самая обидная ловушка Elixir-проектов. Когда приложение запускается собранным релизом, а не командой mix phx.server, генераторы Phoenix оставляют в config/runtime.exs условие: веб-сервер включается только при заданной переменной PHX_SERVER. Без неё приложение честно стартует, в логах нет ни одной ошибки, но никто не слушает порт и ссылка отдаёт пустоту. Добавьте PHX_SERVER=true в секреты проекта: команде mix phx.server эта переменная не мешает, а релиз с ней начинает отвечать.

  5. Решите, где живут база и данные#

    Отдельной услуги «база данных» на платформе нет, поэтому есть два рабочих пути: взять внешнюю базу или поднять PostgreSQL соседним сервисом в своём файле docker-compose — в одном проекте их может быть до пяти. Строку подключения в обоих случаях держите в секретах, в переменной DATABASE_URL, а не в конфиге. Миграции Ecto удобнее применять при старте приложения: доступа по SSH внутрь контейнера и терминала в кабинете нет, отдельную команду выполнить негде. Файлы, которые приложение записывает само, сохраняйте в постоянную папку /data — обычные файлы рядом с кодом при следующей публикации создаются заново.

  6. Загрузите код и заберите ссылку#

    Принесите проект ZIP-архивом или импортом репозитория с GitHub, в том числе приватного. Ставить Erlang и Elixir где-либо и собирать релиз самому не нужно, всё происходит на нашей стороне; стили и скрипты собираются при публикации, если в mix.exs есть стандартный алиас assets.deploy из генераторов Phoenix. Первая сборка занимает больше времени, чем обновление: зависимости компилируются с нуля. Логи и статус публикации видны в кабинете в реальном времени, а когда приложение поднялось, вы получаете публичную ссылку с HTTPS.

Итог: сайт или API на Phoenix открывается по обычной ссылке, которую можно отправить кому угодно, без аренды сервера и настройки сертификатов. На бесплатном тарифе доступен один проект, и сайт на нём засыпает при простое, а просыпается сам, когда кто-то открывает ссылку — первый заход после паузы будет чуть медленнее. Если приложение должно отвечать без задержек круглосуточно или к нему нужен свой домен, подойдёт тариф Pro; актуальные цены и лимиты видны в кабинете. Попробовать Netrun.

Частые вопросы

Нужно ли собирать релиз через mix release перед загрузкой?

Нет, загружайте исходный код: зависимости ставятся и проект собирается на нашей стороне по mix.exs. Ставить Erlang и Elixir у себя и выполнять команды сборки не требуется. Если у вас уже есть свой Dockerfile, который собирает релиз, платформа возьмёт его вместо автоматической сборки — тогда не забудьте про переменную PHX_SERVER.

Почему Phoenix запустился, а сайт не открывается?

Чаще всего приложение слушает не то место: порт прописан в коде числом 4000 вместо переменной PORT или указан адрес localhost вместо 0.0.0.0. Вторая частая причина — запуск релизом без переменной PHX_SERVER: тогда приложение работает, но веб-сервер внутри него выключен, и ошибок в логах не будет. Третья — чтение настроек в config/prod.exs вместо config/runtime.exs: этот файл выполняется при сборке, когда секретов ещё нет.

Где взять SECRET_KEY_BASE и куда его положить?

Значение генерируется командой mix phx.gen.secret на вашем компьютере. Класть его в код или в конфиг, который едет в репозиторий, не нужно — передайте его платформе как секрет, и он подставится в переменную окружения SECRET_KEY_BASE в зашифрованном виде. Тот же секрет подписывает сессии, поэтому при его смене все пользователи разлогинятся.

Как подключить PostgreSQL и применить миграции Ecto?

Базу берут внешнюю или поднимают соседним сервисом в своём файле docker-compose, а строку подключения передают секретом в переменной DATABASE_URL. Миграции удобнее всего применять при старте приложения — например, стандартным модулем Release из генераторов Phoenix, который вызывается перед запуском. Отдельно выполнить команду негде: доступа по SSH внутрь контейнера и терминала в кабинете нет.

Работает ли LiveView?

Да, постоянное соединение LiveView проходит через выданную ссылку без дополнительной настройки — отдельно включать поддержку вебсокетов не нужно. Учитывайте только бесплатный тариф: сайт засыпает при простое, и открытая вкладка переподключится сама, когда следующий заход его разбудит. Если разрывов быть не должно, подойдёт тариф Pro с работой без простоев.

Можно ли запустить фоновый воркер на Elixir без сайта?

Да, приложение без веб-части тоже запускается — например, обработчик очереди на Oban или собственный процесс с расписанием внутри. Отдельного планировщика задач на платформе нет, поэтому расписание делайте внутри приложения. На бесплатном тарифе такие проекты не засыпают, но и работают ограниченное время: им даётся три дня, после чего проект выключается, а код, настройки и секреты остаются на месте.

Какие языки и технологии поддерживаются?

Python, Node.js, Go, Rust, Ruby, PHP, Java, .NET, Deno, Bun, Elixir, статические сайты и bash-скрипты. Можно принести свой Dockerfile или docker-compose, но чаще стек определяется по коду автоматически.

Нужен ли свой сервер или VPS?

Нет. Netrun разворачивает проект на своих серверах. Не нужно арендовать VPS, настраивать systemd и nginx или продлевать сертификаты — всё это работает за вас.

Почему мой сайт иногда засыпает?

На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.

Как обновить код уже опубликованного проекта?

Откройте проект и загрузите новую версию или обновите его из GitHub. Ссылка останется прежней, а данные сохранятся, если лежат в постоянном хранилище — папке /data или томе вашего compose-файла.

Запустите свой проект

Загрузите код, ответьте на пару вопросов — и получите рабочую ссылку. Есть бесплатный тариф

Попробовать Netrun
Все статьи блога