platform: modularize api/gui, add docs-tests-web foundation, and refresh root config

This commit is contained in:
beckline
2026-03-26 22:40:54 +03:00
parent 0e2d7f61ea
commit 6a56d734c2
562 changed files with 70151 additions and 16423 deletions

View File

@@ -0,0 +1,101 @@
# E5 SingBox Client Form Matrix (UI-first, VLESS baseline)
Дата: 2026-03-09
Статус: active
Владелец: Engineering
## 1) Что берём из твоего примера
- Берём структуру "блоками", как на скрине:
- базовый блок,
- transport,
- security,
- sniffing,
- advanced toggles.
- Не копируем серверные поля биллинга/лимитов/истечения, потому что это не клиентский outbound.
## 2) Что исключаем (server-only)
- `Email`, `Subscription`, `Total used`, `Traffic reset`, `Expire date`, `Fallbacks` (как серверный inbound list), и прочие учёт/статистика-поля.
## 3) Клиентская форма (VLESS + Reality) — целевая MVP
### 3.1 Block A: Profile
| UI field | JSON path | Required | Notes |
|---|---|---|---|
| Profile name | `profile.name` | yes | имя карточки |
| Enabled | `profile.enabled` | yes | локальный toggle |
| Protocol | `outbound.type` | yes | для этого шаблона фикс `vless` |
### 3.2 Block B: Server/Auth
| UI field | JSON path | Required | Notes |
|---|---|---|---|
| Address | `outbound.server` | yes | домен/IP |
| Port | `outbound.server_port` | yes | `1..65535` |
| UUID | `outbound.uuid` | yes | vless user id |
| Flow | `outbound.flow` | no | напр. `xtls-rprx-vision` |
| Packet encoding | `outbound.packet_encoding` | no | default `none` |
### 3.3 Block C: Transport
| UI field | JSON path | Required | Notes |
|---|---|---|---|
| Transport type | `outbound.transport.type` | no | `tcp|ws|grpc|http|httpupgrade|quic` |
| Path | `outbound.transport.path` | depends | для `ws/http/httpupgrade` |
| Host/Headers | `outbound.transport.headers` | no | advanced |
| Service name | `outbound.transport.service_name` | depends | для `grpc` |
### 3.4 Block D: Security
| UI field | JSON path | Required | Notes |
|---|---|---|---|
| Security mode | `outbound.tls.enabled` + `outbound.tls.reality.enabled` | yes | `none|tls|reality` (segmented control) |
| SNI | `outbound.tls.server_name` | depends | для `tls/reality` |
| uTLS fingerprint | `outbound.tls.utls.fingerprint` | no | `chrome|firefox|safari|...` |
| Reality public key | `outbound.tls.reality.public_key` | depends | must для reality |
| Reality short id | `outbound.tls.reality.short_id` | no | обычно короткий hex |
| Insecure | `outbound.tls.insecure` | no | advanced toggle |
### 3.5 Block E: Sniffing/Local inbound (опционально)
| UI field | JSON path | Required | Notes |
|---|---|---|---|
| Sniffing enabled | `inbounds[*].sniff` | no | если используем локальный socks inbound в generated config |
| Sniff override destination | `inbounds[*].sniff_override_destination` | no | advanced |
### 3.6 Block F: Advanced Dial
| UI field | JSON path | Required | Notes |
|---|---|---|---|
| Network | `outbound.network` | no | `tcp|udp` |
| Connect timeout | `outbound.connect_timeout` | no | duration |
| Bind interface | `outbound.bind_interface` | no | advanced |
| Routing mark | `outbound.routing_mark` | no | advanced |
| Multiplex | `outbound.multiplex` | no | advanced group |
| UDP over TCP | `outbound.udp_over_tcp` | no | advanced group |
## 4) Guardrails (обязательные)
- `CV-001`: при `security=reality` автоматически `tls.enabled=true`, `tls.reality.enabled=true`.
- `CV-002`: при `security=reality` поле `reality.public_key` обязательно.
- `CV-003`: при `transport=grpc` поле `service_name` обязательно.
- `CV-004`: при `transport=ws|http|httpupgrade` поле `path` обязательно.
- `CV-005`: `address/port/uuid` обязательны всегда.
## 5) UI-компоновка (desktop)
- Compact panel:
- `Profile`,
- `Server/Auth`,
- `Transport`,
- `Security`,
- collapsed `Advanced`.
- Actions:
- `Preview render`,
- `Validate profile`,
- `Apply profile`,
- `History`,
- `Rollback profile`.
## 6) Расширение на другие протоколы
- Сохраняем те же блоки UI, меняются только поля блока `Server/Auth` + часть `Security/Transport`.
- То есть форма будет модульной, а не отдельное "окно под каждый протокол".