NOC · ZABBIX + PROMETHEUS · KIOSK MODE

The wall tells you when something breaks.

Most NOC "dashboards" are a couple of static Zabbix maps and a generic Grafana nobody looks at. This replaces them with three boards designed to be read from across the room: a downed AP pulses red with radar rings, a dead switch shakes and drops out of the topology, a server that stopped responding flips to a red "NO RESPONSE" card. Everything animates — the wall tells you what broke without anyone reading a number.

3 boards
wireless · network (topology) · servers
10 s TTL
10 TVs refreshing every 15 s hit Zabbix once, not 10 times
0 credentials
the browser only sees 3 read-only JSON endpoints
kiosk mode
rotates the 3 boards every 45 s, F11, leave it on the TV
The three boards

Each one, glanceable from across the room.

BoardWhat it shows
WirelessAPs grouped by building from a Zabbix sysmap. A downed AP turns red with expanding radar rings; its building panel enters alarm border. Up/total count per building, sorted so the problem floats to the top.
NetworkLive LAN topology from a sysmap: nodes "breathe", links animate directional flow, core switches are highlighted, and a downed node shakes + rings. A ticker below streams High/Disaster problems, and an OFF-MAP strip surfaces monitored hosts that aren't drawn on the map.
ServersPrometheus targets as cards with conic CPU/RAM/disk rings (green→amber→red by threshold), live RX/TX throughput, uptime, and OS. Supports windows_exporter and node_exporter. A target with up == 0 turns into a red "NO RESPONSE" card.
Design notes

The details that matter.

🔒

Credential isolation

All secrets and endpoints are server-side env vars. The three JSON endpoints are read-only and don't expose upstream detail beyond what a board needs to draw.

🗺️

The "off-map" insight

Legacy NOC maps only show what someone placed by hand. A switch that was down when the map was drawn simply isn't there — the worst outages become invisible. This board cross-references monitored groups against the map and lists what's missing, with the down ones first.

🔑

Zabbix session

The proxy logs in once, reuses the session token, and transparently re-logs-in exactly once if a call comes back with an auth error — so a token expiration never shows up as a blank board.

🩹

Fail visibly

If the backend can't be reached, the board shows "no data — retrying…" and keeps polling; it never freezes on stale numbers pretending everything's fine.

Stack

A thin proxy, three boards.

boundary
TVs / browser                         FastAPI proxy + cache        upstreams
wireless.html ┐                       /api/wireless ┐
network.html  ├─ fetch every 15 s ────▶ /api/red     ├─ TTL 10 s ─▶ Zabbix JSON-RPC
servers.html ┘   (no credentials)     /api/servers ┘             └─▶ Prometheus HTTP

Each board fires its calls to Zabbix/Prometheus with asyncio.gather, so a board that needs map + availability + problems + host details resolves in the time of a single round trip.

FastAPI + httpx asyncZabbix JSON-RPCPrometheus HTTPHTML/CSS/SVG/JSno CDNDocker Compose
The request path

Follow one refresh through the proxy.

Every board polls the same three endpoints. What happens behind them turns on two questions: is the cache still warm — and does Zabbix still like the token?

3 boardsfetch 15 s · no creds /api proxycache · TTL 10 s zapi()session token ZabbixJSON-RPC PrometheusHTTP API