Update documentation and clarify MVP status
- Revised the CLAUDE.md and README.md files to reflect the current MVP status, emphasizing completed features and intentionally omitted elements such as traffic limits and billing. - Enhanced clarity in the documentation regarding the architecture, tech stack, and user roles. - Removed the outdated roadmap section and streamlined references to tech stack decisions. - Updated API design documentation to clarify the absence of versioning in the MVP and the handling of configuration details.
This commit is contained in:
+11
-13
@@ -44,14 +44,13 @@ PnvPanel — backend на **ASP.NET Core (.NET 10)** по принципам **C
|
||||
`Application`, реализуемые в `Infrastructure`.
|
||||
|
||||
### 1. `PnvPanel.Domain`
|
||||
Ядро без внешних зависимостей. Никакого диспетчера доменных событий нет — это сознательное упрощение
|
||||
относительно исходного плана, см. ниже.
|
||||
Ядро без внешних зависимостей. Диспетчера доменных событий нет — уведомления и аудит вызываются
|
||||
напрямую из CQRS-хендлеров (см. [domain-model.md](domain-model.md#уведомления-и-аудит-без-диспетчера-доменных-событий)).
|
||||
|
||||
- **Entities**: `Node`, `Inbound`, `VpnConfig`, `ActivationRequest`, `ClientApp`, `AuditLog`,
|
||||
`TelegramLinkToken`, `TelegramLoginRequest`, `TrafficSample` (см. [domain-model.md](domain-model.md)).
|
||||
- **Value Objects**: `NodeCredentials` (логин + зашифрованный пароль ноды). Это единственный VO —
|
||||
`TrafficLimit`/`ConnectionLink` из раннего плана не понадобились (лимиты трафика — backlog,
|
||||
connection string строит `IXuiPanelGateway` на лету).
|
||||
- **Value Objects**: `NodeCredentials` (логин + зашифрованный пароль ноды) — единственный VO;
|
||||
connection string строит `IXuiPanelGateway` на лету, лимиты трафика не реализованы.
|
||||
- **Enums**: `VpnProtocol`, `ConfigStatus`, `NodeStatus`, `ActivationStatus`, `AuditSource`,
|
||||
`TelegramLoginStatus`, `OsPlatform`.
|
||||
- **Domain Exceptions**: `DomainException` — брошенный при нарушении инварианта в самой сущности
|
||||
@@ -73,8 +72,7 @@ PnvPanel — backend на **ASP.NET Core (.NET 10)** по принципам **C
|
||||
- **Validators**: FluentValidation на команды, где есть что проверять помимо типов (не на все — см.
|
||||
[backend-conventions.md](backend-conventions.md)).
|
||||
- **DTO**: плоские `record`, конвертация из сущностей — статический метод `FromDomain(...)` на самом
|
||||
DTO. Mapster из исходного плана не пригодился — при таком числе полей ручной маппинг читается
|
||||
не хуже конфига маппера и не создаёт лишней зависимости.
|
||||
DTO, без маппера (Mapster/AutoMapper).
|
||||
- **Pipeline behaviors**: `ValidationBehavior`, `LoggingBehavior`, `UnitOfWorkBehavior` (транзакция +
|
||||
`SaveChangesAsync` на команду). Отдельного `AuthorizationBehavior` нет — авторизация (роль,
|
||||
активация) — это либо `RequireAuthorization()`/`RequireRole(...)` на эндпоинте, либо явная проверка
|
||||
@@ -162,12 +160,12 @@ POST /api/configs
|
||||
к ноде. Cookie-session и авто-переавторизация на 401 обеспечиваются самой `ThreeXui.Net`.
|
||||
- Ошибки панели маппятся в доменные/`Result`-ошибки; недоступная нода → `NodeStatus.Offline`, а не исключение наружу.
|
||||
- Операции мутации по клиентам сериализуются per-inbound (библиотека уже использует мьютексы; на нашей стороне — идемпотентные команды).
|
||||
- **Дрейф с 3x-ui в MVP не реконсилируется активно**: `TrafficSyncService` при недоступной ноде или
|
||||
- **Дрейф с 3x-ui активно не реконсилируется**: `TrafficSyncService` при недоступной ноде или
|
||||
при отсутствии клиента в ответе панели (`GetClientTrafficAsync`) просто пропускает его в этом цикле
|
||||
синхронизации — не помечает конфиг рассинхронизованным и не шлёт алерт. Если клиента удалили прямо
|
||||
в 3x-ui в обход панели, локальная запись `VpnConfig` продолжит существовать до следующего
|
||||
явного действия пользователя/админа (`Revoke`/`Rotate`), которое обнаружит несоответствие по ответу
|
||||
гейтвея. Активная сверка/алертинг по дрейфу — задел на будущее, не реализовано.
|
||||
гейтвея. Активной сверки/алертинга по дрейфу нет.
|
||||
|
||||
## Telegram-бот (presentation-адаптер)
|
||||
|
||||
@@ -204,8 +202,8 @@ POST /api/configs
|
||||
- **NodeHealthCheckService** — health-probe нод (`IXuiPanelGateway.ProbeAsync`), обновляет `NodeStatus`,
|
||||
шлёт `nodeStatusChanged` группе `admins`.
|
||||
- **TrafficRetentionService** — чистит `TrafficSample` старше N дней (TTL-ретеншн истории трафика).
|
||||
- Реализованы как обычные `BackgroundService` + `PeriodicTimer`, без внешнего джоб-раннера — для
|
||||
нагрузки MVP этого достаточно (см. [tech-stack.md](tech-stack.md)).
|
||||
- Реализованы как обычные `BackgroundService` + `PeriodicTimer`, без внешнего джоб-раннера
|
||||
(см. [tech-stack.md](tech-stack.md)).
|
||||
|
||||
## Сидирование и старт
|
||||
|
||||
@@ -302,8 +300,8 @@ PostgreSQL:
|
||||
вне нашего compose; `app` внутри отдаёт HTTP. Приложение доверяет `X-Forwarded-Proto/For` через
|
||||
`ForwardedHeaders`-middleware — иначе Secure-cookie и определение схемы за прокси работать не будут.
|
||||
Отдельный nginx/Caddy в compose **не** вводим.
|
||||
- **Миграции**: применяются **автоматически на старте** приложения (в MVP; при масштабировании на
|
||||
несколько инстансов — вынести в отдельный шаг/джобу).
|
||||
- **Миграции**: применяются **автоматически на старте** приложения. При масштабировании на несколько
|
||||
инстансов миграции стоит вынести в отдельный шаг/джобу.
|
||||
- Конфигурация через `appsettings.{Env}.json` + переменные окружения / secrets (строка подключения,
|
||||
JWT-ключ, ключ шифрования секретов, `Telegram:BotToken`).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user