Add mdBook infra runbook served by Caddy on control

Docs live in docs/ (DNS, ZeroTier mesh, monitoring), built at Nix-build time and
served as static files over the ZeroTier mesh on control:8080. Commit-to-edit:
change the markdown and redeploy to publish.
This commit is contained in:
Berwn
2026-06-17 14:26:21 +07:00
parent 3a8fe660a5
commit a7d4c0e567
8 changed files with 221 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# Monitoring
Metrics and dashboards live on `control`, reachable only over the ZeroTier mesh.
## Collection
- **node_exporter** (`:9100`) on every machine — CPU, memory, disk, systemd units.
Binds all interfaces; the scrape ports are firewall-scoped to the mesh subnet
(`modules/monitoring/exporters.nix`).
- **knot-exporter** (`:9433`) on `ns1`/`ns2` only — reads Knot's control socket,
fed by the `mod-stats` module (query/response counters per zone).
## Storage & scraping
**VictoriaMetrics** on `control`, bound to `127.0.0.1:8428`, 180-day retention
(`modules/monitoring/server.nix`). It scrapes `control` over loopback and `ns1`/
`ns2` over the mesh.
> The scraper dials IPv4-only by default, so mesh (IPv6) targets need
> `extraOptions = [ "-enableTCP6" ]`. Without it, ns1/ns2 are dropped with
> "no suitable address found". Check live target health on `control`:
>
> ```
> curl -s http://127.0.0.1:8428/api/v1/targets | jq '.data.activeTargets[] | {i:.labels.instance, h:.health, e:.lastError}'
> ```
## Dashboards
**Grafana** on `control` (`:3000`), mesh-only, anonymous access disabled. The
admin password is a clan var:
```
clan vars get control grafana-admin/password
```
The provisioned **CNX DNS** dashboard (`modules/monitoring/dashboards/dns.json`)
shows per-nameserver SOA serials, zone expiry countdowns, query/response rates,
and host CPU/memory/disk/load.