Files
elmprodvpn/docs/phase-e/E5_SINGBOX_PROTOCOLS_REQUIREMENTS.md

8.5 KiB
Raw Permalink Blame History

E5 Требования: SingBox Protocols (UI tab + Go API)

Дата: 2026-03-07
Статус: planned (requirements fixed)
Владелец: Engineering

1) Цель

  • Зафиксировать требования для реализации протоколов во вкладке SingBox без архитектурной "мешанины".
  • Зафиксировать целевой Go API для singbox с поддержкой "всех фишек" через typed-профили и raw-режим.

2) Архитектурные границы (чтобы не смешивать слои)

  • Слой Transport Engine:
    • lifecycle (provision/start/stop/restart), health/metrics, runtime_mode/packaging.
    • уже реализован в /api/v1/transport/clients/*.
  • Слой Routing Policy:
    • validate -> confirm -> apply -> rollback.
    • уже реализован в /api/v1/transport/policies/*.
  • Слой Protocol Profile (новый E5):
    • описание конфигов sing-box (outbounds/rules/dns/tun и т.д.).
    • не дублирует lifecycle и не дублирует policy.

Правило:

  • Protocol Profile готовит/валидирует/рендерит sing-box config.
  • Transport Engine запускает этот config.
  • Routing Policy решает, какой engine владеет трафиком.

3) Требования к вкладке SingBox (GUI)

3.1 Блоки UI (обязательные)

  • Profiles list:
    • список профилей, тип протокола, версия, последний apply, статус валидации.
  • Editor:
    • режим Typed (форма) и режим Raw JSON (полный контроль).
  • Validation:
    • синтаксис, обязательные поля, совместимость с бинарём/features.
  • Apply:
    • Validate -> Preview -> Apply.
    • при рисках/конфликтах — confirm flow.
  • Diagnostics:
    • last_error, warning, render-diff, health summary.
  • Rollback:
    • откат к предыдущей рабочей версии профиля.

3.2 Поведение

  • Нельзя применять профиль без успешной валидации.
  • Apply профиля не должен неявно менять transport-policy ownership.
  • Секреты в UI маскируются, редактируются только write-only полями.
  • Все mutating-операции идемпотентны и привязаны к ревизии.

3.3 Desktop layout freeze

  • Вкладка SingBox на desktop фиксируется в 3 секции:
    • Connection card (runtime),
    • Profile settings (per profile),
    • Global defaults.
  • Для profile-параметров используется правило Use global/Override.
  • Детальная спецификация: docs/phase-e/E5_2_SINGBOX_DESKTOP_DASHBOARD_SPEC.md.

4) Требования к модели профилей (Go)

4.1 Поддерживаемые режимы профиля

  • typed:
    • структурированная схема под основные протоколы.
  • raw:
    • полный sing-box JSON для "всех фишек", не покрытых формой.

4.2 Минимальный набор протоколов для typed-режима

  • vless (в т.ч. reality/tls варианты),
  • trojan,
  • shadowsocks,
  • wireguard,
  • hysteria2,
  • tuic.

Примечание:

  • Для нестандартных/редких фич используется raw без потери совместимости.

4.3 Версионирование

  • schema_version для профиля.
  • profile_revision (optimistic lock).
  • render_revision (версия сгенерированного итогового конфига).

4.4 DNS (встроенный resolver sing-box)

  • Профиль singbox должен включать секцию DNS как часть единого конфига (dns.servers, dns.rules, strategy, final и связанные поля).
  • В typed-режиме нужен базовый DNS-набор:
    • выбор DNS-провайдеров/серверов,
    • rule-based DNS routing (по доменам/гео/режимам),
    • переключение стратегий резолва (например, prefer IPv4/IPv6 по профилю).
  • Для расширенных сценариев (fakeip, cache tuning, нетиповые rules/actions) используется raw режим без ограничений формы.
  • Ограничение границ:
    • DNS sing-box отвечает за резолв внутри transport-профиля,
    • системный selective routing policy (/transport/policies/*) остаётся отдельным слоем и не дублируется в profile editor.

5) Требования к Go API singbox

5.1 Новые endpoint-группы (target)

  • GET/POST /api/v1/transport/singbox/profiles
  • GET/PATCH/DELETE /api/v1/transport/singbox/profiles/{id}
  • POST /api/v1/transport/singbox/profiles/{id}/validate
  • POST /api/v1/transport/singbox/profiles/{id}/render
  • POST /api/v1/transport/singbox/profiles/{id}/apply
  • POST /api/v1/transport/singbox/profiles/{id}/rollback
  • GET /api/v1/transport/singbox/profiles/{id}/history
  • GET /api/v1/transport/singbox/features

5.2 Контракт операций

  • validate:
    • возвращает ошибки схемы, ошибок протокола, неподдерживаемых фич по текущему binary.
  • render:
    • детерминированно строит финальный sing-box config + diff к текущему active.
  • apply:
    • атомарно: запись конфига -> backend provision -> optional restart/start -> health check.
    • при fail: автоматический rollback.
  • rollback:
    • откат к последнему успешному render/apply snapshot.

5.3 Совместимость и безопасность

  • Не ломать текущий /api/v1/transport/* контракт.
  • Для mutating запросов:
    • Idempotency-Key,
    • base_revision.
  • Секреты:
    • отдельное хранение, выдача в API только masked.
    • запрет на логирование plain-secret в trace/events.

6) "Все фишки" sing-box: как закрываем требование

  • Typed-форма покрывает частые production-сценарии.
  • Raw-режим гарантирует доступ к полному синтаксису sing-box.
  • GET /transport/singbox/features отражает реальные возможности текущего binary:
    • поддерживаемые протоколы,
    • transport/tls/reality/quic опции,
    • ограничения версии.

7) Хранение и артефакты

  • Профили: /var/lib/selective-vpn/transport/singbox-profiles.json
  • История/snapshots: /var/lib/selective-vpn/transport/singbox-history/*.json
  • Rendered configs: /var/lib/selective-vpn/transport/singbox-rendered/{profile_id}.json
  • Secrets store: /var/lib/selective-vpn/transport/secrets/singbox/{profile_id}.json (0600)

8) SSE-события (обязательные)

  • singbox_profile_saved
  • singbox_profile_validated
  • singbox_profile_rendered
  • singbox_profile_applied
  • singbox_profile_rollback
  • singbox_profile_failed

9) Поэтапная реализация (рекомендуемый порядок)

  1. E5.1 Requirements freeze (этот документ).
  2. E5.2 Go: state/model + CRUD + versioning + secrets storage.
  3. E5.3 Go: validate/render/apply/rollback + SSE events.
  4. E5.4 GUI: SingBox profiles tab (list/editor/validate/preview/apply/rollback).
  5. E5.5 Совместимость web/mobile: reuse того же API-контракта.

10) Критерии готовности E5

  • Можно создать/редактировать профиль singbox без ручного правки файлов на хосте.
  • Apply проходит через validate и имеет rollback safety.
  • Raw-режим позволяет применить фичи, которых нет в typed-форме.
  • Наблюдаемость достаточна для диагностики (events + health + last_error + history).