Controller32 API

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} (джоба)

Сервисы: 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-restoredry-run: sha256 + содержимое архива
POST/api/backups/{id}/restoreвосстановить БД панели из снимка (джоба)

Настройки, журнал, задачи

GET/api/settingsрежим авторешения
PUT/api/settingsсменить режим
GET/api/usersпользователи и роли
GET/api/settings/notificationsканалы уведомлений
GET/api/settings/secretsсекреты (значения маскируются)
GET/api/opsжурнал операций + аудит
GET/api/ops/export.csvвыгрузка журнала в CSV
GET/api/jobs/{id}статус durable-задачи
GET/api/jobs/{id}/eventsпоток событий задачи (SSE)
POST/api/jobs/{id}/cancelотменить задачу

Публичное

GET/api/status/publicстатус-страница: регионы, инциденты (без сессии)