Мы уходим с Coolify на своё: что взяли, что выкинули и чего это стоило
Базовое решение — не переносить данные, а перенимать работающие стеки как есть. Единицей переезда становится хост, простой сокращается до минут на переключении портов.
Мы пять лет пользовались чужой панелью развёртывания и уходим на свою. Разбор полезен не тем, что мы уходим, — а тем, какое решение оказалось главным.
Главное решение: не переносить, а перенимать
Очевидный план переезда — перенести данные: поднять новое, скопировать, погасить старое. Он же самый дорогой: простой, риск потери, несовпадение версий образов.
Мы выбрали другое. Панель стоит на отдельной машине, а стеки работают на серверах сами. Остановка панели контейнеров не касается.
Отсюда:
- stateful-нагрузки не переносятся вовсе — платформа берёт под управление то, что уже крутится;
- stateless пересоздаются нативно — там терять нечего, а пересборку и автовыкат мы как раз хотим свои.
Что это даёт: данные не трогаются, версии образов не меняются, простоя на перенос нет. Единицей переезда становится не приложение, а хост: на нём один раз переключается прокси, и все приложения переходят разом.
Что всё-таки стоит простоя
Порты 80 и 443. Два прокси на одной машине не уживаются, и настоящее окно простоя — минуты на хост, включая перевыпуск сертификатов.
Это единственная честная строка простоя во всём переезде, и она не размазана по приложениям, а сосредоточена в одном переключении.
Чего у нас не было — и мы этого не замечали
Самая полезная находка разбора: перенимать чужой стек платформа не умела вообще. Не «отложенная задача» — незамеченная дыра. Мы строили выкат из git и не заметили, что случай «на сервере уже что-то работает» не покрыт.
А это ровно тот случай, который встречается у клиента чаще всего: сервер не пустой, там уже развёрнуто предыдущей студией.
Переходное состояние: честное, но неполноценное
Принятый стек платформа наблюдает и обслуживает, но воспроизвести не умеет: описание его развёртывания у нас неполное, потому что разворачивали не мы.
Это записано прямо, а не замолчано. Перевод на родной шаблон — потом, без окна простоя, и он не блокирует сам уход.
Разница между «умеет наполовину» и «умеет» принципиальна: если её не назвать, через полгода кто-то понадеется на восстановление стека, которого платформа не воспроизведёт.
Что из этого следует
Переезд между инструментами — это чаще всего вопрос о данных, а не о функциях. Как только выяснилось, что данные можно не трогать, план сократился втрое.
Разбор чужого продукта перед уходом полезнее, чем кажется. Мы читали исходники панели, от которой уходим, — и нашли в своей платформе дыру, которую не искали.
Переходное состояние надо называть по имени. «Работает наполовину» — законное состояние, если написано, какая половина. Незаписанное «наполовину» через месяц читается как «работает».
Мы умеем взять под управление сервер, на котором уже что-то развёрнуто, и показать план: что переносится, что остаётся. Как устроен выкат — Деплой из Git.
Читайте также
- Код или миграция первым: порядок, который зависит от направленияПравило одно и оно несимметрично. Сносите колонку — сначала выкат, потом миграция. Добавляете — наоборот. Ошибка порядка даёт несколько минут сломанного экрана на бою.
- Копия, из которой ни разу не восстанавливали, не считается копиейУчение на своём проде 04.09.2026: копия 621 МБ, база поднялась за 19 секунд, файлы за 4, контрольные числа сошлись. До учения все эти цифры были бы догадкой.
Автор
Александр ЦапковОснователь Скоупворк
Веду платформу и её боевой контур сам: разработка, выкат, дежурство. Пишу о том, на чём мы обожглись, — с датами, замерами и ссылками на решения в репозитории.