4.9 KiB
4.9 KiB
E4.4 Multi-Interface GUI Design (Desktop-first)
Дата: 2026-03-15
Статус: planned (design approved)
Владелец: Engineering
1) Ответ на ключевой вопрос
- Да, это общий мультиинтерфейсный контур на всё приложение.
- Источник истины: Go-ядро (
transport interfaces/policies/owners/owner-locks). - GUI/Web/Mobile только рисуют состояние и вызывают API.
2) Границы
AdGuardVPNостаётся отдельным engine-контуром (autoloop/tun0) и не смешивается с transport policy ownership.- Мультиинтерфейс (
iface_id,routing_table, owner-locks) относится к transport-движкам (singbox, далееdnstt,phoenix). - Дизайн делаем универсальным, без жёсткой привязки к одному протоколу.
3) UI-композиция (вкладка/модуль Transport)
A. Interface Summary (верхний блок)
- Карточки по
iface_id:iface_id,routing_table,- количество клиентов на интерфейсе,
- количество rule/intents.
- Источники:
GET /api/v1/transport/interfaces,GET /api/v1/transport/policies.
B. Clients Grid (карточки подключений)
- Карточки клиентов остаются, но группируются по
iface_id. - На карточке:
client name/id,protocol/transport/security,status/latency,egress ip/country(если доступно).
- Источник:
GET /api/v1/transport/clients,GET /api/v1/egress/identity?scope=transport:<client_id>.
C. Ownership & Locks Panel (новый блок)
- Вкладки внутри панели:
Ownership:- данные из
GET /api/v1/transport/owners, - поля: selector, owner client, iface,
owner_status,lock_active.
- данные из
Destination locks:- данные из
GET /api/v1/transport/owner-locks, - поля: destination ip, owner client, mark, proto, updated_at.
- данные из
- Назначение:
- быстро понять, почему блокируется owner-switch.
D. Safe Lock Recovery (точечная очистка lock)
- Кнопка:
Clear selected lock(s)вDestination locks. - Только точечный режим:
- по
client_id, - по
destination_ip/destination_ips.
- по
- Полный clear без фильтра запрещён.
4) UX-flow clear owner-lock (двухшаговый)
- Пользователь выбирает фильтры и нажимает
Clear. - GUI вызывает
POST /api/v1/transport/owner-locks/clearбезconfirm_token. - Backend отвечает:
OWNER_LOCK_CLEAR_CONFIRM_REQUIRED,confirm_token,- список matched lock.
- GUI показывает confirm-диалог с последствиями (что удалится).
- При подтверждении GUI повторяет запрос с
confirm_token. - Успех:
- перечитать
owner-locks, - обновить
owners, - показать
cleared_count.
5) Правила безопасности UI
- Нельзя отправить clear-запрос без фильтра.
- Нельзя кешировать
confirm_tokenмежду сессиями. - При
*_REVISION_MISMATCHGUI обязан перечитатьowner-locksи повторить выбор. - Все mutating-кнопки блокируются на время in-flight запроса.
6) События/обновление данных
- В приоритете SSE refresh от уже существующих transport-событий.
- На
transport_policy_applied:- перечитать
owners, - если включён sticky-режим, перечитать
owner-locks.
- перечитать
- После clear:
- локально optimistic update запрещён, только re-fetch из API.
7) Контракт API для GUI (фикс)
GET /api/v1/transport/interfacesGET /api/v1/transport/clientsGET /api/v1/transport/policiesGET /api/v1/transport/ownersGET /api/v1/transport/owner-locksPOST /api/v1/transport/owner-locks/clearPOST /api/v1/transport/policies/validatePOST /api/v1/transport/policies/apply
8) Порядок внедрения GUI
- Добавить read-only
Ownership & Locks Panel. - Подключить фильтры и таблицу
Destination locks. - Подключить двухшаговый clear-flow с confirm-диалогом.
- Встроить обновление после validate/apply и transport refresh.
- После desktop-стабилизации переиспользовать UI-контракт в web/mobile.