Update .gitignore to include local environment files and expand README with project details, tech stack, documentation links, and project status.
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# Roadmap
|
||||
|
||||
Порядок реализации по этапам (milestones). Каждый этап — работоспособный инкремент.
|
||||
|
||||
## M0 — Каркас и инфраструктура
|
||||
- Solution + 4 проекта (Domain/Application/Infrastructure/Api), ссылки по Clean Architecture.
|
||||
- `Directory.Build.props`, `.editorconfig`, nullable + анализаторы, `dotnet format` в CI.
|
||||
- EF Core + Npgsql, первая миграция.
|
||||
- Scaffolding фронта: Vite + React + TS + Tailwind + shadcn/ui + TanStack Query/Router; dev-прокси `/api`,`/hubs` на бэк.
|
||||
- **Единый контейнер**: multi-stage Dockerfile (node → dotnet publish → aspnet), Api раздаёт SPA из
|
||||
`wwwroot` (fallback на `index.html`); docker-compose `app` + `db` (PostgreSQL).
|
||||
- Health-check `/health`, Serilog, OpenAPI + Scalar.
|
||||
- **Готово, когда**: единый образ поднимается в docker-compose рядом с postgres, отдаёт заглушку SPA и `/health`, есть базовая миграция.
|
||||
|
||||
## M1 — Аутентификация и сидинг
|
||||
- ASP.NET Core Identity (`AppUser`/`AppRole` c `MaxConfigs`); `DbInitializer`: системные роли
|
||||
`admin`/`user` и учётка админа + Telegram id админов из env ([`.env.example`](../.env.example)).
|
||||
- **Вход по username** (email не используется); JWT access + refresh (httpOnly cookie, ротация, хранение
|
||||
хэшей), CSRF на refresh, Identity lockout, rate-limit на `/auth/*`; смена пароля.
|
||||
- Регистрация: новый пользователь → роль `user`, `IsActivated = false`.
|
||||
- Фронт: страницы login/register (username), стор авторизации, refresh-flow, guard-маршруты.
|
||||
- **Готово, когда**: регистрация/вход/refresh/logout по username работают, админ засидан, новый юзер неактивен.
|
||||
|
||||
## M2 — Роли и активация
|
||||
- Домен: динамические роли (CRUD `admin`, квота `MaxConfigs`), `ActivationRequest`.
|
||||
- Команды/запросы: CreateRole/UpdateRole/DeleteRole, ChangeUserRole (одна роль), RequestActivation (с комментарием),
|
||||
ApproveActivation/RejectActivation.
|
||||
- Эндпоинты активации (user + admin) и ролей; policy `RequireActivated`.
|
||||
- Фронт: экран «запросить активацию» (с комментарием), админ-очередь запросов, управление ролями/назначением.
|
||||
- **Готово, когда**: юзер запрашивает активацию с комментарием, админ на сайте активирует; роли с квотами работают.
|
||||
|
||||
## M3 — Ноды и публикация inbounds (по ролям)
|
||||
- Домен `Node`/`Inbound` (+ `AllowedRoles`, `DisplayName`); порт `IXuiPanelGateway` + `XuiPanelGateway`
|
||||
(per-node клиент, ThreeXui.Net); шифрование секретов нод (`ISecretProtector`).
|
||||
- Команды/запросы: RegisterNode, SyncNode, Probe, ListNodes, ListInbounds, PublishInbound (с выбором ролей).
|
||||
- Админка нод/инбаундов на фронте (публикация с `displayName` и `allowedRoleIds`).
|
||||
- **Готово, когда**: админ подключает реальную 3x-ui и публикует inbound «Германия (Trojan)» для выбранных ролей.
|
||||
|
||||
## M4 — Конфиги пользователя (ядро продукта)
|
||||
- Домен `VpnConfig` (создание, отзыв, ротация, статусы; инварианты: активирован + квота роли (грандфазеринг)
|
||||
+ доступ роли к инбаунду; проверка квоты в транзакции; схема `ClientEmail`).
|
||||
- CreateVpnConfig (с `label`/`deviceLimit`→`limitIp`), EditVpnConfig, RotateVpnConfig, RevokeVpnConfig,
|
||||
GetMyConfigs, GetConfigLink, ListAvailableInbounds; connection string + QR.
|
||||
- Подписка: агрегированная `/sub/{userToken}` (все конфиги) + по конфигу `/sub/{configToken}`;
|
||||
заголовки `Subscription-Userinfo` / `profile-update-interval`.
|
||||
- Самоудаление аккаунта (`DELETE /api/auth/me`): отзыв всех конфигов + удаление данных.
|
||||
- Фронт: дашборд (метки, лимит устройств), создание/редактирование, инструкции подключения, копирование, QR, отзыв, перевыпуск, настройки аккаунта.
|
||||
- **Готово, когда**: активированный юзер создаёт рабочий конфиг в доступном инбаунде в пределах квоты; работает агрегированная подписка.
|
||||
|
||||
## M5 — Синхронизация трафика и realtime
|
||||
- `TrafficSyncService` (обход нод, обновление трафика/статусов, `TrafficSample`); реконсиляция дрейфа с 3x-ui.
|
||||
- `NodeHealthCheckService`; `TrafficRetentionService` (TTL-чистка истории).
|
||||
- SignalR `PanelHub` + `IRealtimeNotifier`; события трафика/статусов/нод/активации.
|
||||
- Фронт: живые прогресс-бары трафика, статусы онлайн, реакция на превышение лимита/срока.
|
||||
- **Готово, когда**: трафик и статусы обновляются в UI без перезагрузки.
|
||||
|
||||
## M6 — Админ-статистика, управление пользователями, аудит
|
||||
- ListUsers, BlockUser (→ отключение конфигов в 3x-ui) / UnblockUser, ChangeUserRole, ResetUserPassword (без привязки TG), GetUserConfigs, force-revoke, GetStats.
|
||||
- `AuditLog`: запись значимых действий (Web/Telegram/System) + эндпоинт `/api/admin/audit`.
|
||||
- Фронт: таблицы пользователей/конфигов/ролей, журнал аудита, графики трафика (Recharts), сводки.
|
||||
- **Готово, когда**: админ видит статистику и журнал, управляет пользователями/ролями/конфигами; блокировка гасит VPN.
|
||||
|
||||
## M7 — Telegram-бот
|
||||
- Библиотека Telegram.Bot, `TelegramBotHostedService` (long polling) в процессе Api, `IOptions<TelegramOptions>`.
|
||||
- Домен: поля Telegram у `AppUser`, `TelegramLinkToken`, `TelegramLoginRequest`.
|
||||
- Флоу привязки (`LinkTelegramCommand`) + эндпоинт `link-token`/`unlink`.
|
||||
- Passwordless-вход: `login-request` + подтверждение в боте (`ApproveTelegramLoginCommand`) → выпуск JWT; поллинг/SignalR-завершение на фронте.
|
||||
- Восстановление пароля через бота (`/resetpassword` → одноразовая ссылка на смену пароля).
|
||||
- Команды бота: `/start`, меню, «Мои конфиги» (`GetMyConfigsQuery`), «Открыть сайт», `/login`, `/unlink`, `/help`; QR в боте.
|
||||
- **Админ в боте**: уведомления о запросах активации + inline «Активировать/Отклонить», `/requests` (по Telegram id из env).
|
||||
- **DM-уведомления юзеру**: активация, отзыв конфига админом, блокировка (если Telegram привязан). Бот — read-only по конфигам.
|
||||
- Фронт: кнопки «Войти через Telegram» и «Привязать Telegram» (deep-link/QR + ожидание подтверждения).
|
||||
- **Готово, когда**: юзер привязывает Telegram, входит без пароля, видит конфиги; админ активирует запросы прямо в боте.
|
||||
|
||||
## M8 — Закалка (hardening)
|
||||
- Полный набор тестов (Domain/Application/Integration с Testcontainers).
|
||||
- Rate-limiting, аудит-лог действий, единообразные ProblemDetails, ретеншн `TrafficSample`.
|
||||
- Прод-конфиг docker-compose (secrets, миграции отдельным шагом, опц. reverse-proxy для TLS).
|
||||
- **Готово, когда**: зелёный CI, покрытие ключевых сценариев, готовность к деплою.
|
||||
|
||||
## Backlog (после MVP)
|
||||
- Полное самообслуживание в боте (создание/ротация/отзыв конфигов) — в MVP бот read-only.
|
||||
- Полная регистрация аккаунта через Telegram (в MVP — только привязка); Telegram Login Widget как альтернатива.
|
||||
- Тарифы/биллинг/платежи, автопродление, промокоды.
|
||||
- Реферальная программа; расширенные уведомления (через Telegram/веб — email в проекте не используется).
|
||||
- Балансировка/выбор оптимальной ноды, автоскейл.
|
||||
- OpenTelemetry-трейсинг, метрики, дашборды.
|
||||
- Вынос фоновых задач в Hangfire/Quartz; TimescaleDB для истории трафика.
|
||||
- Мультиязычность (RU/EN и далее).
|
||||
Reference in New Issue
Block a user