Grafana Dashboards
Dashboards live in code/docker/grafana/dashboards/*.json and are loaded by the provider in code/docker/grafana/provisioning/dashboards/dashboards.yml (folder: Homelab). Data sources are provisioned in datasources/datasources.yml: Prometheus (default), Loki, and Prometheus-Annotations (second Prometheus DS configured for POST — lets OOM events render as red vertical annotations on every dashboard).
The default home dashboard is set via GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/node-exporter.json.
How to iterate on a dashboard
- Edit live in Grafana UI (
grafana.h5h.me).allowUiUpdates: trueis set in the provider. - Export: dashboard gear → Share → Export → Save to file. Use Export for sharing externally: off so data-source UIDs stay bound.
- Drop the JSON into
code/docker/grafana/dashboards/<name>.json, commit. make update-service s=grafanato re-apply.
disableDeletion: false is intentional — delete via git, not UI.
Catalogue
node-exporter.json — Default home
- Host CPU / memory / load / filesystem / network.
- Data source: Prometheus.
- Panels depend on metrics from the
node-exporterjob (node_cpu_seconds_total,node_memory_*,node_filesystem_*). - On macOS (Docker Desktop/OrbStack), these values reflect the Linux VM allocated to Docker, not the full physical Mac. If Grafana shows ~4 GiB RAM and ~5 GiB swap, increase the Docker VM memory/swap allocation in your container runtime settings.
Docker container dashboard
- Not currently provisioned.
- The previous
docker.jsonfile in this repo was a malformed export payload (not a valid dashboard schema) and could trigger dashboard load failures. - If this view is needed, re-import a valid dashboard JSON and wire
container_*metrics (typically via cAdvisor) before enabling it.
traefik.json — Edge
- Request rate and latency per router, status-code breakdown.
- Data sources: Prometheus (
traefik_*metrics on:8082) + Loki ({job="traefik-access"}for log drill-down). - Pair this with
HighUnauthorizedRate/HighServerErrorRatealerts.
security-access.json — Security signal
- CrowdSec decisions, 401/403 rate, top banned IPs.
- Data source: Loki (CrowdSec log stream + Traefik access log).
- The OOM annotation (via
Prometheus-AnnotationsDS) decorates this dashboard so you can correlate denied requests with infra flap.
Future dashboards
- Postgres Database Metrics: The un-scraped
postgres.jsonplaceholder was removed to keep Grafana clean. To monitor Authentik, Immich, or Nextcloud Postgres instances in the future, deployprometheuscommunity/postgres-exporter, add scrape targets toprometheus/prometheus.yml, and re-introduce the dashboard.