← Canvas Host grafana.gliffy.tv

Grafana / Helios setup

In-depth map of how Grafana is deployed on moneta — compose stack, auth, datasources, scrape mesh, dashboards, and the garage Postgres path.

What Helios is

Grafana is not a standalone install. It lives inside /dock/helios on moneta (10.0.0.10), alongside Prometheus, Homarr, Unpoller, and node-exporter. Public entry is Caddy at grafana.gliffy.tv.

13/13Prometheus targets up
7Provisioned dashboards
2Datasources
30dProm TSDB retention

Public URLs

Homarr: helios.gliffy.tv

Grafana: grafana.gliffy.tv

Local binds only — Caddy reverse-proxies 127.0.0.1:7575 / :3000. Prometheus (:9090) stays LAN/localhost.

Auth model

Grafana: local admin + Authentik OIDC (GF_AUTH_GENERIC_OAUTH_*).

Homarr: AUTH_PROVIDERS=oidc,credentials against auth.gliffy.tv.

Sign-up disabled for Grafana local users; OAuth allow-sign-up enabled for Authentik accounts.

Compose services (localhost binds)

ContainerImageBindRole
helios-grafanagrafana/grafana:latest127.0.0.1:3000UI + provisioning
helios-prometheusprom/prometheus:latest127.0.0.1:9090TSDB · 30d retention
helios-homarrhomarr-labs/homarr127.0.0.1:7575Front door
helios-unpollerunpoller/unpoller127.0.0.1:9130UniFi → Prometheus
helios-node-exporternode-exporter:v1.9.1127.0.0.1:9100Moneta host metrics

Source: /dock/helios + Prometheus /api/v1/targets · snapshot 2026-08-21

Data paths

Two independent ingest paths feed Grafana. Metrics go through Prometheus scrapes. Garage vehicle data is written via the telemetry API into Postgres; Grafana queries those views with a read-only role.

Caddy Grafana Prometheus Unpoller / exporters
garagepi / app telemetry-api :8120 Postgres Grafana (read-only)

Path A — Prometheus

Exporters / Unpoller → Prometheus (:9090, 15s scrape, 30d) → Grafana datasource prometheus (default).

Covers host, GPU, Ollama tok/s, ComfyUI queue, UniFi network.

Path B — Postgres

garagepi / Android → telemetry-api :8120 → Postgres telemetry → Grafana datasource telemetry-postgres.

Apps never talk to Grafana or Postgres for writes; only the API writes, Grafana reads.

Hosts in the scrape mesh

HostIPRoleExporters
moneta10.0.0.10storage / LLMnode, ollama :9102, nvidia :9104
glifftop10.3.119.177gaming / LLMnode, amdgpu :9101, ollama :9102, comfy :9103
bigscreen10.4.199.235gaming / Comfynode, amdgpu :9101, ollama :9102, comfy :9103
UniFi10.0.0.1networkvia Unpoller → :9130

Desktop exporters run as systemctl --user with linger. Templates under /dock/helios/*-exporters/.

Provisioned datasources

Files under /dock/helios/grafana/provisioning/datasources/ mount read-only into Grafana at /etc/grafana/provisioning.

Prometheus (default)

UID prometheus · type prometheus

URL http://prometheus:9090 (Docker DNS on helios network)

Access: proxy · timeInterval 15s · HTTP POST

Telemetry Postgres

UID telemetry-postgres · postgres plugin

Host 10.0.0.10:5432 · db telemetry

User grafana (read-only) · SSL disabled (LAN)

Password from GRAFANA_DB_PASSWORD in /dock/postgres/.env

Why two datasources

Time-series infra metrics belong in Prometheus. Arrival/OBD session rows are relational event data already stored for the ingest API — SQL views are the right surface for garage dashboards.

Prometheus scrape mesh

Config: /dock/helios/prometheus/prometheus.yml · global scrape/eval 15s · retention 30d · live probe 13/13 up.

Port convention

PortExporterWhere
9100node_exportermoneta + desktops
9101amd-gpu-exporterglifftop + bigscreen
9102ollama-exportermoneta + desktops
9103comfy-exporterglifftop + bigscreen
9104nvidia-gpu-exportermoneta (2× T4)
9130unpollerHelios compose

Live targets

JobInstanceHostHealth
prometheuslocalhost:9090up
unpollerunpoller:9130up
nodenode-exporter:9100monetaup
node10.3.119.177:9100glifftopup
node10.4.199.235:9100bigscreenup
amdgpu10.3.119.177:9101glifftopup
amdgpu10.4.199.235:9101bigscreenup
ollama10.0.0.10:9102monetaup
ollama10.3.119.177:9102glifftopup
ollama10.4.199.235:9102bigscreenup
comfyui10.3.119.177:9103glifftopup
comfyui10.4.199.235:9103bigscreenup
nvidia10.0.0.10:9104monetaup

Custom exporters

  • ollama-exporter — tails journald tok/s lines + polls /api/ps
  • comfy-exporter — polls ComfyUI /system_stats, /queue, /prompt
  • amd-gpu-exporter — consumer AMD via sysfs (:9101)
  • nvidia-gpu-exporter — Moneta Tesla T4s (:9104)

Dashboard provisioning

Two file providers reload every 30s with UI edits allowed. Helios folder → .../dashboards/json; Garage folder → .../dashboards/garage.

FolderTitleUIDPanelsDatasource
HeliosMoneta Overviewmoneta-overview76Prometheus
HeliosUniFi-Poller: Network Sites9WaGWZaZk6Prometheus
HeliosUniFi-Poller: Client InsightsjMfvAjxWz21Prometheus
HeliosUniFi-Poller: UAP Insightsg5wFWqxZk27Prometheus
HeliosUniFi-Poller: USG Insights4Yo8IZ-Wk3Prometheus
HeliosUniFi-Poller: USW InsightsFsfxpWaZz10Prometheus
GarageIoniq 5 · garagepiioniq5-garagepi16Telemetry Postgres

Moneta Overview rows

  • Moneta — CPU & memory
  • Storage pools
  • UniFi
  • Desktops — CPU / RAM / disk
  • AMD GPUs — Glifftop & Bigscreen
  • NVIDIA GPUs — Moneta 2× Tesla T4
  • Ollama — tokens / second
  • ComfyUI — queue & VRAM

Ioniq 5 · garagepi

  • HV SOC / SOH / Remaining / Pack V / 12V stats
  • Timeseries for pack, temps, CEC/CED, 12V
  • Recent garagepi events table

/d/ioniq5-garagepi

Garage telemetry → Grafana

Relational EV/garage data — Grafana is the visualization front door; writes go through the ingest API only.

:5432Postgres on moneta
:8120telemetry-api ingest
grafanaread-only DB role
/dockpostgres + telemetry-api

SQL views

ViewPurpose
ioniq_events_for_grafanaarrival + obd_manual events with HV SOC
ioniq_readings_for_grafanaMode 22 / Mode 01 readings joined to sessions
arrivals_for_grafanaarrival-only (legacy)

Contract boundaries

  • Writers: garagepi outbox, Android trips, Pi web UI — bearer-keyed POST /v1/…
  • Dashboard readers: Grafana → Postgres SELECT on views only
  • Do not point apps at Postgres credentials; Pi is not the system of record

Day-to-day operations

Start / reload

cd /dock/helios && docker compose up -d

Prom config: docker compose exec prometheus kill -HUP 1

Helpers: ./reload-grafana-dashboards.sh, ./apply-monitoring.sh

Persistent data

Grafana: ./data/grafana

Prometheus: ./data/prometheus

Homarr: ./data/homarr

Provisioning: ./grafana/provisioning + ./prometheus/prometheus.yml

Caddy ingress

helios.gliffy.tv127.0.0.1:7575

grafana.gliffy.tv127.0.0.1:3000

Snippet: /dock/helios/caddy/Caddyfile.snippet

Known sharp edges

Unpoller container healthchecks have flaked while scrapes still succeed. Desktop exporters need linger. Bigscreen may report ollama_up=0 if Ollama is stopped even when the exporter scrape is up.