Обновляем инструменты разработки в легаси-проекте

Иногда компании приходится фокусироваться на развитии продукта, поэтому обновление инструментов разработки откладывается. Команда Evrone помогла платформе Аплаут выбраться из такой технологической ловушки: мы обновили Ruby и Rails до актуальных версий и подготовили фундамент для масштабирования и развития.

28 апреля 2026

Аплаут — это платформа для сбора, модерации и публикации отзывов о товарах. Если вы читаете отзывы на сайтах Samsung, Gloria Jeans или Подружка, то, скорее всего, смотрите на работу их виджетов. 

Это классический долгоживущий продукт с 10-летней историей и legacy-кодом на Ruby. Команда успешно занималась запуском новых фич и развитием старых, но инструменты разработки долго не обновляли, так как на них был завязан важный бизнес-функционал. 

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

Аплаут делегировала техническое обновление проекта команде Evrone из-за большого опыта аутсаффинга разработки на Ruby on Rails. Нам поручили подготовить фундамент для будущих изменений, пока собственная команда сосредоточена на продуктовых задачах.

Проблема — старые инструменты разработки блокируют развитие

Аплаут планировал стратегические изменения, но бэкенд создавал препятствия:

  • Архитектурно приложение построено на базе Rails Engines. Это своего рода «микросервисы внутри монолита». Такой подход позволяет разделять бизнес-логику, но превращает любое глобальное обновление в сложный квест по разруливанию зависимостей внутри каждого «микросервиса».
  • В качестве основной БД использовалась MongoDB (версии 6.x) в связке с ElasticSearch и Redis. MongoDB уже устарела, да и в принципе на сегодняшний день для Rails-проектов это не самое популярное сочетание, порождающее проблемы с совместимостью библиотек.
  • Многие библиотеки (SDK для Mongo, Elastic, инструменты локализации и обработки изображений) не обновлялись с 2015 года и не поддерживали новые версии Ruby.

Команда Аплаут пытались выйти из технологического тупика самостоятельно, но возникла дилемма. У рефакторинга существующего кода всегда низкий приоритет, потому что это не генерирует прибыль в продукте. С другой стороны накопленный технический долг блокирует внедрение новых фичей, поэтому мешает планам на развитие. Но и потратить кучу времени на решение legacy-проблем нельзя — некому будет заниматься продуктом и метрики упадут. Поэтому команда ограничивалась хотфиксами самых критических проблем.

Мы полностью взяли на себя обновление инструментов разработки, чтобы дать команде Аплаут новые возможности, а также позволить им сфокусировать на важной продуктовой работе, пока мы занимаемся инфраструктурными задачами.

Решение — поэтапная модернизация без остановки сервиса

Для такой задачи мы привлекли Senior Ruby-разработчика с глубокой экспертизой в инфраструктуре и рефакторинге.

Нулевой шаг: Docker вместо «танцев с бубном»

Исторически Аплаут работает на Linux/Intel, а разработчики запускали проект на своем железе, что создавало классическую проблему «на моем компьютере всё работает». Например, старая библиотека libv8 отказывалась собираться на ARM-архитектуре (Apple Silicon).

Это создавало жесткую привязку и необходимость следить за используемыми девайсами. Поэтому мы упаковали всё приложение в Docker. Теперь развертывание проекта занимает не несколько дней локальной настройки и проверки, а пару часов и с одной командой docker-compose up. 

Обновление Ruby и Rails

Обновление языка с версии 2.7 до 3.4 — это не линейный процесс. Работа строилась по принципу градиентного обновления. Мы не пытались установить всё сразу, а двигались шаг за шагом: поднимали минорную версию Ruby, затем соответствующую версию Rails, прогоняли тесты, фиксили баги и переходили к следующей версии.

В процессе постоянно возникали конфликты между версиями разных инструментов. Например, сломалась загрузка картинок: библиотека kt-paperclip начала вести себя непредсказуемо. Оказалось, что она вызывала метод из другой, очень старой и всеми почти забытой библиотеке, которая подменяла стандартный метод Rails своим собственным (monkey patching). Мы устранили этот конфликт и вернули системе предсказуемость.

Аутстаффинг разработки на Ruby on Rails позволяет сосредоточиться на развитии продукта без накопления технического долга. Свяжитесь с нами, чтобы обсудить, как мы можем усилить вашу команду и освободить время для интересных задач.

Некоторые библиотеки были слишком старыми, последние пулл реквесты в них случились годы назад. В таким случаях мы создавали их форки и приводили к нужному нам состоянию, исправляя конфликты. Таким образом, например, мы адаптировали i18n-transformer и gem_russian.

Главным вызовом проекта стало изменение синтаксиса Ruby 3.0, где разделили позиционные и именованные аргументы. 

Автоматические скрипты здесь были бессильны: слишком велик риск, что робот пропустит нюанс бизнес-логики, и виджеты или модерация сломаются. Поэтому мы вручную проверили pull request содержащий 20 000 строк изменений вместе со специалистами и CTO заказчика. Конечно, это мы отвлекли специалистов, но на гораздо более короткое время, чем если бы они сами занимались этой задачей.

Zero-downtime обновление БД

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

Однако разработчики библиотеки mongoid сами сломали логику в минорном обновлении: изменился синтаксис запросов и подходы к валидациям атрибутов при сохранении документов

Официального фикса создатели библиотеки не планировали, а переписывание всей логики работы с БД заняло бы месяцы. Поэтому мы спустились на уровень исходного кода mongoid, нашли проблемный коммит и написали точечный патч, вернув драйверу старую логику валидации. Это позволило продолжить обновление без даунтайма.

Ускорение тестов и DevOps

Изначально тесты (а их было 1500) занимали 25 минут, потому что при каждом запуске они обрабатывали тяжелые изображения. 

Мы выстроили CI/CD пайплайн и настроили параллельный запуск тестов в 4 потока на Drone CI и облегчили Docker-образы, уменьшив их вес с 1.2 ГБ до 640 МБ. Время прогона тестов сократилось до 10 минут, а неоптимальный код теперь не будет допущен в продакшен.

Результат — техническая свобода

За 3,5 месяца мы обновили инструменты разработки, а также помогли команде с другими мелкими проблемами в процессе. По отзывам работать стало приятнее и проще. 

Стек теперь актуален: Ruby 3.4 + Rails 8.0.3. Система стабильна, безопасна и готова к нагрузкам. В перспективе команда может обновиться до свежей Ruby 4.x, если это будет необходимо.

Быстрое развертывание через Docker избавило команду от привязки к железу и упростило воспроизводимость ошибок. Новые разработчики смогут быстро приступать к работе: не нужно устанавливать инструменты локально, все зависимости описаны в Dockerfile, не нужно вручную настраивать базы данных, очереди и т.д. Легко добавить новые сервисы (Elasticsearch, Sidekiq и т.д.)

Главное — мы помогли стратегическим планам сбыться. За счет обновления RoR и нового развертывания легко добавлять новые сервисы для разработчиков и реализовывать нужные фичи. Команда Аплаут уже начала долгожданный перенос фронтенда на React и миграцию на PostgreSQL.

У вас тоже есть «неподъемное» легаси?

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

Будем на связи
Прикрепить файл
Максимальный размер файла: 8 МБ.
Допустимые типы файлов: jpg jpeg png txt rtf pdf doc docx ppt pptx.