DigraphDocs Docker Infrastructure Graph

Docs / REST API

REST API

Контур отдаёт /api/*, портал — /api/portal/* и прокси /api/remote/{serverId}/*. Все защищённые маршруты ждут Authorization: Bearer <token>.

Авторизация и ошибки

# контур: JWT из /api/auth/login или AUTH_TOKEN напрямую
curl -s localhost:9090/api/health
curl -s -H "Authorization: Bearer $TOKEN" localhost:9090/api/docker/state

# портал: JWT портала
curl -s -H "Authorization: Bearer $PORTAL_TOKEN" localhost:9091/api/portal/inventory
ОтветТелоЧто значит
401{"error":"…"}Нет или истёк токен
403{"code":"section_disabled","section":"…"}Раздел выключен в настройках
403{"error":"… disabled"}Возможность запрещена PRIVILEGES
502{"code":"contour_unauthorized"}Портал не смог авторизоваться в контуре: введите ключ заново
409{"error":"… exists"}Конфликт: имя проекта или секрета занято

Auth

МетодПутьОписание
GET/api/auth/statusСостояние входа, features, sections, SSO
POST/api/auth/loginПароль → access + refresh (5 попыток в минуту с IP)
POST/api/auth/refreshОбновить access по refresh
POST/api/auth/logoutОтозвать refresh
GET/api/auth/oidc/login302 к провайдеру (state, nonce, PKCE)
GET/api/auth/oidc/callbackCallback провайдера → одноразовый cookie → /#/login
POST/api/auth/oidc/sessionОбменять cookie на пару JWT

Граф и Docker

МетодПутьОписание
GET/api/docker/stateПолный снимок состояния
GET/api/docker/graphГраф для UI
GET/api/docker/graph/wsWebSocket: diff-обновления
GET/api/docker/time-listСписок срезов
GET/api/docker/history/{timestamp}Граф среза
GET/api/docker/history/diffДифф двух срезов
GET/api/docker/history/logs/{id}Логи контейнера из среза
GET/api/docker/host-metricsТаймсерия хоста
GET/api/docker/container-namesИмена контейнеров
GET/api/docker/containers/{id}/inspectInspect (с маскированием)
GET/api/docker/containers/{id}/stackСлои образа и окружение
GET/api/docker/containers/{id}/vulnerabilitiesКэш отчёта Trivy
POST/api/docker/containers/{id}/scanЗапустить скан
GET/api/docker/logs/{id}, /wsЛоги и live-стрим
GET/api/docker/exec/{id}/wsТерминал (нужен exec)
GET/api/docker/volume-tree/{name}Дерево файлов тома
GET/api/docker/volume-download/{name}Том как .tar.gz
GET/api/docker/compose-file/{networkID}Реконструкция compose
GET/api/docker/compose-service/{containerID}Compose-сервис контейнера
GET/api/docker/compose/{networkID}Проект целиком

Действия с контейнерами

Требуют PRIVILEGES=actions; иначе 403. Контейнер docker-stat защищён от остановки и удаления.

POST /api/docker/containers/{id}/start
POST /api/docker/containers/{id}/stop
POST /api/docker/containers/{id}/restart
POST /api/docker/containers/{id}/pause
POST /api/docker/containers/{id}/unpause
POST /api/docker/containers/{id}/kill
DELETE /api/docker/containers/{id}

Настройки и раскладка

МетодПутьОписание
GET / PUT/api/settingsAI, логи, сбор, retention, уязвимости, бэкапы, алерты, разделы, SSO, deployment (ro)
POST/api/settings/rotate-master-key{"confirm":"ROTATE"}; новый ключ — один раз в ответе
GET / PUT/api/layoutПозиции и свёрнутые группы
GET / POST/api/layout/presetsПресеты раскладки
PUT / DELETE/api/layout/presets/{id}Изменить / удалить пресет

Секреты

Раздел должен быть включён (secrets_enabled), а push — разрешён PRIVILEGES=exec,push.

МетодПутьОписание
GET/api/secretsВсе секреты (содержимое расшифровано)
POST/api/secretsproject, content, container_names[], file_path, push_mode
PUT / DELETE/api/secrets/{id}Обновить / удалить
GET/api/secrets/targetsWritable-mount'ы, tmpfs и read-only rootfs по контейнерам
POST/api/secrets/{id}/pushДоставка; в ответе results[] со статусом и текстом ошибки

Проекты и задачи

МетодПутьОписание
GET/api/projectsСписок проектов
POST/api/projects, /uploadСоздать из JSON / загрузить файл
GET / PUT / DELETE/api/projects/{name}Чтение, изменение, удаление
GET/api/projects/{name}/status, /jobs, /graphСтатус, история задач, граф проекта
POST/api/projects/{name}/up, /down, /restart, /pullCompose-действие как фоновая задача
GET/api/jobs/{id}Статус и хвост вывода
POST/api/jobs/{id}/cancelОтменить задачу

Действия up/down/restart/pull требуют PRIVILEGES=compose.

Бэкапы

МетодПутьОписание
GET/api/backup/statusРазмер, каталог, последний архив, готовность restore
GET/api/backup/filesЛокальные архивы
POST/api/backupСоздать архив
GET/api/backup/downloadСоздать и сразу скачать
GET / DELETE/api/backup/files/{name}Скачать / удалить
POST/api/backup/restore, /files/{name}/restore{"confirm":"RESTORE"}; 202 + restart_required

Алерты, события, аудит

МетодПутьОписание
GET/api/alerts/status, /history, /deliveriesПравила, переходы, попытки доставки
POST/api/alerts/testТестовый вебхук
GET/api/eventsЛента Docker-событий и аудита
GET/api/security/auditРешения docker-api: allow/deny и мутации
GET/api/hostХост и нагрузка
GET/api/health, /api/ready, /api/metricsLiveness, readiness, Prometheus
GET/api/vuln/statusСостояние сканера и базы Trivy
GET/api/ai/statusAI: enabled, model, language
POST/api/ai/analyzeСтрим заключения (text/plain)
GET/api/ai/conclusionsИстория заключений
DELETE/api/ai/conclusions/{id}Удалить заключение

API портала

МетодПутьОписание
GET/api/portal/healthПубличная проверка живости
GET/api/portal/auth/statusСостояние входа и SSO
POST/api/portal/auth/login, /refresh, /logoutСессия портала
GET/api/portal/auth/oidc/login, /callbackOIDC-флоу
POST/api/portal/auth/oidc/sessionCookie → JWT
GET / POST/api/portal/contoursКонтуры (dev/stage/prod)
PUT / DELETE/api/portal/contours/{id}Изменить / удалить контур
GET / POST/api/portal/serversСерверы: адрес, контур, токен
PUT / DELETE/api/portal/servers/{id}Изменить / удалить сервер
POST/api/portal/servers/{id}/checkПроверка доступности и ключа
GET/api/portal/inventoryКонтуры, серверы и статусы
GET / PUT/api/portal/settingsAI, SSO, алерты портала
GET / POST/api/portal/ai/*status, analyze, conclusions
GET/api/portal/alerts/status, /deliveriesWatchdog и доставки
POST/api/portal/alerts/testТест канала

Прокси: /api/remote/{serverId}/api/… — тот же путь контура, но с JWT портала; WebSocket проксируется так же.

Пример

TOKEN="$(curl -s -X POST localhost:9090/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"password":"'"$AUTH_TOKEN"'"}' | jq -r .access_token)"

curl -s -H "Authorization: Bearer $TOKEN" \
  localhost:9090/api/docker/state | jq '.containers | length'