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, 443 | Reverse proxy | HTTPS для портала и сайтов |
Основные переменные
| Переменная | Назначение |
|---|---|
IMAGE_PREFIX | Namespace образов; по умолчанию hub.docker-infra.ru/digraph |
VERSION | Тег релиза; фиксируется в .env для контура и портала |
AUTH_TOKEN | Вход на контур и фолбэк-ключ подписи JWT. Обязателен, если нет файла secrets/auth_token |
JWT_SIGNING_KEY | Отдельный ключ подписи JWT: смена пароля не разлогинивает сессии |
SECRET_MASTER_KEY | Hex-ключ для шифрования ключей секретов и AI-ключа |
PRIVILEGES | read-only (по умолчанию), all или actions,exec,push,compose. Только env, не UI |
INTERNAL_TOKEN | Bearer-токен для compose-runner, volume-scanner и metrics-agent; генерируется в .env |
ALLOWED_ORIGINS | Origin'ы для 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_FILE | HTTPS на контуре; нужны оба или ни одного |
TLS_REDIRECT_ADDR | HTTP-листенер с 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