HTTP-API кабинета Controller32 - self-hosted панель управления над Remnawave. Все ответы в JSON. Данные реальные: где источник молчит, поле честно пустое или помечено «нет данных».
Обзор
Кабинет - единый Go-бинарник: web-интерфейс, HTTP-API и agent-gateway (приём агентов нод по mTLS). API слушает loopback и отдаётся наружу через обратный прокси с TLS. Базовый префикс всех ручек - /api.
Аутентификация
Если задан owner-логин, изменяющие запросы требуют сессию-куку. Поток входа:
POST/api/auth/login
шаг 1: {email, password} -> {step:"2fa", challenge} либо сессия
POST/api/auth/2fa
шаг 2: {challenge, code} (TOTP) -> сессия-кука
GET/api/auth/me
статус сессии и включён ли логин
POST/api/auth/logout
завершить сессию
Публичные (без сессии):/api/auth/*, /api/version, /api/status/public, /api/license/* (активация нужна и в read-only). Прочие /api/* при включённом логине требуют сессию.
Соглашения
Заголовок X-Request-Id
клиент шлёт свой id; он возвращается в ошибках для трассировки
Списки
конверт {items:[...], total:N}; пустой список - это [], не null
Ошибки
{error:"code", detail?, reason?}; коды HTTP: 400 ввод, 401 нет сессии, 403 роль/фича, 423 read-only лицензии, 502 источник недоступен
Read-only
без активной лицензии изменяющие методы дают 423; чтение открыто всегда
Долгие действия
возвращают {job_id}; прогресс - GET /api/jobs/{id} (+ события)
Эндпоинты
Версия и лицензия
GET/api/version
версия кабинета
GET/api/license
статус лицензии, отпечаток установки, срок, фичи
POST/api/license/activate
{token} - активировать/заменить (проверка локально под установку)
POST/api/license/deactivate
удалить ключ, перейти в read-only
GET/api/updates
версия + история релизов + доступность обновления
POST/api/self-update
обновить кабинет (если включён канал)
Инфраструктура: ноды и карта
GET/api/dashboard
сводка Главной: KPI, состояние, требует внимания, лента
GET/api/topology
граф трафика: узлы, рёбра, сводка, updatedAt
GET/api/nodes
ноды панели (поиск q, фильтр status, пагинация)
GET/api/nodes/{uuid}
карточка ноды (паспорт, метрики)
GET/api/nodes/{uuid}/metrics
временной ряд метрик (range)
GET/api/nodes/{uuid}/services
статус служб (от агента)
GET/api/nodes/{uuid}/logs
логи ноды (от агента)
POST/api/nodes/{uuid}/restart
перезапуск ноды (джоба)
POST/api/nodes/{uuid}/verify
проверка ноды (джоба)
DEL/api/nodes/{uuid}/delete
снять ноду (джоба)
POST/api/nodes/bulk
массовое действие {action, uuids}
POST/api/nodes/provision
поднять ноду (фича nodes)
Здоровье и безопасность
GET/api/health
последний отчёт проверки + плитки
GET/api/health/run
запустить полную проверку (6 уровней)
GET/api/security/incidents
инциденты anti-abuse
GET/api/security/policies
политики защиты
PUT/api/security/policies
вкл/выкл политику {id, mode, enabled}
POST/api/security/egress
применить egress-правила на ноду (джоба)
GET/api/security/qos
активные rate-limit подписок (QoS)
POST/api/security/qos
поставить/снять лимит подписки на ноде {node, action, target, rate_kbit} (джоба)