Перейти к основному содержимому

Окружения, preview и production

Главная идея

У проекта один стабильный production-адрес — apex <org>-<project>.layero.ru. Любые ветки и CLI-загрузки получают временные preview-ссылки на 24 часа. Что именно отдаёт apex — указывает явный production-pointer, который двигается либо автоматически (push в default-ветку), либо вручную (промоут из UI/CLI).

Это Vercel-style: «один production, много preview». Каждая ветка — это полноценное окружение со своей историей деплоев, своим preview-URL и своими настройками, но только один из них одновременно работает по apex'у.

Окружение = ветка

Push в любую ветку создаёт окружение с собственной историей сборок. У окружения есть:

  • branch_name — имя git-ветки (или cli для архивных загрузок)
  • свой preview-URL <org>-<project>-<branch>.preview.layero.ru (24 ч TTL)
  • active_deploy_id — последний успешный билд этой ветки

CLI-деплои без --branch приземляются в псевдо-ветку cli.

Адреса

Layero выдаёт три типа URL — для разных нужд:

URLКогда работаетСрок жизниЗачем
<org>-<project>.layero.ruчерез 5–15 мин после первого деплояпока живёт проектProduction apex — то, что показываете пользователям
<org>-<project>-<branch>.preview.layero.ruсразу после успешного билда ветки24 часа после прогреваPreview ветки — для проверки и шеринга
<org>-<project>-<branch>-<sha7>.preview.layero.ruсразу после ready24 часаPer-deploy URL — конкретный коммит зафиксирован

<sha7> — первые 7 hex-символов commit SHA.

Production apex

Канонический адрес проекта. Один на проект. Покрыт per-host LE-сертификатом от YC CDN, прогревается 5–15 минут при первом создании. Дальше живёт без перерывов — переключение между деплоями идёт через указатель production_deploy_id, без перерегистрации hostname'а.

Apex отдаёт тот деплой, на который указывает production_deploy_id. Этот указатель двигают:

  • Auto-promote: успешный push в default-ветку → apex автоматически переключается на новый билд (включено по умолчанию, выключается на странице Settings проекта).
  • Manual promote: кнопка «Promote» в UI или layero promote из CLI — на любой ready-деплой любой ветки.
  • Rollback: одна кнопка «Откатить» возвращает apex на предыдущий production-деплой (атомарный swap pointer'а, см. ниже).

Preview-URL веток

Для каждой ветки (и для CLI-загрузок) выдаётся стабильный URL вида <org>-<project>-<branch>.preview.layero.ru. Покрыт нашим wildcard-сертификатом *.preview.layero.ru на VM-edge — минуя YC CDN, чтобы не съедать слоты CDN-shard'а и не платить за выпуск per-host сертификата на каждую feature-ветку.

Через 24 часа после первого успешного деплоя ветки preview-URL перестаёт работать (отдаёт 404). Это сделано чтобы:

  • Не оставлять старые demo-ссылки навсегда (legal / staleness)
  • Освобождать ресурсы platform'ы от давно заброшенных feature-веток

Если 24 часа мало — закрепите preview через UI («Pin preview» на странице окружения), TTL продлится до явного Unpin.

Per-deploy URL

<org>-<project>-<branch>-<sha7>.preview.layero.ru показывает конкретный коммит — полезно когда:

  • Нужно зашерить QA конкретный билд, не зависящий от последующих push'ей
  • Сравнить две версии бок о бок

Сам URL — это просто preview-форма с sha-суффиксом; резолвер снимает sha и находит env. После 24 ч TTL ветки — тоже перестаёт работать.

Production-pointer (V071)

Это и есть «новая логика определения доменов». Раньше каждая ветка получала свой канонический домен на YC CDN — это плохо масштабировалось (cap на проекты в одном CDN-resource'е) и плохо матчилось с production-флоу (никто не хотел чтобы любая feature-ветка автоматом становилась прод). Сейчас:

projects.production_deploy_id ──→ deploys (конкретный билд)


environments (любая ветка)

Apex <org>-<project>.layero.ru всегда отдаёт именно этот deploy_id — независимо от того, на какой ветке он был собран.

Auto-promote (по умолчанию вкл)

При успешном push'е в default-ветку (main обычно) указатель автоматически переключается. Это сохраняет «push to main = ship to prod»-флоу для соло-проектов.

Когда команда растёт — выключите auto-promote в Settings проекта. Тогда каждый promote становится явным кликом — для предотвращения случайных production-релизов.

Manual promote

Из UI: кнопка «Promote to production» на странице любого ready-деплоя.

Из CLI:

# promote последнего ready-деплоя default-ветки
layero promote

# promote конкретного деплоя по SHA или ID
layero promote --deploy=a3f9c2b
layero promote --deploy=550e8400-e29b-41d4-a716-446655440000

# выкатить из dev-ветки сразу в production одной командой
layero deploy --branch=staging --promote

Каждый promote логируется в promote_events — кто, когда, какой деплой, через какой канал (UI / CLI / auto). История доступна в дашборде.

One-click rollback

При каждом promote'е Layero сохраняет предыдущий production-деплой в previous_production_deploy_id. Кнопка «Откатить production» делает атомарный swap двух полей — apex моментально (через CDN edge cache propagation ~30–60 сек) возвращается на прошлый рабочий билд.

layero promote --rollback

Rollback стабильный: вызвав его дважды, вернётесь к исходному состоянию (ping-pong).

Что показывает UI

На странице проекта Production card — то, что сейчас отдаёт apex:

  • Хост: <org>-<project>.layero.ru (один и тот же всегда)
  • Содержание: скриншот текущего production-деплоя
  • Бейдж ветки: production напротив той ветки, чей деплой сейчас pinned

В списке веток ниже — все остальные с их preview-URL и собственным статусом.

Coming Soon

Когда у проекта никогда не было успешного production-деплоя (только что создан, default-ветка не собралась, ещё не запушили ничего), apex показывает страницу «Сайт скоро появится» вместо 404 — чтобы зашаренная ссылка выглядела ожидающе, а не сломанно.

То же самое — для preview-URL ветки, build которой ещё в полёте (нет ready-деплоя для этой ветки).

Передача между членами команды

Preview-ссылка <org>-<project>-<branch>.preview.layero.ru — это публичный URL (если не включена site-auth). Шерится в любой чат / комментарий PR.

Канонический apex — тоже публичный, но это production: его показывают пользователям, а не QA. Promote — это release-action, делайте осознанно.