CONTAINER APPS · ПРАКТИЧЕСКИЙ ПРИМЕР
Публикуйте без страха: blue/green preprod ⇄ prod в один клик
Реальный workflow для команды, которая эксплуатирует боевое приложение на Managed Containers и хочет проводить долгие циклы деплоя/тестирования, не трогая production: собрать копию preprod, тестировать её сколько угодно на собственном субдомене, а затем мгновенно переключить на неё боевой домен — и так же быстро откатиться, если что-то пойдёт не так. Показано двумя способами: из панели управления и с помощью CLI cdnctl.
Сценарий
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 — в панели
- Откройте свой аккаунт CDN → вкладку Platforms → Managed Container Apps. Панель Blue/Green environments расположена прямо над Your apps. (Если этот аккаунт всё ещё работает через Pull/Push CDN и у него ещё нет приложений, сначала нажмите Enable Apps Alongside Current Delivery под Platforms.)

Панель Blue/Green environments над списком приложений - Выберите state и нажмите Create preprod from all apps (весь продукт) — или Create preprod (single app), если изменился только один сервис.

Выберите state, затем «Create preprod from all apps» (весь проект) — или создайте его для одного приложения - Приложение(-я) preprod появляются в паре с prod в рамках одного проекта (каждое на своём субдомене). Деплойте и тестируйте их сколько нужно — production продолжает обслуживать трафик нетронутым.

Проект с его prod- и preprod-приложениями, а также Promote / Rollback для всего проекта - Когда всё готово, нажмите Promote (whole project) → prod. Каждый боевой домен переключается на свою копию preprod за секунды.

Promote (whole project) переносит каждый боевой домен на его копию preprod - Если что-то не так, нажмите 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.