# WALKTHROUGH — Мониторинг кластера (капитанский журнал) Хронология. Цель — воспроизводимость с нуля. Подробные грабли — в EXPERIENCE.md. ## 2026-09-08 — vps03 в WG + per-node дашборды (сессия @session:default/20260908_142639_b2d5b4) ### Задача Мониторинг vps03 (77.67.89.154, Debian 13) без публикации порта наружу; на каждую ноду отдельный дашборд с сетью по интерфейсам (RX/TX + утилизация). ### Шаг 1. WireGuard vps03 1. Сгенерировать ключ vps03 на bigbox: `wg genkey | tee priv | wg pubkey | tee pub` (получили `HBTzrS86SZ+...`). 2. На vps03: `apt install wireguard-tools`, `/etc/wireguard/wg0.conf`: ``` [Interface] Address = 10.8.0.3/24 PrivateKey = [Peer] PublicKey = Endpoint = 5.129.217.146:51820 AllowedIPs = 10.8.0.0/24 ``` `systemctl enable --now wg-quick@wg0`. ⚠️ Грабль: `printf "PrivateKey = ..."` в heredoc съел пробел (`PrivateKey=...`) → wg-quick падал. Исправлять прямой перезаписью файла. 3. На vps01 (hub): `wg set wg0 peer allowed-ips 10.8.0.3/32` + добавить блок [Peer] в /etc/wireguard/wg0.conf (навсегда, cp .bak сначала). 4. На bigbox/vps02: тот же `wg set ... allowed-ips 10.8.0.3/32` + в файл. 5. **Грабль-звезда:** ping vps03→vps01 работает, а vps03→bigbox/vps02 — нет. Причина: WireGuard дропает пакеты, чей src НЕ в AllowedIPs пира. У bigbox/vps02 в AllowedIPs пира vps01 было только `10.8.0.1/32`. Решение: расширить до `10.8.0.1/32, 10.8.0.3/32` (runtime `wg set` + файл). После этого ping OK (vps03→bigbox 113ms, vps03→vps02 86ms). ### Шаг 2. node-exporter vps03 1. `apt install prometheus-node-exporter`, `/etc/default/prometheus-node-exporter`: `ARGS="--web.listen-address=10.8.0.3:9100"` (не 127.0.0.1 — иначе по WG не достать; не `*:` — наружу светится). 2. Проверка: `ss -tlnp | grep 9100` → 10.8.0.3:9100; `curl http://77.67.89.154:9100` → refused. 3. prometheus.yml: в job `node` добавлен таргет `10.8.0.3:9100` (relabel host=vps03). `docker compose restart prometheus`, проверить `api/v1/targets` → node ×4 up. ### Шаг 3. Per-node дашборды 1. Обнаружение: в node-exporter 1.9 (apt/Debian 13) метрики сети называются `node_network_receive_bytes_total{device=...}` / `node_network_transmit_bytes_total`, скорость линка — `node_network_speed_bytes` (Б/с). 2. Генератор `/tmp/gen_nodes_dash.py` (Python) → `grafana/dashboards/node-.json` (uid `node-`, title "Node "): панели Availability (stat up), Disk free GB (`node_filesystem_avail_bytes{fstype!~"tmpfs|overlay|squashfs"}`), Memory (`node_memory_MemAvailable_bytes`), Load (load1/5/15), Net RX/TX (`rate(...[5m])`), Net utilization `(rx+tx)*8/speed*100`. 3. Физические интерфейсы: vps01=eth0, vps02=enp3s0, vps03=ens1, bigbox=eno1. Контейнерные (docker0/veth*/br-*) исключены. 4. **Грабль скорости:** на виртуалках vps01/vps02 `node_network_speed_bytes` = **-125000** (sysfs speed=-1 → exporter умножает на 125000). На физических (vps03/bigbox) = 1.25e+08. Решение: для vps01/vps02 в формуле утилизации константа `125000000` Б/с (1 Гбит), для vps03/bigbox — сама метрика. 5. Provisioning подхватывает дашборды автоматом (~30с, перечитывает папку). Проверка: `docker cp grafana:/var/lib/grafana/grafana.db /tmp/gf.db`, `SELECT uid,title FROM dashboard WHERE uid LIKE 'node-%'` → 4 строки. 6. Общий nodes.json удалён — заменён на 4 per-node дашборда. ### Шаг 4. Git - `git add -A && git commit` (2 коммита: WG+дашборды; EXPERIENCE-грабли) - `git push origin master` → gitverse (6e48fd8, eaafb1f) - gitea mirror-sync: `curl -X POST -H "Authorization: token " http://127.0.0.1:3000/api/v1/repos/estorozhenko/monitoring/mirror-sync` → 200 ### Итог проверки - `api/v1/targets?state=any` → node ×4 up (10.8.0.1/2/3/4) - grafana.nixg.ru/api/health → 200 - Дашборды node-vps01/02/03/bigbox — в БД Графаны ## 2026-09-08 (вечер) — подпапки дашбордов (сессия @session:default/20260908_180858_730d1b) Пользователь создал папки в UI Grafana (nodes, vinogorod) и попросил разложить дашборды по ним (в файловой системе + в интерфейсе). 1. Перемещение на диске (git mv, история сохранена): ``` grafana/dashboards/nodes/node-{bigbox,vps01,vps02,vps03}.json grafana/dashboards/vinogorod/vinograd-wan.json garage-cluster.json — остался в корне ``` 2. `grafana/provisioning/dashboards/dashboards.yml` — 3 провайдера: - garage-dashboards → path /var/lib/grafana/dashboards (корень), folder: Garage - node-dashboards → path .../dashboards/nodes, folder: nodes - vinogorod-dashboards → path .../dashboards/vinogorod, folder: vinogorod (Grafana type:file НЕ ходит рекурсивно — поэтому на подпапку свой provider.) 3. `docker compose restart grafana` — provisioning применил папки. 4. Проверка по БД: Node * → nodes, Vinograd WAN → vinogorod, Garage Cluster → Garage. 5. Коммит 4b0539d → gitverse + gitea mirror-sync.