Monitoring stack — Garage cluster (vps01 + bigbox + vps02)
Стек мониторинга для S3-кластера Garage (репликация RF=3, WireGuard 10.8.0.0/24).
Расположен на bigbox в /opt/monitoring.
Архитектура
bigbox (10.8.0.2)
┌─────────────────────────────────────────────────┐
│ prometheus :9090 (host net) │
│ │ scrape ──► garage x3 :3903 (WG admin) │
│ ├──► node-exporter :9100 (bigbox) │
│ ├──► 10.8.0.1:3903 (vps01) │
│ ├──► 10.8.0.4:3903 (vps02) │
│ └──► blackbox :9115 (host net) → /health │
│ │
│ grafana :3001 (dashboards, alerts) │
│ loki :3100 (logs) │
│ promtail ── docker.sock ──► docker logs garage │
└─────────────────────────────────────────────────┘
│ │
▼ WireGuard 10.8.0.0/24 ▼ caddy (vps02)
vps01 (10.8.0.1) grafana.nixg.ru
vps02 (10.8.0.4) → 87.242.100.206 → reverse_proxy 10.8.0.2:3001
Прометеус и blackbox-exporter работают в host network (иначе не видят WireGuard-подсеть 10.8.0.0/24 хостa). Остальные — в bridge-сети monitoring.
Сервисы и порты
| Сервис | Порт | Доступ | Примечание |
|---|---|---|---|
| Prometheus | 9090 | локально/WG | host network, retention 30d (TSDB) |
| Grafana | 3001 | браузер + публично | 3000 занят gitea → 3001 |
| Loki | 3100 | локально | сбор логов, retention 7d |
| Promtail | — | docker.sock | docker logs garage и др. |
| blackbox-exporter | 9115 | host network | HTTP-пробы /health нод |
| node-exporter | 9100 | WG | на каждой ноде (apt) |
Публичный доступ
grafana.nixg.ru → 87.242.100.206 (vps02) → caddy → reverse_proxy 10.8.0.2:3001
- Запись добавлена в
/opt/caddy/Caddyfileна vps02:grafana.nixg.ru { reverse_proxy 10.8.0.2:3001 } - Caddy — docker-контейнер (
network_mode: host), перезагрузка:docker exec caddy caddy reload --config /etc/caddy/Caddyfile - Сертификат Let's Encrypt выпускается автоматически.
- Логин: estorozhenko (сменён с admin через UI), пароль — задан пользователем.
Garage admin API (метрики)
В Garage v2.1 admin API (включая /metrics в Prometheus-формате) слушает
отдельный порт [admin] api_bind_addr. На всех трёх нодах прописано:
[admin]
api_bind_addr = "<WG-IP>:3903" # bigbox 10.8.0.2, vps01 10.8.0.1, vps02 10.8.0.4
admin_token = "..."
metrics_token = "..."
Проверка метрик:
curl -H "Authorization: Bearer TOKEN" http://10.8.0.2:3903/metrics
/health возвращает 200 при кворуме (≥2 нод), 503 иначе.
Порты 3903 и 9100 открыты только для WG-подсети:
- vps01:
ufw allow from 10.8.0.0/24 to any port 3903(и 9100 аналогично) - vps02/bigbox: файрвол не блокирует (policy ACCEPT)
Запуск
cd /opt/monitoring
docker compose up -d
Пароль Grafana — переменная GRAFANA_ADMIN_PASSWORD в .env (по умолчанию admin).
Пользователь Grafana: estorozhenko (сменён пользователем вручную).
Полезные команды
# статус кластера
docker run --rm -v /opt/garage/garage.toml:/etc/garage.toml:ro \
-v /opt/garage/meta:/var/lib/garage/meta \
--entrypoint /garage dxflrs/garage:v2.1.0 status
# метрики одной ноды (Prometheus-формат)
curl -s -H "Authorization: Bearer TOKEN" http://10.8.0.2:3903/metrics | head
# health
curl -s -o /dev/null -w "%{http_code}" http://10.8.0.2:3903/health
# таргеты прометея (все должны быть UP)
curl http://127.0.0.1:9090/api/v1/targets
# принудительная синхронизация mirror'а в gitea
curl -X POST -H "Authorization: token GITEA_TOK" \
http://127.0.0.1:3000/api/v1/repos/estorozhenko/monitoring/mirror-sync
Алерты (prometheus/alerts.yml)
| Алерт | Условие | Severity |
|---|---|---|
| GarageNodeDown | up{job="garage"} == 0 (2м) |
critical |
| GarageNoQuorum | <2 нод up (2м) |
critical |
| GarageResyncErrors | garage_block_resync_error_count > 0 (10м) |
warning |
| GarageNodeUnstable | RPC health down (5м) | warning |
tproxy-server (vps03) — метрики WEB Proxy (этап 6, в работе)
tproxy-server (Telegram Desktop WEB Proxy) развёрнут на vps03 (77.67.89.154),
admin-эндпоинты на loopback :8081: /healthz, /readyz, /metrics
(Prometheus-формат, 13 счётчиков tproxy_*). vps03 НЕ в WG-сети, поэтому
для scrape с bigbox нужно:
- nft-правило на vps03: разрешить TCP 8081 с publIP bigbox 178.176.197.2
(
nft add rule inet filter input ip saddr 178.176.197.2 tcp dport 8081 accept) - job
tproxyв prometheus.yml:targets: ['77.67.89.154:8081'] docker compose restart prometheus, проверитьup{job="tproxy"}
Подробности — в PLAN.md (этап 6) и EXPERIENCE.md.
Катастрофоустойчивость
Проект хранится в двух git-репозиториях — на случай поломки bigbox:
| Репозиторий | Роль | Адрес |
|---|---|---|
| gitverse.ru (облако) | источник истины | git@gitverse.ru:kpa39l/monitoring.git |
| gitea на bigbox | pull-mirror (8h) | https://gitea.nixg.ru/estorozhenko/monitoring |
Порядок работы: правки коммитятся и пушутся в gitverse (источник), gitea подтягивает их mirror'ом (каждые 8ч или вручную mirror-sync). Если bigbox сломается — репозиторий остаётся в облаке gitverse.