Веб-панель для управления production-кластером Docker Swarm: живые метрики нод, управление сервисами/стеками/нодами, стриминг логов, события и audit. Полное ТЗ — dsms-tz-v1.md (v1.1).
| Компонент | Папка | Стек | Назначение |
|---|---|---|---|
| PANEL | panel/ | Go 1.25, chi, SQLite | REST + WebSocket, Docker Engine API, приём метрик, auth |
| AGENT | agent/ | Go 1.25, gopsutil | Сбор метрик хоста на каждой ноде (mode: global) |
| FRONTEND | frontend/ | Vue 3, Vite, Naive UI | SPA, встраивается в бинарник panel через go:embed |
Browser ──HTTPS(reverse proxy)──> PANEL <──HTTP push метрик── AGENT (на каждой ноде)
│
docker.sock (Engine API)
Каждый компонент — независимый проект без общего кода (осознанное дублирование DTO).
Требуется Go 1.25+, Node 22+.
# 1. Фронтенд: собрать статику в panel/web/dist (нужно до go build)
cd frontend && npm install && npm run build
# 2. Панель: локальный запуск (DSMS_COOKIE_INSECURE — только для dev без TLS)
cd panel
DSMS_DB=/tmp/dsms.db DSMS_AGENT_TOKEN=dev-token DSMS_COOKIE_INSECURE=1 go run ./cmd/panel
# 3. Агент: локальный запуск (шлёт метрики на локальную панель)
cd agent
NODE_ID=local-dev PANEL_URL=http://localhost:9000 DSMS_AGENT_TOKEN=dev-token go run ./cmd/agent
# Дев-режим фронта с hot-reload (проксирует /api на localhost:9000)
cd frontend && npm run devСборка образов (контекст — корень репозитория):
docker build -f panel/Dockerfile -t ghcr.io/xakus/dsms-panel:latest .
docker build -f agent/Dockerfile -t ghcr.io/xakus/dsms-agent:latest .openssl rand -hex 32 | docker secret create agent_token -
docker stack deploy -c dsms.yml dsmsБезопасность: panel не публикует порт наружу. Доступ — только через
reverse proxy (например, Nginx Proxy Manager) с HTTPS, подключённый к
overlay-сети dsms. Подробнее — раздел 7 ТЗ.
Панель умеет разворачивать стек из compose-файла прямо из UI — как
docker stack deploy, но без командной строки. На экране Стеки →
кнопка «Развернуть стек»:
- Вставьте
docker-stack.yml(или загрузите файл). Поддержаны YAML-якоря, интерполяция${VAR}/${VAR:-default},deploy,extra_hosts,ports: mode: host, overlay-сети. - Задайте переменные окружения: поле .env (строки
KEY=value) и/или ручные пары (перекрывают .env). Значения хранятся зашифрованными. - «Проверить» — dry-run: покажет, какие сервисы и сети будут созданы.
- «Развернуть» — панель создаёт сети → создаёт/обновляет сервисы.
Стек, развёрнутый из файла, помечается бейджем «из файла»: его YAML+env хранятся в панели, можно редактировать и передеплоить одной кнопкой. Опция prune (удалить сервисы, ушедшие из файла) по умолчанию выключена.
Все 8 этапов v1 реализованы (план — docs/plans/):
- ✅ Skeleton: auth + setup, ingest, WebSocket-hub, stack file
- ✅ Dashboard + Node detail + управление нодами (FR-01..03)
- ✅ Сервисы + стеки + registry auth (FR-04, FR-08, FR-13)
- ✅ Логи + события + audit (FR-05, FR-06)
- ✅ Secrets/Configs/Networks/Volumes + prune (FR-09..11)
- ✅ In-app алерты (FR-12)
- ✅ История метрик (окна 1ч–7дн) + Settings
- ✅ Per-container метрики, security headers, CI (multi-arch)
Следующий шаг — приёмка на живом Swarm-кластере и тег v1.0.0
(release-workflow опубликует образы в ghcr.io).
v2 (в работе): этап 9 — деплой стека из compose-файла через UI (FR-14), см. docs/plans/stage-9-stack-deploy.md.