Loading...

CONTAINER APPS · ПРАКТИЧЕСКИЙ ПРИМЕР

Публикуйте без страха: blue/green preprod ⇄ prod в один клик

Реальный workflow для команды, которая эксплуатирует боевое приложение на Managed Containers и хочет проводить долгие циклы деплоя/тестирования, не трогая production: собрать копию preprod, тестировать её сколько угодно на собственном субдомене, а затем мгновенно переключить на неё боевой домен — и так же быстро откатиться, если что-то пойдёт не так. Показано двумя способами: из панели управления и с помощью CLI cdnctl.

← Назад к Platform Help

Сценарий

ajansspor.com работает на Managed Containers (боевое container app + управляемый MySQL). Команда хочет тестировать значительное изменение несколько дней, а затем выйти в прод за секунды с гарантированным мгновенным откатом. При blue/green мы никогда не редактируем работающее prod-приложение на месте: клонируем его в окружение preprod, тестируем там, затем переносим боевой домен.

  • prod (синий) — боевое приложение, обслуживающее ajansspor.com.
  • preprod (зелёный) — клон, доступный на собственном субдомене ca-*.cdn.com.tr.
  • Promote переносит ajansspor.com с prod на preprod за секунды, без простоя.
  • Rollback переносит его обратно — а для изменений данных восстанавливает автоматический снимок БД.

Когда продукт — это больше одного приложения (web + api + worker)

Большинство реальных продуктов — это стек, а не один контейнер. Blue/green работает со всем стеком как с единым целым: проект — это набор приложений в вашем аккаунте, и одно действие клонирует, промоутит или откатывает все их вместе.

  • Create preprod from all apps клонирует каждое prod-приложение (web, api, worker, …) в парную копию preprod в рамках одного проекта.
  • Связи между приложениями перенастраиваются автоматически — если web обращается к api, то preprod-web обращается к preprod-api. Стек preprod самодостаточен и никогда не ссылается обратно на production.
  • Promote (whole project) одновременно переносит боевой домен каждого приложения на его копию preprod; Rollback (whole project) отменяет всё сразу. Изменение, затрагивающее несколько сервисов, выходит в прод — или отменяется — как единое целое.
  • Изменился только один сервис? Используйте Create preprod / Promote для одного приложения — только для него.

Как это использовал бы videoonly: его приложения (фронтенд, API, воркеры) находятся в одном аккаунте. Вы бы нажали Create preprod from all apps (состояние shared для повторного использования боевой БД/Redis или clone, чтобы протестировать миграцию на скопированных данных), проверили весь стек на субдоменах ca-*, затем через Promote (whole project) перенесли каждое боевое имя хоста на новые версии за секунды — с Rollback (whole project) в качестве мгновенного пути к отступлению.

State: что preprod разделяет с prod

Это выбирается при создании preprod (--state / выпадающий список):

  • shared — preprod использует ту же управляемую БД/Redis и бакеты объектного хранилища, что и prod (через безопасные межприложенческие ссылки; без копирования). Лучший вариант для изменений кода/UI.
  • clone — preprod получает свой собственный управляемый MySQL с копией данных prod. Безопасно для изменений данных/схемы; данные prod не затрагиваются.
  • isolated — preprod стартует с чистого листа.

При Promote платформа сначала делает автоматический снимок БД, так что Rollback может откатить и данные тоже. Статика/медиа на постоянном томе могут быть общими (RWX), чтобы загрузки оставались согласованными.

Инструкция A — в панели

  1. Откройте свой аккаунт CDN → вкладку PlatformsManaged Container Apps. Панель Blue/Green environments расположена прямо над Your apps. (Если этот аккаунт всё ещё работает через Pull/Push CDN и у него ещё нет приложений, сначала нажмите Enable Apps Alongside Current Delivery под Platforms.)
    Панель Blue/Green environments над списком приложений
    Панель Blue/Green environments над списком приложений
  2. Выберите state и нажмите Create preprod from all apps (весь продукт) — или Create preprod (single app), если изменился только один сервис.
    Выберите state, затем «Create preprod from all apps» (весь проект) — или создайте его для одного приложения
    Выберите state, затем «Create preprod from all apps» (весь проект) — или создайте его для одного приложения
  3. Приложение(-я) preprod появляются в паре с prod в рамках одного проекта (каждое на своём субдомене). Деплойте и тестируйте их сколько нужно — production продолжает обслуживать трафик нетронутым.
    Проект с его prod- и preprod-приложениями, а также Promote / Rollback для всего проекта
    Проект с его prod- и preprod-приложениями, а также Promote / Rollback для всего проекта
  4. Когда всё готово, нажмите Promote (whole project) → prod. Каждый боевой домен переключается на свою копию preprod за секунды.
    Promote (whole project) переносит каждый боевой домен на его копию preprod
    Promote (whole project) переносит каждый боевой домен на его копию preprod
  5. Если что-то не так, нажмите Rollback (whole project) — трафик мгновенно возвращается к предыдущим приложениям (и восстанавливается снимок БД, сделанный перед promote). Кнопка Rollback появляется на панели после выполнения promote.

Скриншоты выше — реальные снимки работающей панели CDN.com.tr (Platforms → Managed Container Apps → Blue/Green environments).

Инструкция B — с cdnctl

Тот же процесс, полностью скриптуемый. Одно приложение:

# 1) Clone prod → preprod (shared add-ons; use --state clone for isolated DB+data)
cdnctl container apps create-preprod --account <uuid> --app <prod_app_uuid> --state shared

# 2) Deploy + test the preprod app on its own subdomain
cdnctl container apps deploy  --account <uuid> --app <preprod_app_uuid>
cdnctl container apps expose  --account <uuid> --app <preprod_app_uuid>
cdnctl container apps status  --account <uuid> --app <preprod_app_uuid>

# 3) Go live: move the production domain to preprod (instant, no downtime)
cdnctl container apps promote --account <uuid> --app <preprod_app_uuid>

# 4) If needed, roll back (traffic + pre-promote DB snapshot)
cdnctl container apps rollback-promotion --account <uuid> --app <prod_app_uuid>

Весь продукт (проект с несколькими приложениями) — администраторы/ops запускают это на сервере через artisan:

# Clone EVERY prod app in the account into a paired preprod (one project)
php artisan container-apps:env create-preprod --account <uuid> --all --state shared

# ... deploy & test each preprod app on its ca-* subdomain ...

# Promote the whole project (all production domains move together)
php artisan container-apps:env promote  --account <uuid> --project <project_uuid>

# Roll the whole project back (traffic + DB snapshots for every app)
php artisan container-apps:env rollback --account <uuid> --project <project_uuid>

Те же групповые действия доступны в панели (панель «Blue/Green environments»: Create preprod from all apps, Promote / Rollback (whole project)) и через клиентский API (POST …/platform/container/project/{create-preprod,promote,rollback}). Низкоуровневые строительные блоки: container-apps:switch-origin (перенос одного домена) и container-apps:db clone|snapshot|restore (операции с данными managed-MySQL).

Почему это безопасно

  • Production никогда не редактируется на месте — вы собираете и тестируете в отдельном приложении.
  • Мгновенно и обратимо — Promote/Rollback — это переключение владения доменом (секунды), а не пересборка.
  • Данные тоже обратимы — Promote автоматически делает снимок БД; Rollback его восстанавливает.
  • В рамках аккаунта / домена — DNS и TLS не затрагиваются; боевой сертификат остаётся на месте.

См. также руководство Blue/green environments.