# Roadmap **MVP полностью реализован** — все этапы M0–M8 закрыты. Ниже — ретроспектива по этапам (как было задумано → что реально сделано, с честными пометками о расхождениях) и раздел [Backlog](#backlog-после-mvp) с тем, что осталось за рамками MVP осознанно. ## M0 — Каркас и инфраструктура ✅ - Solution (`PnvPanel.slnx`) + 4 проекта (Domain/Application/Infrastructure/Api), ссылки по Clean Architecture. - `Directory.Build.props`, `.editorconfig`, nullable включены. `dotnet format` — локальная команда, в CI **не** запускается (CI гоняет только build/test). - EF Core + Npgsql, миграции. - Scaffolding фронта: Vite + React + TS + Tailwind + shadcn-стиль поверх Radix + TanStack Query/Router; **тема light/dark/system** (провайдер + переключатель); i18n (RU/EN); dev-прокси `/api`,`/hubs` на бэк. - **Единый контейнер**: multi-stage Dockerfile (node → dotnet publish → aspnet), Api раздаёт SPA из `wwwroot` (fallback на `index.html`); docker-compose `app` + `db` (PostgreSQL); `ForwardedHeaders` (TLS — внешним прокси); авто-применение миграций на старте. - Health-check `/health`, Serilog, нативный OpenAPI (`Microsoft.AspNetCore.OpenApi`) + Scalar (без Swashbuckle). - **CI (GitHub Actions)**: `dotnet build/test` + `pnpm build/lint/typecheck` (без деплоя). - **Готово, когда**: единый образ поднимается в docker-compose рядом с postgres, отдаёт SPA и `/health`, есть миграции, CI зелёный. ✅ Достигнуто — включая полную проверку `docker compose up` end-to-end. ## M1 — Аутентификация и сидинг ✅ - ASP.NET Core Identity (`AppUser`/`AppRole` c `MaxConfigs`); `DbInitializer`: системные роли `admin`/`user` и учётка админа из env ([`.env.example`](../.env.example)). - **Вход по username** (email не используется); JWT access + refresh (httpOnly cookie, ротация, `Secure` по факту HTTPS-запроса, хранение хэшей), Identity lockout, rate-limit на `/auth/*`; смена пароля. Явного анти-CSRF токена нет — обоснование в [architecture.md](architecture.md#безопасность). - Регистрация: новый пользователь → роль `user`, `IsActivated = false`. - Фронт: страницы login/register (username), стор авторизации, refresh-flow, guard-маршруты. - **Готово, когда**: регистрация/вход/refresh/logout по username работают, админ засидан, новый юзер неактивен. ✅ Достигнуто. ## M2 — Роли и активация ✅ - Домен: динамические роли (CRUD, квота `MaxConfigs`), `ActivationRequest`. - Команды/запросы: CreateRole/UpdateRole/DeleteRole, ChangeUserRole (одна роль), RequestActivation (с комментарием), ApproveActivation/RejectActivation. - Эндпоинты активации (user + admin) и ролей; проверка активации/роли — inline в хендлерах и `RequireAuthorization(...)` на эндпоинте, без отдельных именованных policy. - Фронт: экран «запросить активацию» (с комментарием), админ-очередь запросов, управление ролями/назначением. - **Готово, когда**: юзер запрашивает активацию с комментарием, админ на сайте активирует; роли с квотами работают. ✅ Достигнуто. ## M3 — Ноды и публикация inbounds (по ролям) ✅ - Домен `Node`/`Inbound` (+ `AllowedRoles`, `DisplayName`); порт `IXuiPanelGateway` + единственная реализация `XuiPanelGateway` (кэш клиента per-node внутри неё, `ThreeXui.Net`); шифрование секретов нод (`ISecretProtector`/ASP.NET Data Protection). - Команды/запросы: RegisterNode, UpdateNode, DeleteNode, SyncNode, ProbeNode, ListNodes, ListInbounds, PublishInbound (с выбором ролей). - Админка нод/инбаундов на фронте (публикация с `displayName` и `allowedRoleIds`). - **Готово, когда**: админ подключает реальную 3x-ui и публикует inbound для выбранных ролей. ✅ Достигнуто (удаление ноды с активными конфигами пока не блокируется — известный пробел, см. [tech-stack.md](tech-stack.md)). ## M4 — Конфиги пользователя (ядро продукта) ✅ - Домен `VpnConfig` (создание, отзыв, ротация; инварианты: активирован + квота роли (грандфазеринг) + доступ роли к инбаунду; квота — под `pg_advisory_xact_lock`; схема `ClientEmail`). - CreateVpnConfig (с `label`/`deviceLimit`→`limitIp`), EditVpnConfig, RotateVpnConfig, RevokeVpnConfig, GetMyConfigs, GetConfigLink, ListAvailableInbounds; connection string по запросу (не сразу при создании), QR строится на фронте. - Подписка: один эндпоинт `/sub/{token}` — токен либо агрегированный (`AppUser.SubscriptionToken`, все конфиги), либо по одному конфигу (`VpnConfig.SubscriptionToken`); заголовки `Subscription-Userinfo` / `Profile-Update-Interval`. - Самоудаление аккаунта (`DELETE /api/auth/me`): отзыв всех активных конфигов + удаление `AppUser`. - Каталог приложений `ClientApp` (домен + `GET /api/apps` по ОС; сид из `seed/client-apps.json`) + **страница инструкций** на фронте. - Фронт: дашборд (метки, лимит устройств), создание/редактирование, страница инструкций, ссылка/QR по кнопке, отзыв, перевыпуск, настройки аккаунта. - **Готово, когда**: активированный юзер создаёт рабочий конфиг в доступном инбаунде в пределах квоты; работает подписка. ✅ Достигнуто. Лимиты трафика/срока конфига — не реализованы, backlog (см. [domain-model.md](domain-model.md)). ## M5 — Синхронизация трафика и realtime ✅ - `TrafficSyncService` (обход включённых нод, обновление трафика, `TrafficSample`) — только для отображения, без активной реконсиляции дрейфа (недоступная нода/незнакомый клиент — тихо пропускаются). - `NodeHealthCheckService`; `TrafficRetentionService` (TTL-чистка истории). - SignalR `PanelHub` + `IRealtimeNotifier` (реализован в `Api/Hubs/`, не в Infrastructure); события `configTrafficUpdated`/`configStatusChanged`/`nodeStatusChanged`/`activationRequested`/`userActivated`. - Фронт: живые обновления трафика/статусов без перезагрузки. Реакции на превышение лимита/срока нет — таких лимитов не существует (см. M4). - **Готово, когда**: трафик и статусы обновляются в UI без перезагрузки. ✅ Достигнуто. ## M6 — Админ-статистика, управление пользователями, аудит ✅ - ListUsers, BlockUser (→ отключение конфигов в 3x-ui) / UnblockUser (два отдельных эндпоинта), ChangeUserRole, ResetUserPassword, GetUserConfigs, ForceRevokeConfig, GetStats. - `AuditLog`: запись значимых действий (активация, блокировка, смена роли, ноды/инбаунды — источник всегда `Web`, т.к. пишется из тех же хендлеров, что вызывает и бот) + эндпоинт `/api/admin/audit`. - Каталог приложений: админ-CRUD `ClientApp` (`/api/admin/apps`) — название, ссылка, ОС, порядок, вкл/выкл. - Фронт: таблицы пользователей/ролей/нод/приложений (обычные `