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
завершить сессию
GET/api/account
учётка владельца: почта, включена ли 2FA, привязан ли Telegram. Секретов не отдаёт
POST/api/account/password
{current, new} - смена пароля владельца, действует сразу
POST/api/account/2fa/begin
выпустить секрет и ссылку otpauth://. Секрет НЕ сохраняется
POST/api/account/2fa/enable
{secret, code} - включить 2FA, вернуть резервные коды (один раз)
POST/api/account/2fa/disable
{password} или {code} - отключить 2FA
PUT/api/account/telegram
{botToken, botUsername, ids} - привязать вход через Telegram
DELETE/api/account/telegram
отвязать вход через Telegram
Публичные (без сессии):/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; чтение открыто всегда. Исключения: /api/license/*, /api/auth/* (вход) и /api/account/* - защита собственного входа от лицензии не зависит
Роли
viewer не пишет вовсе; /api/account/* пишет только owner - учётные данные владельца не меняет даже admin
Долгие действия
возвращают {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} (джоба)
Сервисы: GeoAssets, SelfSteal, CDN, Remnawave
GET/api/geo
наборы geoip/geosite
GET/api/geo/sources
источники наборов
POST/api/geo/sources
добавить источник {name, kind, url, checksum_url}
POST/api/geo/fetch
скачать + сверить sha256 {source_id}
POST/api/geo/deliver
разложить набор по нодам (джоба)
GET/api/selfsteal
каталог шаблонов сайтов-прикрытий
POST/api/selfsteal/deploy
развернуть шаблон на ноду (джоба)
GET/api/cdn/providers
подключённые DNS/CDN-провайдеры
GET/api/remnawave
статус панели, счётчики сущностей, расхождения
Бэкапы
GET/api/backups
снимки + расписание + готовность SSH
POST/api/backups
снять бэкап сейчас (джоба)
PUT/api/backups/schedule
расписание + суточный таймер
GET/api/backups/{id}/preview-restore
dry-run: sha256 + содержимое архива
POST/api/backups/{id}/restore
восстановить БД панели из снимка (джоба)
Настройки, журнал, задачи
GET/api/settings
режим авторешения, политика/окно/период обновлений, порог автопочинки