Задача
Заказчик пришёл уже с живым сайтом. Для слушателя продукт выглядел рабочим: плеер, разделы, контент. Для эксплуатации картина была другой — сайт постоянно находился в зоне операционного риска.
Новое Радио: новый backend и стабильный эфир без переписывания сайта
Заказчик пришёл уже с живым сайтом. Для слушателя продукт выглядел рабочим: плеер, разделы, контент. Для эксплуатации картина была другой — сайт постоянно находился в зоне операционного риска.
Заказчик пришёл уже с живым сайтом. Для слушателя продукт выглядел рабочим: плеер, разделы, контент. Для эксплуатации картина была другой — сайт постоянно находился в зоне операционного риска.
На входе:
novoeradio.by;Отдельно важно: рядом существовал второй сайт narodnoeradio.by — по сути копия 1в1 с другим брендом. Это сразу ставило требование не плодить два независимых backend’а, а заложить white-label модель.
Нужно было не «подкрутить Node и надеяться», а:

Работу начали не с «сразу пишем новый сервис», а с короткой инженерной цепочки. Это позволило согласовать решение до старта разработки и не расползтись по scope.
Неглубокий, но достаточный разбор подтвердил главное:
Вывод: обновление Node само по себе проблему не закроет. Нужен новый backend с разделением ответственности.
Ключевой вопрос заказчика: придётся ли переписывать сайт целиком.
Ответ: фронт переиспользуем (сложность средняя), если аккуратно сохранить внешние контракты API и канала обновлений эфира.
Целевой стек:
Первый логичный вынос из монолита: получение метаданных эфира и рассылка обновлений слушателям.
Миграция — поэтапная: сначала критичный realtime-контур, затем контентный backend, затем вывод старого стека из эксплуатации.
Полноценный аудит зафиксировал вердикт: backend в предаварийном состоянии.
На уровне категорий находок:
Отдельно зафиксировали план временной стабилизации на период до запуска нового backend — чтобы не «чинить продакшен бесконечными патчами» вместо целевой замены.
На этом шаге сдвинулись с чистой техники на структуру продукта. В ТЗ нужно было отразить не только сервер, но и то, что сайт реально отдаёт слушателю и редакции:
Именно здесь зафиксировали, что второй сайт — не «отдельный проект», а второй бренд на общей платформе.
Собрали ТЗ под согласованные решения:
Сквозной тезис всей цепочки: ломается не от нагрузки — от архитектуры и дисциплины эксплуатации.
Главный риск миграции — не «какой язык выбрать», а сохранение контрактов между фронтом и backend.

В итоге сайт переведён на связку с раздельными ролями под нагрузку и удобство сопровождения.
Упрощённо система состоит из четырёх слоёв:
В production страницы, API, медиа и канал обновлений эфира доступны с одного адреса сайта — через единую точку входа.
Рабочий путь — Symfony + Go + React. Старый backend использовался как эталон поведения на время миграции и затем выведен из боевого контура.

React — лицо сайта
В production интерфейс собирается и отдаётся вместе с основным приложением. В разработке фронт можно поднимать отдельно для удобства правок.
PHP / Symfony — контент и редакция
PHP — основной источник правды по материалам сайта и инструмент редакции. Это замена прежней схемы управления контентом на Node.
Go — эфир «здесь и сейчас» Go выбран для задач, где важны постоянная фоновая работа и много одновременных подключений:
База и медиа
Именно поэтому realtime вынесен отдельно: постоянное сопровождение эфира и рассылка обновлений — нагрузка другого типа, чем «открыть новость» или «сохранить баннер».

Проект поддерживает два основных контура.
Development — для команды: backend, база, realtime, удобная разработка фронта и безопасная проверка писем/подписок без отправки «в бой». Production — основное приложение, realtime-сервис, база, постоянное хранение медиа, HTTPS и маршрутизация запросов к нужному контуру.
Окружения воспроизводимы через Docker: одинаковая логика запуска у разработчиков и на сервере, при этом секреты и параметры среды не хранятся в коде.
Публичный сайт
Панель редакции Редакция работает в веб-интерфейсе на Symfony: создание и правка материалов, загрузка файлов, управление сущностями сайта — без прежней хрупкой схемы на Node.
Мультибренд Один код и общая логика; разные brand-config для Novoe и Narodnoe — цвета, оформление, бренд-параметры — без дублирования backend-логики.
Заказчик получил не косметический фикс нестабильного Node-приложения, а новую эксплуатационную модель сайта радиостанции:

Заказчик получил не косметический фикс нестабильного Node-приложения, а новую эксплуатационную модель сайта радиостанции. Это типичный сценарий для digital-продукта, который «вроде работает», но уже находится в зоне постоянного операционного риска. Сначала — честный аудит и контракты. Затем — целевая архитектура под реальные роли нагрузки.