ДокументацияДеплоиКак работают деплои

Деплой в Muerte Cloud

Каждый пуш в отслеживаемую ветку создаёт новый атомарный релиз. Здесь — как деплой проходит от начала до конца: стадии пайплайна, выкатка, откат и остановка.

Muerte Cloud может деплоить сервис автоматически на каждый коммит либо по запросу — из панели. Web-сервисы, приватные сервисы, фоновые воркеры и cron-задачи обновляются без простоя, если к сервису не подключён постоянный диск.

Каждый деплой виден в реальном времени на вкладке Deploys: логи сборки и рантайма, SHA коммита, длительность и статус в одном месте.

Автоматические деплои#

При создании сервиса вы привязываете его к ветке репозитория GitHub, GitLab или Bitbucket. По умолчанию любой пуш или мерж в эту ветку пересобирает и передеплоивает сервис.

Для авто-деплоев нужен подключённый Git-провайдер. Сервисы, которые берут готовый Docker-образ или публичный Git URL, деплоятся вручную.

Настройка авто-деплоев

Поведение меняется на вкладке Settings сервиса:

FieldDescription
По коммитуДеплой сразу, как изменение попало в отслеживаемую ветку. По умолчанию для новых сервисов.
После прохождения CIЖдать завершения всех CI-проверок коммита. Деплой только если все прошли успешно.
ВыключеноБез авто-деплоев. Каждый релиз запускается вручную из панели.

Пропуск коммита

Некоторые коммиты — правки README, комментарии — не нужно катить. Добавьте стоп-фразу в сообщение коммита, и Muerte Cloud запишет событие без запуска сборки:

bash
git commit -m "[skip deploy] tighten copy in README"

Допустимые фразы: [skip deploy], [deploy skip], [skip ci].

Ручные деплои#

Запустить релиз вне git-push можно и вручную — на вкладке Deploys: выберите последний коммит, конкретный SHA, или соберите заново с очисткой кэша.

Фиксация конкретного коммита
Деплой конкретного SHA из панели автоматически отключает авто-деплои — иначе следующий пуш перезапишет зафиксированный релиз.

Стадии деплоя#

Каждый деплой проходит один и тот же пайплайн из двух стадий:

  1. 1
    Команда сборки
    Ставит зависимости и создаёт артефакты. Выполняется на отдельных build-мощностях — всё, что записано в файловую систему, переносится дальше только внутри образа.
  2. 2
    Команда запуска
    Поднимает процесс на новом инстансе. Как только он становится здоровым, трафик переключается с предыдущего.
Важно
Если какая-то стадия падает или уходит в таймаут, деплой отменяется и предыдущий релиз продолжает обслуживать трафик. Таймауты: build 120 мин, start 15 мин.

Примеры команд сборки

РантаймТипичная команда сборки
Node.jsnpm ci · pnpm install --frozen-lockfile · bun install
Pythonpip install -r requirements.txt · poetry install · uv sync
Rubybundle install
Gogo build -o app ./cmd/server
Rustcargo build --release
Elixirmix deps.get --only prod && mix compile
Dockerкоманда сборки не нужна — используется Dockerfile или готовый образ

Примеры команд запуска

РантаймТипичная команда запуска
Node.jsnode dist/index.js · npm start
Pythongunicorn app.wsgi --bind 0.0.0.0:8080
Rubybundle exec puma -b tcp://0.0.0.0:8080
Go./app
Rust./target/release/app
Elixirmix phx.server
DockerCMD из Dockerfile, можно переопределить в сервисе

Управление деплоями#

Пересекающиеся деплои

Одновременно у сервиса выполняется только один деплой. Если новый деплой запускается во время текущего, Muerte Cloud может подождать (завершить текущий и сразу перейти к самому свежему, пропустив промежуточные) или вытеснить (отменить текущий и начать новый). По умолчанию — подождать; меняется в настройках воркспейса.

Отмена деплоя

Кнопка Cancel deploy на вкладке Deploys прерывает текущую сборку. Если сзади стоит другой деплой, он начнётся сразу.

Перезапуск сервиса

Перезапуск — это особый ручной деплой: тот же коммит, те же переменные, новый инстанс. Поскольку поднимается новый инстанс и подменяет старый, перезапуск проходит без простоя, как обычный деплой. Учтите: перезапуск не подхватывает недавние правки переменных окружения — для них нужен полноценный деплой.

Откат

Каждая успешная сборка сохраняется как точка отката, поэтому вернуть сервис к прошлой версии можно со вкладки Deploys без пересборки. Подробности — в разделе Откаты.

Концепции деплоя#

Эфемерная файловая система

По умолчанию файловая система сервиса эфемерна: всё, что записано в рантайме, теряется при следующем деплое или перезапуске. Чтобы сохранять данные между релизами, используйте управляемые Postgres или Key-Value либо подключите постоянный диск по конкретному пути монтирования.

Деплои без простоя

Когда новая версия успешно собрана, Muerte Cloud поднимает новый инстанс рядом с текущим. Старый продолжает обслуживать все запросы, пока новый не пройдёт health-check, после чего edge переключает трафик одним шагом.

  1. Сборка новой версии. Если сборка падает, деплой отменяется и текущий инстанс продолжает работу.
  2. Поднимается новый инстанс рядом с текущим.
  3. Ожидание успешного health-check нового инстанса.
  4. Переключение трафика на новый инстанс; старый дообрабатывает текущие запросы.
  5. Через 60 секунд отправляется SIGTERM старому инстансу.
  6. Если он не завершился за отведённое время — SIGKILL.

Сервисы с несколькими инстансами повторяют шаги 2–6 по одному инстансу за раз. Если какой-то новый инстанс не становится здоровым, весь деплой отменяется и все реплики возвращаются к предыдущей версии. Постоянные диски отключают деплой без простоя: том безопасно держит открытым только один инстанс.

Корректная остановка

Когда пора останавливаться, процесс получает SIGTERM. Обработайте его: дообработайте текущие HTTP-запросы, завершите или верните в очередь задачи, закройте исходящие соединения и выйдите с нулевым кодом. По умолчанию на остановку даётся 30 секунд, можно увеличить до 300 секунд для каждого сервиса.

server.js
javascript
const server = app.listen(port, "0.0.0.0");

process.on("SIGTERM", () => {
  console.log("received SIGTERM, draining connections");
  server.close(() => process.exit(0));
});
Совет
Если сервис регулярно получает SIGKILL при выкатке, значит нет обработчика остановки или дообработка занимает больше отведённого времени. Увеличьте таймаут в настройках сервиса или ускорьте завершение, закрывая keepalive-соединения в начале обработчика.