web development
May 4

🔧 Как оживить легаси-проект и не сломать продакшен

🚀 Аплаут: обновление Ruby on Rails без боли и простоя

Проблема — развитие упёрлось в старые технологии 😬

Аплаут — сервис отзывов для крупных интернет-площадок. Продукт успешно рос много лет, но внутренняя техническая база постепенно стала ограничением.

Команда столкнулась с типичной ситуацией зрелого проекта:

  1. Устаревшие версии Ruby и Rails.
  2. Сложные зависимости между внутренними модулями.
  3. Старые библиотеки без поддержки.
  4. Долгое внедрение новых возможностей.
  5. Рост времени на поддержку кода.

Когда каждая новая функция требует больше усилий, продукт начинает терять темп.

Решение — модернизация по этапам ⚙️

Чтобы не останавливать сервис, обновление проводили постепенно.

🐳 Шаг 1. Docker вместо хаоса

Раньше запуск проекта зависел от устройства разработчика. Особенно это мешало на новых процессорах.

После перехода на Docker команда получила:

  • единое окружение;
  • быстрый старт проекта;
  • воспроизводимость ошибок;
  • удобный онбординг новичков.

💎 Шаг 2. Ruby и Rails

Переход выполнили не рывком, а шаг за шагом:

  1. Обновляли Ruby до следующей версии.
  2. Поднимали Rails.
  3. Проверяли тесты.
  4. Исправляли несовместимости.

Некоторые библиотеки пришлось дорабатывать вручную, а часть — переносить в собственные форки.

🗄️ Шаг 3. База данных без остановки

Сервис работает постоянно, поэтому downtime был недопустим.

Команда внесла патчи в проблемный драйвер и обновила инфраструктуру без отключения клиентов. 🔥

⚡ Шаг 4. Ускорение CI/CD

Более 1500 тестов замедляли релизы.

После изменений:

  • тесты пошли параллельно;
  • контейнеры стали легче;
  • сборки ускорились в разы.

Результат — проект снова дышит 🌟

Аплаут получил современный стек:

  • Ruby 3.4
  • Rails 8
  • быстрые тесты
  • удобную разработку
  • базу для дальнейших изменений

Команда уже начала перенос фронтенда на React и готовится к новым архитектурным шагам.

Иногда легаси — это не проблема, а история роста. В Evrone умеют читать такие истории между строк кода.