A single live-status service directory at http://home.telep.lan so anyone can find every homelab service — and its fallback address — during an outage. Built with gethomepage/homepage (Next.js) in Docker on telep-mainframe, with each tile carrying a health dot and its raw-IP/tailnet fallback baked in. Building it surfaced a ~1.6-day Caddy boot-race outage — see Caddy boot-race found while building this.
For Agents
Reachable two ways (deliberately redundant):
- LAN / no-internet:
http://home.telep.lan→ Caddy:80on telep-mainframe →127.0.0.1:3010. Router resolves*.telep.lan→192.168.1.123.- Remote / Caddy-independent:
https://telep-mainframe.taild4189d.ts.net:8450viatailscale serve→127.0.0.1:3010. Survives a Caddy outage. Stack:/home/levander/homepage/on the mainframe (docker-compose.yml+config/{settings,services,widgets,bookmarks}.yaml). Binds127.0.0.1:3010only.
Purpose
The user asked for a page that answers “where is what” — during an outage you should be able to open one URL and see every service, whether it is up, and how else to reach it (raw IP, tailnet port, ssh target). It complements the older tailnet-only 2026-07-24-global-dashboard but is LAN-first and outage-hardened.
Tech & deployment
gethomepage/homepage (Next.js) in Docker at /home/levander/homepage/.
| Setting | Value | Why |
|---|---|---|
network_mode | host | REQUIRED — siteMonitor health checks must reach 127.0.0.1:PORT services and other LAN/VLAN IPs directly |
HOSTNAME | 127.0.0.1 | bind loopback only |
PORT | 3010 | 3000 was taken by ruview → binds 127.0.0.1:3010 |
HOMEPAGE_ALLOWED_HOSTS | see below | recent Homepage rejects unknown Host headers |
HOMEPAGE_ALLOWED_HOSTS = home.telep.lan,telep.lan,localhost,127.0.0.1(:3010),192.168.1.123(:3010),telep-mainframe.taild4189d.ts.net,100.115.209.87.
Host networking is not optional here
Homepage’s
siteMonitor:health checks fire from the Homepage process. On a bridge network it could not reach the127.0.0.1:PORTbackends or the camera VLAN IPs.network_mode: host(binding127.0.0.1:3010) is what makes the up/down dots real.
Two access paths (redundant on purpose)
a) http://home.telep.lan via the :80 split-horizon Caddy
The old static landing block was replaced with a reverse proxy in /etc/caddy/Caddyfile:
telep.lan, home.telep.lan {
reverse_proxy 127.0.0.1:3010
}- Replaced the previous
respond/placeholder inline-HTML block (backup at/etc/caddy/Caddyfile.bak-home-dash). - The router already resolves
*.telep.lan→192.168.1.123(wildcard dnsmasq on telep-router, see 2026-08-15-telep-lan-split-horizon-caddy).
b) https://telep-mainframe.taild4189d.ts.net:8450 via Tailscale Serve
tailscale serve --bg --https=8450 http://127.0.0.1:3010Why a second path
This tailnet path is deliberately Caddy-independent — if Caddy dies (exactly what happened, below), the dashboard is still reachable remotely to diagnose the rest. A status page that dies with the reverse proxy is useless during the outage it is meant to survive.
Layout — 18 tiles / 6 groups (Hungarian)
Health = siteMonitor: per tile (up/down dot) except the two cameras which use ping:.
| Group | Tile | Backend / check |
|---|---|---|
| Kamerák & NVR | Frigate | frigate.telep.lan /health (:5000) |
| go2rtc | go2rtc.telep.lan (:1984) | |
| Kamera DÉL | ping 192.168.30.119 | |
| Kamera ÉSZAK | ping 192.168.30.139 | |
| Admin & Hozzáférés | Admin portál | admin.levandor.io /health (OliveTin :1337) |
| Pocket-ID | id.levandor.io (:1411) | |
| Tárolás & Tudás | Fájlböngésző | files.telep.lan (:8334) |
| Knowledgebase | tailnet (:8092) | |
| Qdrant | :6333 /healthz | |
| Stirling-PDF | tailnet (:8080) | |
| Eszközök & Média | Whiteboard | whiteboard.telep.lan (:8790) |
| Top képek | top.telep.lan (:8090) | |
| Thermoprint | print.telep.lan (:8095) | |
| AirPlay | telep-tv | |
| SDR/Kraken | KrakenSDR | kraken.telep.lan / 192.168.1.200:8080 — red while Pi offline |
| Hálózati eszközök | Router LuCI | 192.168.1.1 |
| AP bandi (TL-WA850RE) | 192.168.1.101 | |
| Nyomtató (HP M203dw) | 192.168.1.126 |
Jellyfin was OMITTED on purpose
Its backend is dead on
:8096(same guessed-name/dead-backend flag as in 2026-08-15-telep-lan-split-horizon-caddy). A permanently-red tile on a status board is noise, so it was left off entirely.
Outage-safe design choices
The whole point is that this page still works when other things don’t:
- No external icon fetches — no
icon:fields, so there is no CDN dependency. A dead WAN doesn’t blank the board. - Only local widgets —
datetime+resources(no weather / no remote APIs). - Fallbacks baked in — each tile’s
descriptioncarries the raw IP / alternate port, plus a dedicated ”⚡ Kiesés esetén” bookmarks group listing tailnet ports, raw IPs, and ssh targets. So even if a tile is red, you can read how else to reach the thing.
GOTCHA — a colon-space in a Homepage description breaks YAML parsing
config/services.yamlis YAML. Adescription:value that contains a colon followed by a space (e.g.Windows C: (RO)) is parsed as a nested mapping key →bad indentation of a mapping entry. QUOTE everydescription:value (description: "Windows C: (RO)"). Cheap to hit, annoying to diagnose (the error points at indentation, not the colon).
Caddy boot-race found while building this
Building this dashboard surfaced a live ~1.6-day outage — see the full write-up
While wiring
home.telep.laninto Caddy,caddy.servicewas foundfailedsince 2026-08-15 18:44 (the YubiKey-FDE reboots), taking every*.telep.lanname AND bothlevandor.ioportals offline by-domain the whole time. Root cause + theip_nonlocal_bindfix are documented in Caddy boot-race outage (2026-08-17), the Caddy :443 boot-race banner, and the runbook caddy-boot-race. It is cross-linked here because fixing Caddy is a prerequisite for path (a) of this dashboard.
Related
- 2026-08-15-telep-lan-split-horizon-caddy — the
:80split-horizon Caddy this dashboard is proxied through; now hosts the boot-race outage write-up - telep-mainframe — the host running Homepage + Caddy + every backend
- telep-router — serves the
*.telep.lanwildcard DNS that makeshome.telep.lanresolve - caddy-boot-race — runbook: all
.telep.lan/levandor.iodown after a reboot - 2026-08-15-admin-portal-passkey-olivetin — the
admin.levandor.io/ Pocket-ID tiles’ backend - 2026-07-24-global-dashboard — the earlier tailnet-only landing dashboard this supplements
- 2026-08-15-yubikey-gated-luks-fde — the reboots that triggered the Caddy race came from this work
- service-unreachable — the general “a service won’t load” runbook