MAATRIX / Блог / Blue-green деплой на VPS

Blue-green деплой на VPS

Блог MAATRIX · 2026-07-07

Blue-green держит две идентичные среды: одна принимает трафик, вторая обновляется. Переключение — одна правка в nginx, откат — такая же. Реализуем схему на одном VPS с прогревом и проверкой перед свитчем.

Идея blue-green

['Есть две среды — blue и green — с одинаковым кодом и конфигом, но разными портами. В любой момент трафик идёт только в одну из них, вторая свободна для деплоя.', 'Цикл выката: обновляем неактивную среду, прогреваем и проверяем её, затем переключаем трафик. Если что-то не так — мгновенно возвращаем на прежнюю среду, ведь она всё это время работала.', 'Blue-green держит одновременно две копии приложения, поэтому RAM нужно с запасом. На тарифах MAATRIX легко взять конфигурацию, где обе среды помещаются без свопа, а NVMe ускоряет прогрев кэшей после старта. Если приложение уйдёт в своп во время выката, отклик просядет ровно в момент переключения — а именно этого blue-green и призван избежать.', 'Главное отличие от симлинк-деплоя в том, что старая версия продолжает работать, а не просто лежит на диске. Откат мгновенный, потому что откатываться некуда идти — прежняя среда уже поднята и готова принять трафик обратно.']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для blue-green деплоя

Две среды в docker-compose

['Опишем два стека, различающихся только именем и внешним портом. blue слушает 8001, green — 8002.', '
# docker-compose.blue.yml\nservices:\n  app-blue:\n    image: myapp:${TAG}\n    ports: [ "127.0.0.1:8001:8000" ]\n    environment:\n      COLOR: blue\n\n# docker-compose.green.yml\nservices:\n  app-green:\n    image: myapp:${TAG}\n    ports: [ "127.0.0.1:8002:8000" ]\n    environment:\n      COLOR: green
', '
TAG=v42 docker compose -f docker-compose.green.yml up -d
']

Переключение через nginx

['Активный апстрим держим в отдельном подключаемом файле. nginx читает upstream_active.conf, а скрипт деплоя просто меняет его содержимое и делает reload.', '
# /etc/nginx/conf.d/upstream_active.conf\nupstream active {\n    server 127.0.0.1:8001;   # сейчас blue\n}\n\n# основной конфиг\nserver {\n    location / { proxy_pass http://active; }\n}
', 'Переключение на green — заменить порт и перечитать конфиг без разрыва соединений:', "
echo 'upstream active { server 127.0.0.1:8002; }' \\\n  > /etc/nginx/conf.d/upstream_active.conf\nnginx -t && systemctl reload nginx
"]

Прогрев и проверка перед свитчем

['Никогда не переключайте трафик на непроверенную среду. Сначала дождитесь, пока green ответит на healthcheck, и прогрейте основные эндпоинты.', '
#!/bin/bash\nset -e\nNEW=8002\n# ждём готовности\nfor i in $(seq 1 20); do\n  curl -fs http://127.0.0.1:$NEW/health && ready=1 && break\n  sleep 1\ndone\n[ "$ready" = 1 ] || { echo "green не поднялся"; exit 1; }\n# прогрев\ncurl -s http://127.0.0.1:$NEW/ > /dev/null\ncurl -s http://127.0.0.1:$NEW/api/status > /dev/null\n# переключаем\necho "upstream active { server 127.0.0.1:$NEW; }" \\\n  > /etc/nginx/conf.d/upstream_active.conf\nnginx -t && systemctl reload nginx\necho "switched to $NEW"
']

Мгновенный откат

['Старая среда после переключения не гасится сразу — держите её живой ещё несколько минут. Если на новой всплыл баг, откат — это возврат прежнего порта.', "
echo 'upstream active { server 127.0.0.1:8001; }' \\\n  > /etc/nginx/conf.d/upstream_active.conf\nnginx -t && systemctl reload nginx
", 'Убедившись, что новая среда стабильна, старую можно остановить, освободив ресурсы:', '
docker compose -f docker-compose.blue.yml down
', 'Хорошая практика — держать между переключениями «карантинную» паузу в 5–10 минут и следить за метриками ошибок новой среды. Если процент 5xx или время отклика поползли вверх, откат делается до того, как проблему заметят пользователи. Автоматизировать это можно скриптом, который сравнивает частоту ошибок и сам возвращает трафик при превышении порога.']

Частые ошибки

['
  • Общая БД с несовместимой схемой — обе среды ходят в одну базу, миграция ломает старую. Делайте совместимые миграции.
  • Погасили старую среду сразу — откатываться некуда. Держите её живой ещё несколько минут.
  • Переключились без healthcheck — увели трафик на упавшую среду.
  • Порты наружу — 8001/8002 должны слушать только 127.0.0.1, не публичный интерфейс.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для blue-green деплоя

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

Чем blue-green отличается от canary?

Blue-green переключает 100% трафика разом. Canary направляет сначала небольшую долю на новую версию и наращивает её постепенно.

Blue-green требует в два раза больше ресурсов?

На время выката — да, работают обе среды. Поэтому берите VPS с запасом RAM, чтобы две копии помещались одновременно.

Как быть с общей базой данных?

База одна на обе среды. Меняйте схему обратно-совместимо, чтобы и старый, и новый код работали с ней одновременно.