Как мы строим

Мы уходим с Coolify на своё: что взяли, что выкинули и чего это стоило

Базовое решение — не переносить данные, а перенимать работающие стеки как есть. Единицей переезда становится хост, простой сокращается до минут на переключении портов.

Александр Цапков10 сентября 20262 мин

Мы пять лет пользовались чужой панелью развёртывания и уходим на свою. Разбор полезен не тем, что мы уходим, — а тем, какое решение оказалось главным.

Главное решение: не переносить, а перенимать

Очевидный план переезда — перенести данные: поднять новое, скопировать, погасить старое. Он же самый дорогой: простой, риск потери, несовпадение версий образов.

Мы выбрали другое. Панель стоит на отдельной машине, а стеки работают на серверах сами. Остановка панели контейнеров не касается.

Отсюда:

  • stateful-нагрузки не переносятся вовсе — платформа берёт под управление то, что уже крутится;
  • stateless пересоздаются нативно — там терять нечего, а пересборку и автовыкат мы как раз хотим свои.

Что это даёт: данные не трогаются, версии образов не меняются, простоя на перенос нет. Единицей переезда становится не приложение, а хост: на нём один раз переключается прокси, и все приложения переходят разом.

Что всё-таки стоит простоя

Порты 80 и 443. Два прокси на одной машине не уживаются, и настоящее окно простоя — минуты на хост, включая перевыпуск сертификатов.

Это единственная честная строка простоя во всём переезде, и она не размазана по приложениям, а сосредоточена в одном переключении.

Чего у нас не было — и мы этого не замечали

Самая полезная находка разбора: перенимать чужой стек платформа не умела вообще. Не «отложенная задача» — незамеченная дыра. Мы строили выкат из git и не заметили, что случай «на сервере уже что-то работает» не покрыт.

А это ровно тот случай, который встречается у клиента чаще всего: сервер не пустой, там уже развёрнуто предыдущей студией.

Переходное состояние: честное, но неполноценное

Принятый стек платформа наблюдает и обслуживает, но воспроизвести не умеет: описание его развёртывания у нас неполное, потому что разворачивали не мы.

Это записано прямо, а не замолчано. Перевод на родной шаблон — потом, без окна простоя, и он не блокирует сам уход.

Разница между «умеет наполовину» и «умеет» принципиальна: если её не назвать, через полгода кто-то понадеется на восстановление стека, которого платформа не воспроизведёт.

Что из этого следует

Переезд между инструментами — это чаще всего вопрос о данных, а не о функциях. Как только выяснилось, что данные можно не трогать, план сократился втрое.

Разбор чужого продукта перед уходом полезнее, чем кажется. Мы читали исходники панели, от которой уходим, — и нашли в своей платформе дыру, которую не искали.

Переходное состояние надо называть по имени. «Работает наполовину» — законное состояние, если написано, какая половина. Незаписанное «наполовину» через месяц читается как «работает».


Мы умеем взять под управление сервер, на котором уже что-то развёрнуто, и показать план: что переносится, что остаётся. Как устроен выкат — Деплой из Git.

Деплой из Git на свои серверыВыкат из git на свои серверы: домены, сертификаты, проверка здоровья, откат одной кнопкой.

Читайте также

Автор

Александр ЦапковОснователь Скоупворк

Веду платформу и её боевой контур сам: разработка, выкат, дежурство. Пишу о том, на чём мы обожглись, — с датами, замерами и ссылками на решения в репозитории.