refactor.pragmaticdev.ru — модернизация Ruby on Rails монолитов · вся РФ · удалённо

Rails 4–7 → Rails 8. Без переписывания с нуля, без простоя и без рельсовика в штат за 300.

Мы — небольшая команда, которая обновляет унаследованные Rails-монолиты до современного стека, снимает их с «сервера-снежинки», ставит деплой без простоя за 1–2 минуты и передаёт вашим людям — с тестами, мониторингом и готовой средой разработки. Код остаётся Ruby, функциональность остаётся вашей.

Порядок цены — 100 тыс. ₽ за разработчика в месяц · Закрытые контуры, Астра Линукс, ФСТЭК — есть опыт · ИП на УСН, договор, акты

Без форм и менеджеров по продажам. Пишете — отвечает Павел Остапенко, тимлид.

Если хотя бы три пункта про вас — читайте дальше

Монолит на Rails 4.2 или 5-й, Ruby 2.x. bundle install на свежем сервере уже не собирается — тянет гемы, которых нет.

Он живёт на одном сервере, который восемь лет настраивали руками. Никто не помнит, что там накручено. Перенести нельзя, масштабировать нельзя, обновить ОС страшно.

Деплой — Capistrano по пятницам, откат — молитва. Или вообще git pull по SSH.

Тесты либо нет, либо они красные с 2019 года. Поэтому никто ничего не трогает: «работает — не лезь».

Система держит реальные процессы: склад, заявки, личный кабинет, учёт, интеграции с 1С. Отключить нельзя. Бизнес привык к каждой её особенности, включая баги.

Человек, который всё знал, уволился. Или собирается.

Рельсовика на рынке нет. Тот, что есть, хочет 250–350 в месяц и писать новое на Rails 8, а не ковыряться в чужом Rails 4.

Бюджета на «переписать на Go и распилить на микросервисы» вам не дадут. И, честно говоря, правильно сделают.

Три дороги, которые есть у техдира с таким монолитом

Переписать на новый стек и распилить на сервисыОставить как естьОбновить внутри Rails до 8-й
СрокиГод-два. Обычно дольше планаНоль сейчасМесяцы, поставки каждые несколько дней
БюджетНовая команда, новый стек, параллельная эксплуатация двух системНоль сейчас, растущий счёт за простой и за «того самого человека»Порядок 100 тыс. ₽ за разработчика в месяц, от одного разработчика
Риск для процессовВысокий: сложившаяся функциональность теряется, отделы лихорадит до исправления детских болезнейРастёт с каждым годом: сервер, ОС, гемы, безопасностьНизкий: сценарии зафиксированы тестами до старта, код остаётся Ruby
ЛюдиНужны новые специалисты, внутренняя команда переучиваетсяДержитесь на одном человекеВаши люди принимают систему с тестами и средой разработки
Когда оправданоЕсли Rails стратегически не нужен и бизнес готов к году турбулентностиЕсли систему выводят из эксплуатации в ближайший годЕсли система нужна ещё 5–10 лет и её надо дорабатывать дёшево

Переписать на новый стек и распилить на сервисы

Сроки
Год-два. Обычно дольше плана
Бюджет
Новая команда, новый стек, параллельная эксплуатация двух систем
Риск для процессов
Высокий: сложившаяся функциональность теряется, отделы лихорадит до исправления детских болезней
Люди
Нужны новые специалисты, внутренняя команда переучивается
Когда оправдано
Если Rails стратегически не нужен и бизнес готов к году турбулентности

Оставить как есть

Сроки
Ноль сейчас
Бюджет
Ноль сейчас, растущий счёт за простой и за «того самого человека»
Риск для процессов
Растёт с каждым годом: сервер, ОС, гемы, безопасность
Люди
Держитесь на одном человеке
Когда оправдано
Если систему выводят из эксплуатации в ближайший год

Обновить внутри Rails до 8-й

Сроки
Месяцы, поставки каждые несколько дней
Бюджет
Порядок 100 тыс. ₽ за разработчика в месяц, от одного разработчика
Риск для процессов
Низкий: сценарии зафиксированы тестами до старта, код остаётся Ruby
Люди
Ваши люди принимают систему с тестами и средой разработки
Когда оправдано
Если система нужна ещё 5–10 лет и её надо дорабатывать дёшево

Мы занимаемся третьей дорогой. Только ей. Не переписываем на другие стеки, не делаем микросервисы ради микросервисов. Зато эту дорогу знаем хорошо и проходим быстро.

Не уверены, какая дорога ваша? Разберём за час бесплатно →

Что у вас будет на выходе

Не «обновлённая версия фреймворка», а работающая система, которую можно развивать дальше без нас.

  • Монолит на Rails 8+ и актуальном Ruby, с Hotwire на фронте там, где это оправдано. Vanilla Rails без экзотики — любой рельсовик откроет и поймёт.
  • PostgreSQL актуальной версии. Данные перенесены и проверены тестами.
  • Docker-образы монолита и всех сайдкаров (очереди, планировщик, воркеры). Всё поднимается одной командой на любом сервере.
  • Деплой через Kamal 2 на ваших серверах. Пуш в репозиторий → через 1–2 минуты новая версия работает, пользователи не заметили. В фоне прогоняются сквозные тесты; если что-то красное — автоматический откат.
  • Сквозные (e2e) тесты на все согласованные сценарии — это и есть критерий приёмки. Плюс контрактные тесты интеграций с внешними сервисами.
  • Мониторинг в Grafana: приложение, БД, сайдкары, интеграции, логи, алерты. На вашем сервере или в вашей системе мониторинга.
  • Бэкапы и мониторинг бэкапов.
  • Спецификация пользовательских сценариев — документ, которого у вашей системы, скорее всего, никогда не было.
  • Готовая среда разработки (devcontainer): любой разработчик открывает проект и через десять минут запускает тесты локально. Внутри — настроенные правила для AI-агентов, чтобы доработки мог делать опытный разработчик, даже если он не рельсовик.
  • Передача: repository, runbook, обучение ваших админов. Дальше — либо ваши люди, либо наша поддержка за порядок 50 тыс. ₽ в месяц. Выбираете вы.

Как идёт работа

Все шесть шагов идут не по очереди, а внахлёст: каркас тестов и докеризация появляются в первые недели, дальше — обновление мелкими поставками внутри этого каркаса. Вы видите движение на 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 и доску. Дальше — ваша система, ваши люди. Хотите — остаёмся на поддержке.

Почему это дёшево и не требует нового железа

Не потому, что мы демпингуем. Потому что современный Rails убрал из инфраструктуры всё лишнее.

  • Kamal 2 вместо Kubernetes. Деплой без простоя на обычные серверы по SSH. Один конфиг, одна команда. Масштабирование — добавить сервер в список.
  • Solid Queue, Solid Cache, Solid Cable вместо Redis и Sidekiq. Очереди, кэш и websockets живут в PostgreSQL. Минус один сервис, который надо мониторить и бэкапить.
  • Hotwire вместо отдельного SPA-фронтенда. Один репозиторий, одна команда, одна сборка.
  • Docker вместо сервера-снежинки. Окружение описано кодом и воспроизводится где угодно — в облаке, в вашем ЦОДе, в закрытом контуре на Астре.
  • PostgreSQL — актуальной версии. Всё.

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


  INFO [85021070] Running docker image ls --filter label=service=shvei --format '{{.ID}} {{.Repository}}:{{.Tag}}' | grep -v -w "$(docker container ls -a --format '{{.Image}}\|' --filter label=service=shvei | tr -d '\n')pragmaticdev.ru:5050/rustam/shvei:latest\|pragmaticdev.ru:5050/rustam/shvei:<none>" | while read image tag; do docker rmi $tag; done on shvei.pragmaticdev.ru

Untagged: pragmaticdev.ru:5050/rustam/shvei@sha256:d78fde23d26fdb131765354e5575304a8c89f59023ca63c40af2c8ae47d16009

Deleted: sha256:02a30effb8ea8f9675ccf3c6af0eaf16450285e42983ffc6a01d54425c2da5f6

Deleted: sha256:26721ec89f0303beb3fc080b3d6fd4ad9c3dbb6935d97931a2a7c23497f9e8d5

Deleted: sha256:a274acea792a000b12a98d6d97262225c9cc56af672e93874087fa55394dad6b

  INFO [85021070] Finished in 1.088 seconds with exit status 0 (successful).

Releasing the deploy lock...

 DEBUG [36017ddf] Running /usr/bin/env rm .kamal/lock-shvei/details && rm -r .kamal/lock-shvei on shvei.pragmaticdev.ru

 DEBUG [36017ddf] Command: /usr/bin/env rm .kamal/lock-shvei/details && rm -r .kamal/lock-shvei

 DEBUG [36017ddf] Finished in 0.061 seconds with exit status 0 (successful).

  Finished all in 93.3 seconds

Cleaning up project directory and file based variables

Job succeeded

Сколько это стоит и откуда цена

Порядок цены — 100 тыс. ₽ за разработчика в месяц. Плюс-минус в зависимости от сложности проекта. Точную назовём после разбора, когда увидим код.

Минимальный объём — один месяц одного разработчика. Мощность (сколько разработчиков в месяц) выбираете вы. Меняется по договорённости за 2–3 месяца — вверх до 10+ человек, вниз до минимума.

Поддержка после передачи — порядок 50 тыс. ₽ в месяц. Контроль работоспособности, мониторинг, бэкапы, реакция на алерты. Без разработки. Альтернатива — обучаем ваших админов и уходим. Точечные доработки — отдельно, по запросу.

Откуда 100, если штатный сеньор стоит 250–350?

Честно: наши разработчики ведут два-три проекта параллельно. Вы платите за экспертизу и результат, а не за восемь часов присутствия. Миддл/сеньор, который занят на двух-трёх проектах, не сидит без дела в ваших простоях — и поэтому стоит вам 100, а не 300. В экономике 2026 года это единственный способ дать сильных людей за вменяемые деньги, который мы знаем.

Что мы не скажем после разбора: точную цену и точный срок. Никто, кто хоть раз писал софт, не назовёт их заранее честно. Скажем ориентиры — и они будут честными.

Работаем через ИП на УСН, по договору, с актами. Только удалённо.

Прикинуть мощность и ориентиры под ваш монолит →

Что вы спросите на первом созвоне — и что мы ответим

«А если в середине проекта вы пропадёте?»

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

«Как вы гарантируете, что ничего не потеряется?»

Мы фиксируем все сценарии тестами до того, как трогаем код. Приёмка — это зелёные тесты на ваших серверах по согласованной спецификации. Мы работаем, пока они не зелёные. Это и есть наша ответственность за результат.

«У нас половина гемов мёртвые, а вторая — патченная.»

Обычная картина. Инвентаризируем на первом шаге. Заменяем функционально: либо пишем внутри монолита, либо берём живой аналог. Rails 8 многое из того, для чего раньше ставили гемы, делает сам.

«У нас интеграция с 1С / СМЭВ / банком, которую нельзя трогать.»

Обкладываем контрактными тестами с моками, ставим под мониторинг. Контракт не меняется — меняется только наша сторона.

«У нас закрытый контур.»

Работали через VPN и прыжковые серверы, разворачивали на Астра Линукс с сертификатом ФСТЭК. Данные не покидают ваш контур.

«Вы уйдёте, а нам жить с этим кодом.»

Поэтому vanilla Rails без экзотики, тесты, документация, devcontainer. Ваш разработчик — даже не рельсовик — открывает проект и вносит правку под контролем тестов руками или с AI-агентом. Bus-фактор с нас снят намеренно.

«А наша команда? Мы не хотим внешних людей в оргструктуре.»

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

Один кейс подробно: сняли систему с сервера-снежинки

ИНГИПРО — среда общих данных инженерного проектирования

ИНГИПРО — среда общих данных инженерного проектирования. Многостраничные чертежи, 3D-модели, десятки подрядчиков на одном проекте, юридически значимые статусы документов.

Было. Легаси на C++, TypeScript и React. Писали 15 человек четыре года. Работало на одном сервере, который годами настраивали руками — «снежинка»: неповторимое состояние, которое нельзя было ни перенести, ни отмасштабировать, ни толком обновить. Главная боль заказчика была не в фичах, а в том, чтобы система просто продолжала жить.

Стало. Монолит на нашем стеке. Команда — четыре человека, два года на перенос, дальше — новые модули той же малой командой. Система докеризирована, распределяет нагрузку между серверами, работает на российской ОС с сертификатом ФСТЭК — в облаке или в закрытом контуре заказчика. Чертежи открываются в браузере за секунды, сравнение версий — машинным зрением, до 10 раз быстрее ручной проверки. Эксплуатируется и дорабатывается по сей день.

Честная оговорка. Это был перенос с чужого стека на Rails — сложнее, чем то, что мы предлагаем вам. Из Rails 4 в Rails 8 переносить проще: код остаётся Ruby, структура приложения остаётся рельсовой, а сценарии, тесты и конвейер — те же самые инструменты.

Что ещё построено на этом стеке малой командой (одна строка на каждый, ссылки на канал):

Подробнее о кейсах — в Telegram-канале @pragmaticdev_ru.

Кто будет делать

Ядро — четыре человека. Под проект подключаем до 10+ фулстек-разработчиков, но мощность выбираете вы, начиная с одного.

[PLACEHOLDER: фото Павла Остапенко]

Павел Остапенко

Тимлид, архитектор, фулстек. Ведёт разбор, спецификацию сценариев и архитектурные решения. 25+ лет коммерческой разработки: от ассемблера Z80 и игры «Корсары 2» через автоматизацию завода «Тонар» до технического директора и ведущего архитектора ИНГИПРО.

[PLACEHOLDER: фото фулстек-разработчика]

[Имя Фамилия]

Фулстек-разработчик. [PLACEHOLDER: одна строка про роль на проектах рефакторинга]

[PLACEHOLDER: фото фулстек-разработчика]

[Имя Фамилия]

Фулстек-разработчик. [PLACEHOLDER: одна строка про роль на проектах рефакторинга]

[PLACEHOLDER: фото DevOps]

[Имя Фамилия]

DevOps. Docker, Kamal, мониторинг, бэкапы, закрытые контуры. [PLACEHOLDER: одна строка про роль на проектах рефакторинга]

Мы в шутку зовём это «рельсовым спецназом»: пришли, разгребли, передали, ушли. Новое с нуля писать умеют многие. Взять систему, на которой десять лет держится чей-то бизнес, и аккуратно перевести её в 2026 год так, чтобы никто не заметил переезда, — интереснее.

Кому мы не нужны

Сэкономим вам час.

  • У вас Rails 7+ с живыми тестами и нормальным деплоем. Вам не нужна модернизация — вам нужен один хороший разработчик. Не мы.
  • Бизнес принял стратегическое решение уйти с Ruby на Java/Go/.NET. Мы не переписываем на другие стеки.
  • Нужен человек в офисе на фултайм. Мы работаем только удалённо и не сидим на одном проекте.
  • Систему выводят из эксплуатации в ближайший год. Дешевле дотянуть как есть.
  • У вас не Rails. Django, Laravel, Spring — не к нам.

Бесплатный часовой разбор с тимлидом

Один час онлайн с Павлом. Без презентаций и продажи. Что будет:

  1. Разберём вашу ситуацию честно. Версии, сервер, интеграции, люди, что болит. Если можно показать код или структуру — покажете, если нельзя — обойдёмся описанием.
  2. Скажем, узкое ли это место. Иногда монолит — не главная проблема, и деньги лучше потратить на другое. Скажем и это.
  3. Дадим ориентиры. Что рационально обновить, что дорого, что рискованно, какая мощность разумна и сколько примерно месяцев. Без точных цифр — с честными.
  4. Если хотите — дадим способ проверить гипотезу самим, до того как платить кому-либо.

Дальше — вы решаете. Никакого дожима.

Ответ обычно в течение рабочего дня.

Вопросы, которые задают до созвона

Какие версии Rails вы берёте?

Rails 4, 5, 6 и 7 — основной профиль. Rails 3 и 2 тоже берём, но разбираем отдельно: там больше ручной работы с кодом. Целевая версия всегда — актуальный Rails 8+.

Обновляете по цепочке версий или сразу?

Сразу. Мы не идём 4 → 5 → 6 → 7 → 8. Каркас сквозных тестов позволяет перенести приложение в актуальный Rails и Ruby одним движением и потом чинить сценарии по одному: red → green.

Что с фронтендом — jQuery, CoffeeScript, Sprockets, React?

Серверный рендеринг и jQuery-логику переводим на Hotwire там, где это упрощает систему. Если у вас отдельный React-фронт, обсуждаем: иногда его разумно оставить и обновить, иногда — заменить Hotwire. Решение — по сценариям, не по моде.

Какая база данных?

PostgreSQL актуальной версии. Если у вас MySQL — переносим данные и проверяем тестами. Для небольших внутренних систем возможен SQLite — в Rails 8 он полноценно поддерживается в продакшене, но выбор всегда за вами.

Нужен ли Kubernetes или новое железо?

Нет. Kamal 2 деплоит Docker-контейнеры по SSH на обычные серверы и обеспечивает переключение без простоя через kamal-proxy. Требования к оборудованию не растут. Масштабирование — добавить сервер в конфиг.

Что такое «деплой без простоя за 1–2 минуты»?

Пуш в репозиторий → сборка образа → kamal-proxy переключает трафик на новый контейнер после проверки здоровья → старый контейнер завершает текущие запросы и гасится. Пользователи не видят ошибок и не теряют сессии. В фоне прогоняются сквозные тесты; при красном результате — автоматический откат.

Можно ли работать в закрытом контуре и на Астра Линукс?

Да. Есть реальный опыт развёртывания через VPN и прыжковые серверы, а также на Астра Линукс с сертификатом ФСТЭК. Данные не покидают ваш контур; мы работаем на ваших серверах.

Что значит «отвечаем за результат»?

До старта мы вместе фиксируем сценарии эксплуатации в спецификации. Критерий приёмки — все эти сценарии проходят сквозные тесты на ваших серверах. Мы работаем до этого состояния.

Что будет с нашей командой после передачи?

Ваши разработчики получают vanilla Rails 8 без экзотики, тесты, документацию сценариев, devcontainer и правила для AI-агентов. Опытный разработчик, даже не рельсовик, сможет вносить правки под контролем тестов. Rails 8 при этом — один из самых компактных по объёму кода стеков для веб-приложений, поэтому доработки дёшевы и с людьми, и с агентами.

Как формируется цена?

Порядок — 100 тыс. ₽ за разработчика в месяц, плюс-минус по сложности. Минимум — один месяц одного разработчика. Наши разработчики ведут 2–3 проекта параллельно, поэтому цена ниже штатного сеньора. Поддержка после передачи — порядок 50 тыс. ₽ в месяц, опционально. Работаем через ИП на УСН, без НДС, по договору и актам.

Можно ли остановиться после первого месяца?

Да. После первого месяца у вас остаются тесты, Docker-образы, staging с конвейером и спецификация сценариев. Это самостоятельная ценность — даже если дальше вы пойдёте своими силами.

Как вы общаетесь и отчитываетесь?

Kanban-доска с открытым доступом для вас, поставки в staging от раза в несколько дней до нескольких раз в день, короткие созвоны по необходимости. Никаких «полгода тишины, а потом не то».

Почему у вас нет кейса «Rails 4 → Rails 8»?

Потому что до сих пор мы переносили на Rails 8 системы с других стеков — это сложнее (см. кейс ИНГИПРО). Перенос из Rails в Rails идёт теми же инструментами: спецификация сценариев, сквозные тесты, докеризация, Kamal. Разница в том, что код остаётся Ruby и структура приложения не меняется — то есть работы меньше, а не больше.

Бесплатный разбор → TG · MAX