docs: update MIGRATION.md with known gaps and TODO section

- Add Section 11: Known gaps and TODO items
- Document BalancerCommand sentinel bug
- List remaining migration tasks
This commit is contained in:
Divarion-D
2026-03-18 20:33:51 +03:00
parent c1c447e539
commit ed9f162b89

View File

@@ -15,6 +15,7 @@
8. [Фаза 15: Удаление includes/admin.php](#8-фаза-15-удаление-includesadminphp)
9. [Порядок выполнения и риск-матрица](#9-порядок-выполнения-и-риск-матрица)
10. [Стратегия миграции по рискам](#10-стратегия-миграции-по-рискам)
11. [Известные пробелы и TODO](#11-известные-пробелы-и-todo)
---
@@ -371,36 +372,37 @@ php /home/xc_vm/console.php cron:servers
#### Шаг 12.2 — Миграция includes/cli/ → cli/Commands/ ✅
**Результат:** 24 файла из `includes/cli/` → 26 Command-классов в `cli/Commands/`. Вся логика перенесена, proxy-файлы были созданы, затем удалены (шаг 12.6).
**Результат:** 24 файла из `includes/cli/` → 24 Command-класса в `cli/Commands/` + 2 модульных команды + 2 новых. Итого 26 команд (24 core + 2 module). Вся логика перенесена, proxy-файлы были созданы, затем удалены (шаг 12.6).
| Legacy файл | → Command | Тип |
|---|---|---|
| `startup.php` | `Commands/StartupCommand` | daemon |
| `watchdog.php` | `Commands/WatchdogCommand` | daemon |
| `signals.php` | `Commands/SignalsCommand` | daemon |
| `queue.php` | `Commands/QueueCommand` | daemon |
| `cache_handler.php` | `Commands/CacheHandlerCommand` | daemon |
| `connection_sync.php` | `Commands/ConnectionSyncCommand` | daemon |
| `monitor.php` | `Commands/MonitorCommand` | CLI |
| `scanner.php` | `Commands/ScannerCommand` | CLI |
| `balancer.php` | `Commands/BalancerCommand` | CLI |
| `migrate.php` | `Commands/MigrateCommand` | CLI |
| `tools.php` | `Commands/ToolsCommand` | CLI |
| `update.php` | `Commands/UpdateCommand` | CLI |
| `binaries.php` | `Commands/BinariesCommand` | CLI |
| `archive.php` | `Commands/ArchiveCommand` | CLI |
| `created.php` | `Commands/CreatedCommand` | CLI |
| `delay.php` | `Commands/DelayCommand` | CLI |
| `loopback.php` | `Commands/LoopbackCommand` | CLI |
| `llod.php` | `Commands/LlodCommand` | CLI |
| `ondemand.php` | `Commands/OndemandCommand` | CLI |
| `plex_item.php` | `Commands/PlexItemCommand` | CLI |
| `proxy.php` | `Commands/ProxyCommand` | CLI |
| `record.php` | `Commands/RecordCommand` | CLI |
| `thumbnail.php` | `Commands/ThumbnailCommand` | CLI |
| `watch_item.php` | `Commands/WatchItemCommand` | CLI |
| — | `Commands/CertbotCommand` | CLI |
| — | `Commands/ServiceCommand` | CLI |
| Legacy файл | → Command | Тип | Заметки |
|---|---|---|---|
| `startup.php` | `Commands/StartupCommand` | daemon | |
| `watchdog.php` | `Commands/WatchdogCommand` | daemon | |
| `signals.php` | `Commands/SignalsCommand` | daemon | |
| `queue.php` | `Commands/QueueCommand` | daemon | |
| `cache_handler.php` | `Commands/CacheHandlerCommand` | daemon | |
| ~~`connection_sync.php`~~ | — | — | Логика поглощена `MonitorCommand`, файл не создан |
| `monitor.php` | `Commands/MonitorCommand` | CLI | Включает connection sync |
| `scanner.php` | `Commands/ScannerCommand` | CLI | |
| `balancer.php` | `Commands/BalancerCommand` | CLI | |
| `migrate.php` | `Commands/MigrateCommand` | CLI | |
| `tools.php` | `Commands/ToolsCommand` | CLI | |
| `update.php` | `Commands/UpdateCommand` | CLI | |
| `binaries.php` | `Commands/BinariesCommand` | CLI | |
| `archive.php` | `Commands/ArchiveCommand` | CLI | |
| `created.php` | `Commands/CreatedCommand` | CLI | |
| `delay.php` | `Commands/DelayCommand` | CLI | |
| `loopback.php` | `Commands/LoopbackCommand` | CLI | |
| `llod.php` | `Commands/LlodCommand` | CLI | |
| `ondemand.php` | `Commands/OndemandCommand` | CLI | |
| `plex_item.php` | `modules/plex/PlexItemCommand` | CLI | Перемещён в модуль |
| `proxy.php` | `Commands/ProxyCommand` | CLI | |
| `record.php` | `Commands/RecordCommand` | CLI | |
| `thumbnail.php` | `Commands/ThumbnailCommand` | CLI | |
| `watch_item.php` | `modules/watch/WatchItemCommand` | CLI | Перемещён в модуль |
| — | `Commands/CertbotCommand` | CLI | Новый |
| — | `Commands/ServiceCommand` | CLI | Новый |
| `src/status` | `Commands/StatusCommand` | CLI | Из root-level скрипта (12.4) |
#### Шаг 12.3 — Миграция crons/ → cli/CronJobs/ ✅
@@ -439,8 +441,8 @@ php /home/xc_vm/console.php cron:servers
| Legacy | → | Статус |
|---|---|---|
| `src/service` (shell) | `console.php service:{start\|stop\|restart\|reload}` | ✅ ServiceCommand |
| `src/status` (PHP) | `console.php status` | ✅ StatusCommand |
| `src/tools` (PHP) | `console.php tools:{rescue\|access\|ports}` | ✅ ToolsCommand |
| `src/status` (PHP) | `console.php status` | ✅ StatusCommand — proxy удалён |
| `src/tools` (PHP) | `console.php tools:{rescue\|access\|ports}` | ✅ ToolsCommand — proxy удалён |
| `src/update` (Python) | Остаётся Python-скриптом | Без изменений |
#### Шаг 12.5 — Обновление daemons.sh и crontab ✅
@@ -457,7 +459,8 @@ php /home/xc_vm/console.php cron:servers
3.`includes/cli/`**папка удалена** (24 файла)
4. ✅ Makefile: 3 старые записи `includes/cli/` удалены из EXCLUDES
5.`php -l` — все 14 файлов проверены, синтаксис ОК
6.`crons/`**папка удалена** (25 proxy-файлов), см. шаг 12.8
6.`crons/`все 25 файлов удалены, директория удалена
7.`src/status`, `src/tools` — legacy-proxy файлы удалены, все вызовы заменены на `console.php`
**Паттерн замены:**
```
@@ -480,7 +483,7 @@ PHP_BIN . ' ' . MAIN_HOME . 'console.php command args'
2. ✅ Константа `CRON_PATH` удалена из `core/Config/Paths.php`
3. ✅ Мёртвый autoload-маппинг `EPG → crons/epg.php` удалён
4. ✅ Класс `EPG` восстановлен в `domain/Epg/EPG.php` (был потерян при proxy-конвертации)
5.`src/crons/`**папка удалена** (25 proxy-файлов)
5.`src/crons/`все 25 proxy-файлов удалены, директория `crons/` удалена. Класс `EPG` загружается из `domain/Epg/EPG.php`
6. ✅ Makefile: `crons` убран из `LB_DIRS`, 9 записей `crons/*.php` из `LB_FILES_TO_REMOVE`, 2 строки permissions
7. ✅ 8 CronJob-файлов (MAIN-only) добавлены в `LB_FILES_TO_REMOVE` + `file_exists()` guards в `console.php`
8.`MigrationRunner::runFileCleanup()` — теперь удаляет опустевшие директории
@@ -700,7 +703,7 @@ Overhead < 0.1ms (один array lookup).
|-------|----------|------|
| **v2.2** | Фаза 10 (удаление admin/) | ✅ Завершена |
| **v2.3** | Фаза 11 (API controllers) + Фаза 12 (CLI runner) + Фаза 13 (streaming) | ✅ Завершена |
| **v2.4** | Фаза 11 (API deletion) + Фаза 14 (CSS/JS partials) | 🟢 + 🟢 |
| **v2.4** | Фаза 11 (API deletion) + Фаза 14 (CSS/JS partials) + пробелы §11.111.3 | 🟢 + 🟢 + 🟡 |
| **v3.0** | Фаза 15 (удаление legacy bootstrap) | 🔴 Финальный milestone |
---
@@ -777,3 +780,70 @@ bootstrap.php (новый) includes/admin.php (старый legacy)
use_legacy_bootstrap = false ; true = откат на admin.php
use_legacy_api = false ; true = откат на admin_api.php switch
```
> **Статус:** `use_legacy_fallback` реализован в `public/index.php`. `use_legacy_bootstrap` и `use_legacy_api` — **только в документации**, в коде не реализованы. Будут добавлены при выполнении Фазы 15.
---
## 11. Известные пробелы и TODO
> Пробелы, обнаруженные при аудите (2026-03-17). Не входят в конкретную фазу, но блокируют полноценную работу модульной системы и чистоту кодовой базы.
### 11.1. ~~Legacy-остатки: `crons/epg.php`~~ ✅ RESOLVED
**Статус:****Решено.** Файл `crons/epg.php` удалён, директория `crons/` удалена. Proxy-файлы `src/status` и `src/tools` также удалены. Все вызовы заменены на `console.php`. Класс `EPG` загружается из `domain/Epg/EPG.php` через autoload.
**Удалённые файлы:** `src/crons/epg.php`, `src/status`, `src/tools`.
**Обновлённые call sites:** `StartupCommand`, `UpdateCommand`, `BalancerCommand`, `dashboard.php`, `install`, `test_installer`, `Makefile`, docs (6 файлов).
### 11.2. EventDispatcher не зарегистрирован в ServiceContainer
**Проблема:** `core/Events/EventDispatcher.php` существует как статический класс, но НЕ зарегистрирован в `bootstrap.php::populateContainer()` как сервис `events`.
**Следствие:** `ModuleInterface::getEventSubscribers()` не может быть реализован модулями — подписки не будут подхвачены, т.к. диспетчер не доступен через контейнер.
**Зарегистрированные сервисы:** `db`, `config`, `settings`, `servers`, `bouquets`, `categories`, `redis`, `translator`.
**TODO:** Зарегистрировать `events` в `populateContainer()` и вызывать `getEventSubscribers()` в `ModuleLoader::bootAll()`.
### 11.3. Navbar.php — модульная навигация
**Проблема:** `MODULE_SYSTEM_SPEC.md §6` описывает `core/Http/Navbar.php` (статический класс с `::registerFromModule()` и `::renderModuleItems()`). Файл **не создан**.
**Следствие:** Пункты навигации модулей (watch, plex, fingerprint, theft-detection) хардкодированы в `public/Views/admin/header.php` строки 273700. Новый модуль не может добавить себя в меню через `ModuleInterface`.
**TODO:** Создать `core/Http/Navbar.php`, добавить injection point в `header.php`, перенести хардкод навигации модулей в `modules/*/navbar.php`.
### 11.4. Module routes не загружаются в Front Controller
**Проблема:** `ModuleInterface::registerRoutes(Router $router)` объявлен в контракте, но `public/index.php` **не вызывает** `ModuleLoader::bootAll()` для регистрации маршрутов модулей. Модули могут регистрировать только CLI-команды (через `console.php`).
**Статус:** По текущему дизайну модули не добавляют admin-страницы — только CLI и API. Если это изменится, потребуется вызов `$moduleLoader->registerRoutes($router)` в FC.
### 11.5. Ministra JS — 84 файла не перемещены
**Проблема:** 84 JS-файла Ministra-портала остаются в `src/ministra/` корне (не в `modules/ministra/assets/`). Симлинк `www/c → ministra/` (создаётся `RootSignalsCronJob::enable_ministra`) ломается при перемещении.
**Зависимости:** Требуется nginx alias + изменения в signal handler. Отложено как 13.4.
### 11.6. BalancerCommand — sentinel проверяется на локальном сервере
**Проблема:** `BalancerCommand` после SSH-извлечения tar-архива на *удалённом* LB-сервере проверяет `file_exists(MAIN_HOME . 'console.php')` на *локальном* сервере. Проверка всегда `true` на MAIN, поэтому не обнаруживает реальные сбои деплоя на удалённой машине.
**Затронутые строки:** `cli/Commands/BalancerCommand.php` — два блока `if (file_exists(...))` после `ssh ... tar xzf`.
**TODO:** Заменить `file_exists()` на `ssh $host "test -f /home/xc_vm/console.php"` или проверять exit code SSH-команды tar.
### 11.7. Сводная таблица
| # | Пробел | Приоритет | Блокирует | Усилия |
|---|--------|-----------|-----------|--------|
| 11.1 | ~~`crons/epg.php` не удалён~~ ✅ | — | — | — |
| 11.2 | EventDispatcher не в контейнере | 🟡 Средний | Module event subscribers | 30 мин |
| 11.3 | Navbar.php не создан | 🟡 Средний | Module navigation | 24 ч |
| 11.4 | Module routes в FC | 🟢 Низкий | Ничего (by design) | — |
| 11.5 | Ministra JS не перемещены | 🟢 Низкий | Ничего | 24 ч |
| 11.6 | BalancerCommand sentinel на локальном хосте | 🟡 Средний | Ложный success при деплое LB | 30 мин |
| 11.511.6 (Phase 11) | Admin/Reseller REST API extraction | 🟡 Средний | Удаление `www/*.php` thin proxies | 816 ч |
| Phase 14 | CSS/JS partials (footer.php) | 🟢 Низкий | Ничего (frontend-only) | 48 ч |
| Phase 15 | Удаление `includes/admin.php` (~3060 стр.) | 🔴 Высокий | Финальный milestone v3.0 | 1632 ч |