Как идёт работа
Все шесть шагов идут не по очереди, а внахлёст: каркас тестов и докеризация появляются в первые недели, дальше — обновление мелкими поставками внутри этого каркаса. Вы видите движение на Kanban-доске каждый день.
Шаг 1. Восстанавливаем, что система на самом деле делает
Из кода, логов и разговоров с тремя-пятью ключевыми пользователями собираем сценарии — кто, зачем и что делает в системе (JTBD). Сводим в одну спецификацию и согласовываем с вами. Это становится критерием приёмки.
Как именно
Идём от маршрутов и контроллеров к сценариям, а не наоборот. Смотрим реальные логи за несколько месяцев: что используется, что мёртвое. Мёртвое не переносим — договариваемся об этом явно. Патченные и заброшенные гемы инвентаризируем здесь же, чтобы не было сюрпризов на середине.
Шаг 2. Строим каркас: тесты и мониторинг
Пишем сквозные тесты на каждый сценарий — они кликают по системе как пользователь. Интеграции с внешними сервисами (1С, платёжки, СМЭВ, что угодно) обкладываем контрактными тестами с моками и ставим под мониторинг.
Как именно
Сквозные тесты гоняем через Cuprite/Ferrum — это headless Chrome без Selenium, в разы быстрее. Полный прогон укладывается в минуты, а не часы, поэтому его можно запускать на каждый пуш. Контрактные тесты фиксируют, что именно мы ждём от внешнего сервиса и что он ждёт от нас; если контрагент что-то меняет — узнаём из мониторинга, а не от пользователей.
Шаг 3. Докеризируем и поднимаем конвейер
Монолит и сайдкары — в контейнеры. Вокруг них — devcontainer для локальной разработки. Один ваш сервер — под staging и тесты. Kamal 2 подключаем к репозиторию: либо наш GitLab с вашим доступом, либо ваш оркестратор.
Как именно
Kamal 2 — это официальный инструмент деплоя Rails: Docker + SSH + kamal-proxy. Никакого Kubernetes. Прокси переключает трафик на новый контейнер после health-check, старый живёт, пока не завершит запросы. Отсюда «без простоя». Требования к железу не растут: тот же сервер, что и был.
Шаг 4. Обновляем до Rails 8 — сразу, не по цепочке
Не идём 4 → 5 → 6 → 7 → 8. Переносим сразу в актуальный Rails и Ruby, с учётом всех отличий. Мёртвые гемы заменяем функционально: либо кодом внутри монолита, либо живыми аналогами.
Как именно
Каркас тестов из шага 2 позволяет так делать: мы не гадаем, что сломалось, — мы видим красные сценарии и делаем их зелёными. Red-green, сценарий за сценарием. По ходу убираем то, что Rails 8 даёт из коробки: очереди, кэш и websockets — на Solid-стеке поверх PostgreSQL, без Redis. Если Redis у вас оправдан — оставляем.
Шаг 5. Поставляем мелко и часто
Trunk-based разработка: маленькие поставки от раза в несколько дней до нескольких раз в день. При необходимости — фичетоглы: включаем новую версию сценария на группу пользователей, откатываем без деплоя.
Как именно
Каждая поставка проходит через тесты на staging. В любой момент у вас в репозитории — рабочая система. Если мы завтра исчезнем, вы остаётесь с тем, что уже сделано и работает, а не с «недостроем на полпути».
Шаг 6. Вводим в эксплуатацию и передаём
Бэкапы, мониторинг бэкапов, канареечная раскатка на пользователей. Обучаем ваших админов и разработчиков. Передаём репозиторий, runbook и доску. Дальше — ваша система, ваши люди. Хотите — остаёмся на поддержке.