Задача: Локально развернуть исходный Ruby-сайт
Локально развернуть исходный Ruby-сайт
Локальная копия исходного Ruby-сайта поднята и используется как резервная эталонная среда для сверки при миграции.
Цель
Получить рабочую локальную копию исходного Ruby-сайта, чтобы можно было безопасно изучать текущую реализацию, сравнивать поведение до и после миграции и разрабатывать перенос на haih-cms без зависимости от production-среды.
Что сделать
- Получить исходный код legacy Ruby-проекта из доступного рабочего источника.
- Определить используемую версию Ruby, Bundler и ключевые зависимости проекта.
- Установить необходимые локальные зависимости и добиться успешной установки bundle.
- Определить требования к базе данных, файловому хранилищу и другим локальным сервисам.
- Подготовить локальную конфигурацию приложения без переноса production-секретов в открытые файлы или задачи.
- При необходимости подготовить безопасный локальный набор данных или другой способ воспроизвести основные публичные сценарии сайта.
- Запустить приложение локально и проверить загрузку главной страницы, ключевых разделов, типовых страниц и основных публичных сценариев.
- Зафиксировать особенности запуска, несовместимости старых зависимостей и технические блокеры, которые могут влиять на миграцию.
- Подготовить краткую воспроизводимую инструкцию локального запуска для дальнейшей работы с проектом.
Результат
Исходный Ruby-сайт запускается локально в воспроизводимом окружении и может использоваться как эталон при миграции на haih-cms.
Критерии готовности
- Проект устанавливается и стартует локально.
- Определены версии Ruby и основных зависимостей.
- Основные публичные страницы открываются.
- Известны необходимые локальные сервисы и зависимости.
- Есть понятная инструкция повторного запуска.
- Все обнаруженные технические ограничения, способные повлиять на миграцию, зафиксированы.
Ограничения
Не публиковать пароли, токены, ключи, production-конфигурацию, закрытые дампы баз данных, персональные данные и иные чувствительные сведения. Если для локального запуска нужны такие данные, конкретные значения обсуждаются и передаются только вне открытой карточки задачи.
Ворклоги
Локальный запуск legacy Ruby-сайта выполнен
Старый bizneshelper.ru успешно запущен локально в Docker.
Подтверждённая конфигурация legacy-среды
- Ruby on Rails 3.2.21.
- На исходном сервере использовался Ruby 2.2.5 через Passenger.
- Для контейнера использован Ruby 2.2.10 как совместимая версия той же ветки.
- Bundler 1.15.4.
- MySQL используется как внешняя уже поднятая служба.
- Сайт запускается в production-окружении.
Что было сделано
- Подготовлен Dockerfile для старого Ruby-стека на базе Ruby 2.2.10.
- Для Debian Jessie переключены apt-источники на архивные репозитории, так как штатные репозитории этой версии больше недоступны.
- Установлены необходимые системные зависимости для сборки legacy-гемов и работы MySQL/libv8.
- Сервис
bizneshelperдобавлен в docker-compose и подключён к существующей MySQL-службе через переменные окружения. - Настроен отдельный локальный порт для доступа к приложению.
- В
database.ymlдобавлена поддержка подключения к MySQL по host вместо локального Unix socket. - Версия
ckeditorпонижена до совместимой с Rails 3.2 ветки. - Подтверждено, что наличие Rails 5-ориентированных каталогов
app/channelsиapp/jobsне блокирует запуск при текущей production-конфигурации с отключённой агрессивной загрузкой классов.
Обнаруженные особенности и риски
- Debian Jessie требует использования архивных репозиториев и специальных параметров установки пакетов.
- Часть legacy-гемов несовместима с современными версиями библиотек и требует фиксации старых версий.
mysql2старой ветки чувствителен к окружению и способу подключения к MySQL.ckeditorв более новой версии использует API Rails 4+ и поэтому должен быть зафиксирован на совместимой версии.- В исходном проекте присутствуют артефакты более новых Rails-версий, что указывает на исторические изменения проекта и требует осторожности при автоматической миграции кода.
Результат
Legacy-сайт воспроизводимо запускается локально и доступен как эталон для дальнейшей инвентаризации, сравнения поведения и миграции на haih-cms.
Что проверить далее
- Полноту отображения ключевых страниц и форм.
- Работу поиска с Solr.
- Корректность загрузки legacy-медиа.
- Поведение админки.
- Фактические маршруты, friendly_id и редиректы.
- Соответствие локальной базы исходной структуре данных.
В открытом worklog не фиксируются пароли, локальные абсолютные пути и иные чувствительные параметры среды.
Уточнение по воспроизводимости Docker-запуска
При перезапуске контейнера обнаружена типичная для legacy Rails проблема: приложение пишет runtime-файлы непосредственно внутрь дерева проекта, которое целиком подключено в контейнер как bind-mount.
Обнаруженная ошибка
Rails отказывался стартовать с сообщением A server is already running, потому что после предыдущего запуска в tmp/pids/ сохранялся server.pid. При аварийной остановке или пересоздании контейнера этот файл оставался на хостовой файловой системе вместе с проектом.
Причина
В контейнер монтируется весь каталог сайта. Это создаёт сразу два эффекта:
- Содержимое, подготовленное в образе внутри каталога приложения, может быть перекрыто bind-mount содержимым хоста после старта контейнера. Поэтому установку зависимостей, завязанную на состояние смонтированного проекта, нельзя надёжно считать завершённой только на этапе сборки Dockerfile.
- Runtime-файлы Rails (
tmp/pidsи потенциально другие временные данные) сохраняются внутри смонтированного каталога и переживают жизненный цикл контейнера. Старый PID-файл затем блокирует новый запуск.
Принятое решение
Команда запуска сервиса дополнена подготовительным шагом:
rm -rf /app/tmp/pids/ && (bundle check || bundle install --frozen) && bundle exec rails server -b 0.0.0.0
Логика запуска теперь такая:
- перед стартом удаляются старые PID-файлы Rails;
bundle checkбыстро проверяет наличие нужных гемов;bundle install --frozenвыполняется только если зависимости отсутствуют или неполны;- после подготовки запускается Rails-сервер, слушающий интерфейс контейнера.
Архитектурный вывод
Текущая Docker-схема ориентирована на максимально прямое воспроизведение legacy-проекта через bind-mount исходников, а не на полностью immutable-образ. Для исследовательской миграционной среды это допустимо, но важно учитывать, что состояние проекта и runtime-контейнера частично смешиваются.
При дальнейшем использовании окружения стоит отдельно контролировать каталоги tmp, log, загружаемые файлы и зависимости, чтобы временные файлы legacy-приложения не влияли на повторяемость запуска. Если окружение потребуется использовать длительно или передавать другим разработчикам, имеет смысл вынести изменяемые runtime-каталоги в отдельные volumes либо исключить их из bind-mount схемы.
Результат
После изменения команды запуска контейнер корректно переживает повторные старты и сам восстанавливает недостающие зависимости без ручного удаления Rails PID-файлов.