DigraphDocs Docker Infrastructure Graph

Docs / Установка

Установка

Контур и портал ставятся из готовых образов. На сервере нужны только compose-файлы, .env и секреты — собирать ничего не нужно.

Требования

  • Linux-хост с Docker Engine и Compose v2.
  • Сетевой доступ к hub.docker-infra.ru: pull анонимный, push требует docker login.
  • Свободный порт 9090 для контура; 9091 — если публикуете портал напрямую (по умолчанию только loopback).
  • Для TLS — reverse proxy на 80/443 (например, nginx из deploy/web).
  • Постоянные тома для SQLite и проектов; для сканера уязвимостей — кэш Trivy.
  • Внешняя БД не нужна: используется SQLite с WAL.
  • Доступ к Docker-демону только у sidecar'а docker-api; остальные контейнеры сокет не монтируют.

Образы и версии

Компоненты публикуются в hub.docker-infra.ru/digraph/<image>:<version>; текущий релиз — v0.1.0. В прод-compose версия фиксируется в .env (VERSION) и не плавает на latest.

docker pull hub.docker-infra.ru/digraph/contour:v0.1.0   # без логина
docker pull hub.docker-infra.ru/digraph/portal:v0.1.0

docker login hub.docker-infra.ru                          # только для push
docker tag app:latest hub.docker-infra.ru/digraph/app:1.0.0
docker push hub.docker-infra.ru/digraph/app:1.0.0

Основные образы: contour, docker-api, compose-runner, volume-scanner, vuln-scanner, metrics-agent, portal, ui, site, docs. Каталог репозиториев (/v2/_catalog) без логина закрыт.

Ключи и файл .env

Скопируйте пример и запустите генератор секретов — он создаёт файлы и выдаёт их пользователю контейнера (uid 100 / gid 101):

cd deploy/contour
cp .env.example .env
./init-secrets.sh

SECRET_MASTER_KEY нельзя терять. Им оборачиваются ключи секретов и AI-ключ. При смене без ротации старые секреты не расшифруются. Плановая замена — только через «Rotate master key».

init-secrets.sh создаёт auth_token, jwt_signing_key и secret_master_key в secrets/, а INTERNAL_TOKEN записывает в .env — его читают sidecar'ы. В контейнере секреты лежат в /run/secrets/; файл важнее env. Обычный chmod 600 от имени деплой-пользователя не подходит: приложение работает под uid 100 и не прочитает файл. Для портала — тот же скрипт в deploy/portal (portal_token, secret_master_key).

Compose передаёт переменные из .env через env_file; в самом compose остаются только фиксированные внутренние URL. Пустые и дефолтные переменные там больше не дублируются: новые настройки добавляются в .env без правки compose.

Установка контура

cd deploy/contour
cp .env.example .env
./init-secrets.sh
# в .env: VERSION=v0.1.0, HOST_IP=<адрес хоста>, HOST_ALIAS=<имя>
docker compose pull
docker compose up -d

Sidecar'ы стартуют первыми, docker-stat ждёт их healthcheck. Один контур на Docker-хост. HOST_IP должен быть реальным адресом машины, а не bridge-IP — портал показывает его в графе.

docker compose ps
curl -s localhost:9090/api/ready

Установка портала

cd deploy/portal
cp .env.example .env
./init-secrets.sh
# в .env: VERSION=v0.1.0 и PORTAL_JWT_KEY=$(openssl rand -hex 32)
docker compose pull
docker compose up -d

Портал слушает 127.0.0.1:9091 и наружу выходит через TLS-прокси: nginx и портал состоят в общей сети digraph-edge, nginx проксирует на portal:8090 (пример — домен graph.docker-infra.ru). Войдите по portal_token и добавьте контур: адрес http://<host>:9090 и его auth_token.

В репозитории остаётся корневой docker-compose.yml для разработки: он собирает образы из исходников и поддерживает профили portal, site, docs. Для установки используйте deploy/contour и deploy/portal.

Порты

ПортСервисПримечание
9090КонтурAPI и WebSocket; UI отдаёт портал
9091ПорталПо умолчанию только loopback; наружу — через TLS-прокси
80, 443Reverse proxyHTTPS для портала и сайтов

Основные переменные

ПеременнаяНазначение
IMAGE_PREFIXNamespace образов; по умолчанию hub.docker-infra.ru/digraph
VERSIONТег релиза; фиксируется в .env для контура и портала
AUTH_TOKENВход на контур и фолбэк-ключ подписи JWT. Обязателен, если нет файла secrets/auth_token
JWT_SIGNING_KEYОтдельный ключ подписи JWT: смена пароля не разлогинивает сессии
SECRET_MASTER_KEYHex-ключ для шифрования ключей секретов и AI-ключа
PRIVILEGESread-only (по умолчанию), all или actions,exec,push,compose. Только env, не UI
INTERNAL_TOKENBearer-токен для compose-runner, volume-scanner и metrics-agent; генерируется в .env
ALLOWED_ORIGINSOrigin'ы для CORS и WS; без значения WS разрешён только same-origin
HOST_IP, HOST_ALIASАдрес и алиас контура на ноде в /#/dashboard и на ребре
LICENSE_KEY, LICENSE_FILEОфлайн-лицензия Enterprise (DG1…); файл приоритетнее строки. Обычно ключ вставляют в Settings → License, env — для headless. Без ключа — Community
DOCKER_AGENT_URLТипизированный Docker API; в compose — http://docker-api:2375
BACKUP_DIRКаталог архивов; по умолчанию /data/backups в томе
BACKUP_RESTORE_ENABLEDРазрешает постановку restore в очередь (по умолчанию false)
TLS_CERT_FILE, TLS_KEY_FILEHTTPS на контуре; нужны оба или ни одного
TLS_REDIRECT_ADDRHTTP-листенер с 308 на HTTPS
OIDC_*Env-фолбэк для native/headless SSO; в compose не передаётся — SSO настраивается в /#/settings
PORTAL_TOKENПароль входа в портал, если не используется OIDC
PORTAL_SECRET_MASTER_KEYКлюч шифрования токенов контуров в БД портала
PORTAL_JWT_KEYКлюч подписи сессий портала (openssl rand -hex 32)

Полный список — в README.md репозитория и .env.example. Часть настроек (сбор, retention, AI, разделы) живёт в SQLite и меняется в интерфейсе без рестарта.

Запуск без Docker

# локально, без авторизации (только для доверенной машины)
AUTH_DISABLED=true go run . -addr 127.0.0.1:8080

# с авторизацией
AUTH_TOKEN="$(openssl rand -hex 32)" go run . -addr 127.0.0.1:8080

Пути определяются автоматически: при наличии /data база лежит в /data/docker-stat.db, иначе рядом с бинарём. Compose-проекты — в /projects или ./compose-projects.

Данные и обновление

ЧтоГде
История, метрики, секреты, настройкитом digraph-contour_sqlite_data → /data/docker-stat.db
Compose-проектыdeploy/contour/project_data → /projects
Кэш Trivyтом digraph-contour_trivy_cache
БД портала (контуры, серверы, токены)том digraph-portal_portal_data
Bootstrap-секретыdeploy/contour/secrets и deploy/portal/portal-secrets (ro)

Обновление не требует пересборки: версия фиксируется в .env. Миграции SQLite применяются при старте:

cd deploy/contour
sed -i 's/^VERSION=.*/VERSION=v0.2.0/' .env
docker compose pull && docker compose up -d

cd ../portal
sed -i 's/^VERSION=.*/VERSION=v0.2.0/' .env
docker compose pull && docker compose up -d

Откат — вернуть предыдущий VERSION и повторить. Sidecar'ы обновляются вместе с контуром.

Перед обновлением сделайте архив в /#/backups или скопируйте том sqlite_data — restore рассчитан на тот же формат базы.

Проверка

docker compose ps
curl -s localhost:9090/api/health   # liveness
curl -s localhost:9090/api/ready    # readiness: свежесть сбора
curl -s localhost:9090/api/metrics | head   # Prometheus
curl -s https://<домен-портала>/api/portal/health