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

Катастрофоустойчивость

Проект хранится в двух 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.

S
Description
Pull-mirror of gitverse.ru:kpa39l/monitoring — Garage cluster monitoring stack (katastrofoustoychivost)
Readme 317 KiB
Languages
Python 100%