БесплатноБазовая интеграция с 1С в подарок при заказе интернет-магазина под ключ

Zero-downtime деплой на 1С-Битрикс: как выкатывать релизы без простоя

Zero-downtime деплой на 1С-Битрикс: переключение трафика между окружениями blue и green без простоя магазина

Релиз в пятницу вечером, «минутка технических работ» с заглушкой на сайте, звонок от владельца бизнеса «а почему магазин не работает» — знакомый сценарий для любой команды, которая деплоит 1С-Битрикс по старинке: остановили сайт, залили файлы, накатили миграции, включили обратно. На небольшом проекте пара минут простоя пройдёт незамеченной. На магазине с заказами каждую минуту и SLA перед оптовыми клиентами та же пара минут — это упущенная выручка, сорванный вебхук от платёжной системы и звонки в поддержку.

Zero-downtime деплой — это набор инженерных практик, при которых новая версия сайта выкатывается и проверяется, не затрагивая работающую версию, а переключение происходит так, что ни один пользовательский запрос не попадает в промежуток «сайта уже/ещё нет». Ниже — как адаптировать blue-green и rolling-стратегии к специфике 1С-Битрикс, где код и состояние (сессии, файлы, кэш) исторически тесно связаны с конкретным сервером. Материал основан на нашей практике автоматического zero-downtime деплоя и настройки CI/CD для проектов на 1С-Битрикс.

Коротко

  • Битрикс сложнее деплоить, чем безстейтовое приложение: сессии, загруженные файлы и композитный кэш по умолчанию привязаны к конкретному серверу.
  • Атомарная выкладка через симлинк на новый релиз убирает «рваное» промежуточное состояние даже на одном сервере.
  • Полноценный blue-green требует общего хранилища сессий/файлов и здоровой стратегии миграций базы (expand-and-contract).
  • Перед переключением трафика — health-check новой версии и прогрев композитного кэша, иначе первые посетители получат «холодные» медленные страницы.
  • Откат должен быть спроектирован заранее — как переключение симлинка или балансировщика обратно, а не как экстренное «давайте разбираться».

Почему Битрикс сложнее деплоить, чем безстейтовое приложение

В классическом безстейтовом веб-приложении деплой выглядит просто: поднять новый контейнер, убедиться, что он отвечает на запросы, переключить на него трафик, погасить старый. Проблема в том, что 1С-Битрикс исторически проектировался под другую модель — один сервер, на котором физически лежит и код, и загруженные файлы, и файловый кэш, и (по умолчанию) сессии PHP. Это удобно для небольшого проекта на одном сервере и превращается в источник багов, как только серверов или окружений становится больше одного.

Из этой особенности вытекают три практических следствия, с которыми нужно разобраться до первого zero-downtime релиза:

Важно: zero-downtime деплой на 1С-Битрикс — это не столько про сам процесс выкладки файлов, сколько про предварительную архитектурную работу: вынести из-под конкретного сервера всё, что раньше жило локально. Без неё любая стратегия переключения трафика будет давать сбои на живых пользовательских сессиях, даже если сервер технически ни на секунду не «падал».

Что такое zero-downtime деплой

Формально zero-downtime деплой — это выкладка новой версии приложения таким образом, что ни один входящий HTTP-запрос не получает ошибку соединения и не обрывается из-за самого факта деплоя. Разница с «быстрым» деплоем принципиальна: быстрый деплой минимизирует окно простоя (секунды вместо минут), а zero-downtime устраняет это окно как явление — переключение происходит на границе завершённых запросов, а не поверх работающего процесса.

Технически это достигается тем, что новая версия сайта поднимается и полностью готова к работе до того, как на неё пойдёт хоть один реальный пользовательский запрос. Старая версия продолжает обслуживать трафик всё это время. Переключение — это не «остановить старое, запустить новое», а «включить новое, убедиться, что оно работает, и только потом выключить старое».

Обычный деплой vs zero-downtime Обычный деплой Старая версия работает Простой Новая версия работает Zero-downtime деплой Старая версия обслуживает трафик Новая — готовится, без трафика Новая версия обслуживает трафик Переключение — на границе завершённых запросов, без окна недоступности
Схема: обычный деплой создаёт явное окно недоступности между остановкой старой версии и запуском новой; zero-downtime держит трафик на старой версии, пока новая не будет полностью готова.

Blue-green и rolling: чем отличаются стратегии

Есть две основные стратегии переключения без простоя, и они решают немного разные задачи.

Blue-green деплой. Существуют два полных, идентичных по составу окружения — условно «синее» и «зелёное». В любой момент времени одно из них активно (принимает боевой трафик), второе — простаивает или используется для подготовки следующего релиза. Новая версия выкатывается целиком во второе окружение, проходит проверки, и только после этого балансировщик или веб-сервер переключает весь трафик на него одним движением. Плюс — мгновенный и полный откат (переключить обратно), минус — нужно вдвое больше вычислительных ресурсов на время деплоя.

Rolling-деплой. Вместо двух полных окружений есть несколько узлов кластера, и новая версия выкатывается на них по одному: узел выводится из ротации балансировщика, обновляется, проходит проверку, возвращается в ротацию — и так по кругу, пока все узлы не обновятся. Плюс — не нужно держать вдвое больше ресурсов, минус — какое-то время старая и новая версия работают параллельно и обслуживают разных пользователей одновременно, что требует более строгой обратной совместимости кода и схемы базы данных на этот переходный период.

КритерийBlue-greenRolling
Ресурсы на время деплоя×2 (два полных окружения)Минимальный оверхед (по одному узлу)
Скорость откатаМгновенная (переключить обратно)Требует повторного rolling в обратную сторону
Параллельная работа старой/новой версииПрактически нет (переключение разом)Да, на время обновления всех узлов
Нужен веб-кластер из нескольких узловНе обязательно, достаточно двух окруженийДа, минимум 2–3 узла
Требования к обратной совместимости кодаНиже (переключение почти мгновенное)Выше (версии сосуществуют дольше)

Симлинк, rolling, blue-green — что выбрать

Между «просто перезаписать файлы на сервере» и полноценным blue-green есть промежуточный и очень практичный вариант для проекта на одном сервере или BitrixVM — атомарная выкладка через симлинк. Идея простая: каждый релиз разворачивается в отдельный каталог (/releases/2026-12-05-142300/), а рабочий каталог сайта — это символическая ссылка, которая одной атомарной операцией переключается на новый каталог релиза. Пока новый релиз разворачивается, тестируется зависимостями и прогревает кэш, старый продолжает обслуживать трафик из своего каталога — пользователи не видят никакого промежуточного «наполовину нового» состояния.

На практике зрелые проекты на 1С-Битрикс комбинируют подходы: симлинк-деплой на каждом узле веб-кластера плюс rolling-переключение между узлами — это даёт большую часть выгод blue-green без удвоения инфраструктуры. Подробнее про сам веб-кластер и балансировку — в статье о кластеризации и отказоустойчивости 1С-Битрикс.

Миграции базы данных на лету: expand-and-contract

Самое хрупкое место любого zero-downtime деплоя — не код, а данные. Пока переключение происходит, старая и новая версия кода могут какое-то время (даже доли секунды при blue-green, и куда дольше при rolling) работать с одной и той же базой данных. Если миграция схемы «разрушающая» — переименовала колонку, изменила тип данных несовместимо, удалила поле, — одна из версий кода в этот момент начинает падать с ошибками SQL.

Решение — паттерн expand-and-contract (расширение, затем сжатие), который разбивает любое изменение схемы на безопасные шаги:

  1. Expand — добавить новое, не трогая старое. Новая колонка, новая таблица, новый highload-блок добавляются рядом с существующими. Старый код их не видит и продолжает работать как раньше.
  2. Выкатить код, который пишет в оба места. Переходный релиз кода записывает данные и в старую, и в новую структуру одновременно — это даёт возможность откатиться на предыдущую версию кода в любой момент без потери данных.
  3. Перенести исторические данные фоновым скриптом. Миграция существующих записей из старого формата в новый выполняется отдельно от деплоя кода, без блокировки таблицы целиком, обычно порциями (батчами).
  4. Выкатить код, который читает только из нового места. Когда все данные перенесены и стабильно пишутся в новую структуру, следующий релиз кода перестаёт обращаться к старой.
  5. Contract — удалить старое отдельным релизом. Только когда точно нет кода, который зависит от старой колонки или таблицы (включая код на других узлах при rolling-деплое), её можно безопасно убрать.
Правило: ни одна миграция в рамках zero-downtime деплоя не должна одновременно удалять и добавлять несовместимые изменения в одном релизе. Разрушающее изменение — это всегда отдельный, более поздний релиз, выполняемый только после того, как весь трафик гарантированно обслуживается кодом, который уже не зависит от старой структуры.

Сессии, файлы и корзина: общее состояние между окружениями

Blue-green и rolling предполагают, что запрос одного и того же пользователя в любой момент может обслужить любое из работающих окружений. Это работает только если состояние пользователя не привязано к конкретному серверу.

Этот пункт по сути пересекается с тем, что требуется для веб-кластера как такового — не случайно обе задачи (масштабирование под нагрузку и zero-downtime деплой) опираются на одну и ту же архитектурную работу: вынести состояние из-под конкретного сервера в общий слой.

Прогрев композитного кэша перед переключением

Композитный режим 1С-Битрикс собирает статические HTML-снимки страниц, чтобы отдавать их без обращения к PHP и базе данных. На новом окружении сразу после деплоя этих снимков ещё нет — первые запросы вынуждены собирать страницу «вживую», что заметно медленнее. Если переключить трафик на неразогретое окружение резко и полностью, первая волна пользователей получит просевшую по скорости версию сайта — формально без простоя, но с деградацией, которую легко перепутать с ним по ощущениям.

Практическое решение — прогревать композитный кэш управляемо, до переключения боевого трафика: пройтись краулером или скриптом по ключевым страницам (главная, топ-категории каталога, популярные карточки товаров) на новом окружении, пока оно ещё не принимает реальных пользователей, и только затем переключать балансировщик. На рolling-деплое то же самое имеет смысл делать на каждом обновлённом узле перед возвратом его в ротацию.

Прогрев кэша перед переключением Скрипт прогрева Главная страница Топ-категории Популярные карточки Новое окружение без боевого трафика, кэш прогревается Трафик переключается только после того, как ключевые страницы уже отдаются из тёплого композита
Схема: скрипт прогрева обходит главную страницу, топ-категории и популярные карточки на новом окружении до того, как балансировщик направит на него боевой трафик.

Health-check перед переключением трафика

Готовность нового окружения нельзя определять фактом «процесс запустился» — нужна содержательная проверка, что сайт реально работает: отдаёт корректный HTML на ключевых страницах, подключается к базе данных, видит распределённый кэш и хранилище сессий, а не просто слушает порт. Практический набор проверок перед переключением обычно включает: HTTP-статус 200 на главной и нескольких страницах каталога, отсутствие ошибок в логе PHP за время прогрева, доступность подключения к базе и к Redis/memcached, и — отдельно — успешное выполнение «смоук-теста» ключевого сценария (например, добавление товара в корзину через тестовый запрос).

Health-check должен быть частью автоматизированного пайплайна, а не ручной проверкой «глазами полистал — вроде работает». Ручная проверка не масштабируется на частые релизы и пропускает регрессии, которые не бросаются в глаза с первого взгляда.

Откат за секунды: как его спроектировать заранее

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

Хорошая практика — держать в пайплайне отдельную, заранее протестированную команду отката, которая ничем не отличается по механике от деплоя, кроме направления переключения. Тогда решение «откатываемся» в момент инцидента не требует придумывать процесс на ходу под давлением времени.

Реализация в 1С-Битрикс: пайплайн деплоя

На практике весь процесс — от коммита в git до переключения боевого трафика — управляется CI/CD-пайплайном, а не ручными командами инженера на сервере. Типичный дашборд такого пайплайна для 1С-Битрикс выглядит примерно так:

CI/CD → Деплой: release-2026-12-05-142300 1. Сборка релиза в /releases/2026-12-05-142300 Готово 2. Миграции базы (expand, обратно совместимо) Готово 3. Прогрев композитного кэша (48 URL) Готово 4. Health-check и смоук-тест корзины Выполняется… 5. Переключение трафика на новый релиз В очереди Откат: одна кнопка, вернуть на предыдущий релиз
Схема: пайплайн деплоя выполняет сборку релиза, безопасные миграции, прогрев кэша и health-check как отдельные проверяемые этапы, прежде чем переключить боевой трафик; кнопка отката всегда под рукой.

Типовой pipeline zero-downtime деплоя — по шагам

  1. Сборка релиза в изолированный каталог. Код разворачивается в новый каталог (/releases/{timestamp}/) или новое окружение, не затрагивая рабочую версию.
  2. Обратно совместимые миграции базы. Только «расширяющие» изменения схемы (expand) применяются на этом этапе — ничего, что сломало бы работающий сейчас старый код.
  3. Симлинки на общие каталоги. /upload и другие общие данные подключаются к новому релизу через символические ссылки на общее хранилище, а не копируются.
  4. Прогрев композитного кэша. Скрипт обходит ключевые страницы нового релиза, пока он ещё не принимает боевой трафик.
  5. Health-check и смоук-тест. Автоматическая проверка ключевых страниц и одного-двух критичных сценариев (например, оформление тестового заказа в песочнице).
  6. Переключение трафика. Атомарное изменение симлинка рабочего каталога либо переключение балансировщика на новое окружение (blue-green) или поочерёдное обновление узлов (rolling).
  7. Мониторинг после переключения. Несколько минут повышенного внимания к логам ошибок и метрикам ответа — окно, в течение которого откат ещё максимально дёшев.
  8. «Уборочный» релиз миграций. Отдельным более поздним деплоем — удаление устаревших полей и таблиц (contract), когда весь трафик гарантированно обслуживается новым кодом.

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

Мини-FAQ. Обязательно ли для zero-downtime деплоя выносить сайт в контейнеры? Нет — паттерн одинаково применим и к «классическому» серверу или BitrixVM через атомарную выкладку по симлинку, и к контейнерной инфраструктуре. Контейнеры упрощают blue-green и rolling за счёт более гибкого управления окружениями, но не являются обязательным условием.

Чек-лист перед первым zero-downtime релизом

Прежде чем полагаться на zero-downtime деплой в проде, стоит пройти по контрольному списку:

  1. Выкладка атомарна. Новый релиз собирается в отдельном каталоге/окружении, переключение — одна атомарная операция (симлинк или балансировщик).
  2. Сессии и корзина — в общем хранилище. Не привязаны к диску конкретного сервера.
  3. Загруженные файлы — на общем сетевом хранилище. Не являются частью самого релиза.
  4. Миграции базы разбиты по паттерну expand-and-contract. Ни одна не совмещает добавление и удаление несовместимых изменений в одном шаге.
  5. Есть автоматический прогрев композитного кэша перед переключением боевого трафика на новую версию.
  6. Настроен содержательный health-check и смоук-тест ключевого сценария, а не только проверка «порт отвечает».
  7. Откат протестирован заранее — команда/кнопка отката существует, а не придумывается в момент инцидента.
  8. Учтены фоновые агенты Битрикс. Понятно, как они себя ведут при переключении между окружениями, и исключён риск двойного запуска.

Вывод

Zero-downtime деплой на 1С-Битрикс — это прежде всего архитектурная работа, а не просто более умный скрипт выкладки: нужно вынести сессии, файлы и корзину из-под конкретного сервера, разбить миграции базы на обратно совместимые шаги, прогревать композитный кэш до переключения и держать откат таким же дешёвым и быстрым, как сам деплой. Сделав это один раз, вы получаете возможность выкатывать релизы днём, часто и без звонков «а почему магазин не работает» — вне зависимости от того, идёт ли речь о симлинк-деплое на одном сервере или о полноценном blue-green на кластере.

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

Чем zero-downtime деплой отличается от обычного «выложили ночью, когда трафика мало»?

Выкладка ночью снижает число пострадавших пользователей, но не убирает простой — просто переносит его на часы с минимальным трафиком, который на международных или B2B-проектах может быть не таким уж минимальным. Zero-downtime деплой — это архитектурный подход, при котором новая версия сайта поднимается параллельно со старой и трафик переключается на неё без разрыва соединений и без того самого окна «сайт временно недоступен». Ночная выкладка — компромисс, zero-downtime — устранение проблемы как класса.

Можно ли сделать zero-downtime деплой на обычном одном сервере без blue-green окружения?

Частично. Атомарная замена кода через симлинк на новый релиз (вместо перезаписи файлов на лету) уже убирает промежуточное «битое» состояние, когда часть файлов старая, а часть новая. Но полноценный zero-downtime — с возможностью проверить новую версию перед тем, как отдать её пользователям, и мгновенно откатиться — требует хотя бы двух рабочих окружений (blue и green), между которыми переключается балансировщик или веб-сервер.

Что делать с миграциями базы данных, если старый и новый код временно работают одновременно?

Разбивать каждое изменение схемы на обратно совместимые шаги (expand-and-contract): сначала добавить новое поле или таблицу, не трогая старые — старый код продолжает работать, не замечая изменений; выкатить новый код, который умеет писать и читать уже по новой схеме; и только отдельным, более поздним релизом убрать старое поле, когда весь трафик гарантированно идёт через новый код. Разрушающие миграции (переименование или удаление колонки в одном шаге) — то, что чаще всего рвёт zero-downtime деплой на 1С-Битрикс.

Как быть с сессиями пользователей и корзиной при переключении между старым и новым окружением?

Сессии и данные корзины должны храниться не на файловой системе конкретного сервера, а в общем хранилище (база данных, Redis, memcached), доступном обоим окружениям одинаково. Если сессии лежат локально на диске веб-узла, переключение трафика на другое окружение в середине пользовательской сессии обрывает авторизацию и корзину — то есть формально сайт «не упал», но конкретный покупатель всё равно потерял свою корзину, что для бизнеса не менее болезненно.

Нужен ли zero-downtime деплой небольшому интернет-магазину с невысоким трафиком?

Не всегда оправдан с первого дня — blue-green окружение требует вдвое больше вычислительных ресурсов на время деплоя и более зрелого CI/CD, чем простой перезапуск через симлинк. Для магазина с редкими релизами и невысоким постоянным трафиком часто достаточно атомарной выкладки по симлинку плюс окно в несколько секунд на прогрев кэша. Полноценный blue-green имеет смысл, когда релизы частые, простой напрямую считается в потерянных заказах, либо на проект приходятся отложенные заказы 24/7 в разных часовых поясах.

Как быстро можно откатиться, если новый релиз оказался с багом?

При атомарном деплое через симлинк откат — это переключение симлинка обратно на каталог предыдущего релиза, то есть секунды, при условии что миграции базы были обратно совместимы. При blue-green окатe ещё быстрее — балансировщик просто возвращает трафик на прежнее (ещё не остановленное) окружение. Единственное, что нельзя откатить мгновенно — необратимые изменения данных; поэтому миграции и держат обратно совместимыми до отдельного «уборочного» релиза.

Поделиться: Telegram ВКонтакте WhatsApp

Хотите выкатывать релизы без простоя и без нервов?

Настроим CI/CD и zero-downtime деплой под ваш проект на 1С-Битрикс: атомарные релизы, безопасные миграции, прогрев кэша и мгновенный откат.

Услуга «Zero-downtime деплой»

Игорь Воскресенский

Основатель студии B2Bsite. С 2014 года команда разрабатывает и поддерживает интернет-магазины и корпоративные сайты на 1С-Битрикс, настраивает каталоги, умный фильтр и обмен с 1С для среднего и крупного бизнеса.

← Все статьи блога