Switch Ministra legacy routing to runtime nginx toggle and remove symlink lifecycle operations from settings and root signals handling. Also harden portal auth/profile handling for browser STB emulation and close migration task L-6. Co-authored-by: Copilot <copilot@github.com>
14 KiB
XC_VM - Рабочий план миграции
Архитектурные правила: см. ARCHITECTURE.md. Этот файл хранит только незавершенные задачи и фактический статус на сегодня. Последнее обновление: 2026-05-01.
1. Почему файл переписан
Предыдущая версия была полезной как исторический контекст, но в текущем виде она опасна для исполнения:
- В ней есть устаревшие факты по runtime-зависимостям (часть уже мигрирована, часть нет).
- В ней есть противоречия по статусам (например, L-4 одновременно закрыта и фигурирует в активной волне).
- В ней нет жесткого критического пути с измеримыми gate-критериями по каждой волне.
Итог: такой документ провоцирует неверный порядок работ и регрессии.
2. Проверенный текущий статус (факты)
2.1. Что реально сделано
- L-4 выполнена:
src/infrastructure/legacy/отсутствует. - L-2 выполнена частично и стабилизирована.
- Есть
WebApiBootstrapиStreamingRequestBootstrap. - Front controller использует новые bootstrap-классы для API path.
status-команда используетStreamingRequestBootstrap::init('status').src/www/init.phpиsrc/www/stream/init.phpпока остаются compatibility-слоем.- L-3R закрыта:
AdminTableControllerбольше не подключает proceduraltable.phpнапрямую.
2.2. Что все еще блокирует удаление src/www/
| Зона | Факт | Риск |
|---|---|---|
| Nginx MAIN | src/bin/nginx/conf/nginx.conf использует root /home/xc_vm/www/ и rewrite на www/*.php/www/stream/*.php |
Нельзя удалить www без outage |
| Nginx LB | lb_configs/nginx.conf использует root /home/xc_vm/www/ и rewrite на /stream/*.php |
LB останется привязан к www |
| Certbot | src/cli/Commands/CertbotCommand.php использует --webroot -w /home/xc_vm/www/ |
Поломка issue/renew при cutover |
| Ministra runtime | src/ministra/portal.php использует StreamingRequestBootstrap::init('portal') напрямую |
|
| Ministra lifecycle | RootSignalsCronJob и SettingsService больше не управляют symlink www/c и www/portal.php |
2.3. Модули: состояние интеграции
ModuleLoaderреализован, но web boot модулей в front controller не подключен.- В web-контексте нет вызова
loadAll() + bootAll(...)до dispatch. - Маршрут
modulesхардкодится вsrc/public/routes/admin.php. - Пункт
Modulesхардкодится вsrc/public/Views/admin/header.php. - В
module.jsonфактически только базовые поля (requires_coreбез v2-метаданных). CoreCodePatchableModuleInterfaceиCoreCodePatcherостаются рабочим механизмом (временный stopgap не выведен из эксплуатации).
2.4. Статус L-3R и остаточный долг
- Маршрут
tableидет напрямую вTableController, без дополнительной прослойкиAdminTableController/AdminTableRenderer. public/Views/admin/table.phpудален, procedural endpoint временно размещен вTableController::index().- Вспомогательная прослойка
AdminTableRequestContextудалена как лишняя после консолидации.
Вывод: L-3R закрыта, L-3D в прогрессе. Основной остаточный долг: декомпозиция query/branch-логики.
3. Активный backlog (приоритизирован)
| ID | Приоритет | Задача | Блокер | Definition of Done |
|---|---|---|---|---|
Закрыто. TableController::index() — thin switch-dispatcher. 45 веток → private-методы. filterRow → private static. |
||||
www |
Закрыто. Nginx не роутит в www/*.php; certbot не использует /home/xc_vm/www/. |
|||
www/c и www/portal.php |
Закрыто. portal.php использует StreamingRequestBootstrap::init('portal'). Symlink-операции удалены из RootSignalsCronJob и SettingsService. |
|||
| M-1 | P1 | Включить web boot модулей | Нет | В web-контексте реально вызываются loadAll() и bootAll() |
| M-2 | P1 | Убрать хардкод модульных маршрутов и меню | M-1 | Ядро не содержит статических route/menu для модулей |
| M-3 | P1 | Ввести navbar extension points | M-2 | Модули добавляют навигацию декларативно |
| M-4 | P1 | Manifest v2 и порядок загрузки | M-1 | Поддерживаются environment, dependencies, has_navbar, has_settings |
| M-5 | P2 | Убрать core patching как основной путь расширения | M-2, M-3 | Новые модули не используют patching для core/public |
| M-6 | P2 | Перевести Ministra в модульные runtime/assets правила | L-6, M-4 | Ministra не отдельный legacy-остров |
| L-7 | P0 | Финальное удаление src/www/ |
L-5, L-6 | В репозитории нет src/www/; smoke-check чистый |
4. Критический путь (обязательный порядок)
- L-5
- L-6
- M-1
- M-2
- M-3 и M-4 (параллельно после M-2/M-1)
- M-5
- M-6
- L-7
Запрет: удалять src/www/ до закрытия L-5 и L-6.
5. План исполнения по волнам
Волна A - Infra cutover (www как runtime должен перестать быть обязательным)
L-5. HTTP + certbot cutover
Изменения:
- Перевести rewrite/location в
src/bin/nginx/conf/nginx.confс прямыхwww/*.phpна front controller или новые owner endpoints. - Синхронизировать эквивалентные правки в
lb_configs/nginx.conf. - Вынести certbot webroot из
/home/xc_vm/www/в техническую директорию (certbot-webroot) и обновитьCertbotCommand. - Проверить, что legacy rewrite больше не указывают на
www/playlist.php,www/epg.php,www/player_api.php,www/probe.php,www/stream/*.php,www/admin/*.php.
Проверка:
nginx -tдля MAIN и LB.- smoke API:
player_api,epg,playlist,enigma2,probe. - smoke streaming:
live,vod,timeshift,subtitle,thumb,auth,key,segment. - dry-run certbot и реальный renew path.
Rollback:
- Вернуть предыдущие nginx-конфиги.
- Вернуть старый certbot webroot.
Волна B - Ministra развязка
L-6. Убрать файловые symlink-зависимости от www
Изменения:
- Убрать прямой
require '/home/xc_vm/www/stream/init.php'вsrc/ministra/portal.php; перейти на новый bootstrap path. - Удалить логику создания/удаления
www/cиwww/portal.phpизRootSignalsCronJobиSettingsService. - Перенести MAG legacy redirect в nginx/location/alias или модульный runtime path без файловых операций в
www.
Проверка:
/c/portal.phpработает.- MAG redirect работает при
mag_legacy_redirect=1. - Переключение настройки не создает/удаляет объекты внутри
www.
Rollback:
- Временно вернуть старую symlink-схему через сигнал.
- Сохранить предыдущее поведение до следующего релиза.
Волна C - Модульный cutover
M-1. Web boot модулей
Изменения:
- Подключить
ModuleLoaderв web flow до dispatch. - Вызывать
loadAll()иbootAll($container, $router)в корректной точке инициализации.
Проверка:
- Маршруты модулей реально регистрируются без ручного route-хардкода.
- Event subscribers модулей реально подписаны.
M-2. Удалить хардкод module routes/menu в ядре
Изменения:
- Убрать статический
modulesroute изsrc/public/routes/admin.php. - Убрать статический пункт
Modulesизsrc/public/Views/admin/header.php. - Обеспечить добавление через модульный контракт.
Проверка:
- Отключение модуля не требует правки ядра.
- Включение модуля добавляет route/menu автоматически.
M-3. Navbar extension points
Изменения:
- Ввести контракт/DTO для navbar entries.
- Добавить builder в core/http слой.
- Перевести текущие модульные пункты на декларативный путь.
M-4. Manifest v2 + dependency sort
Изменения:
- Расширить
module.jsonдо полей:environment,dependencies,has_navbar,has_settings. - Добавить сортировку загрузки по зависимостям.
- Добавить fail-fast при циклических зависимостях.
Проверка M-3/M-4:
- Модуль с unmet dependency не загружается и дает явную ошибку.
- Порядок boot детерминирован и повторяем.
M-5. Вывод CoreCodePatcher из основного пути расширения
Изменения:
- Для текущих модулей заменить patching на новые hook points.
- Ограничить patching как временный legacy-only путь.
Проверка:
- Новые модули проходят review без
CoreCodePatchableModuleInterface.
M-6. Ministra как модуль
Изменения:
- Перевести runtime/assets Ministra на модульные правила.
- Исключить отдельный legacy owner path.
Проверка:
- Ministra включается/отключается через модульный lifecycle, без вмешательства в
www.
Волна D - Финальное удаление src/www/
L-7. Удаление compatibility-слоя
Изменения:
- Один релиз держать
wwwв compatibility-only режиме. - Подтвердить, что продовый трафик ушел со старых URL.
- Удалять по порядку:
www/admin/*,www/stream/*, затем корневые legacy endpoints. - Удалить директорию
src/www/.
Проверка:
- Нет call sites на
src/www/**. - smoke-check по всем контурам зеленый.
php src/console.php --listи критичные cron-команды работают.
Rollback:
- В рамках релиза вернуть compatibility layer из release branch.
6. Обязательная smoke-check матрица
| Контур | Минимум проверки |
|---|---|
| bootstrap | admin login, reseller login, player login, console.php --list |
| API | player_api, epg, playlist, enigma2, reseller AJAX |
| streaming | live, vod, timeshift, subtitle, thumb, auth, key, segment |
| Ministra | /c/portal.php, MAG redirect, portal auth |
| infra | nginx -t, nginx reload, certbot issue/renew |
7. Gate-критерии между волнами
- Gate A (после L-5): нет nginx rewrite в
www/*.php; certbot не использует/home/xc_vm/www/. - Gate B (после L-6): Ministra работает без symlink в
www. - Gate C (после M-4): web boot модулей активен, route/menu модулей не хардкодятся.
- Gate D (после L-7):
src/www/отсутствует, smoke-check полностью зеленый.
8. Текущее целевое окно работ
Итерация 1 (сейчас)
Закрыть L-5 полностью.- Подготовить PR только по infra/certbot cutover.
- Отдельно прогнать smoke-check и зафиксировать отчёт.
Итерация 2
Закрыть L-6 (Ministra отвязка отwww).- Перейти к модульной волне M-1/M-2.
9. Жесткие правила удаления
Любой legacy-файл удаляется только если одновременно выполнены все условия:
- Есть новый владелец или прямой заменяющий path.
- Все call sites переключены.
- Smoke-check пройден.
- Есть рабочий rollback на один релиз.
Если хотя бы одно условие не выполнено, удаление запрещено.