homepage: function-first layout + fleet label sweep

Reorganize the gethomepage dashboard from site-based (PFI-ANA, ESH, NH3)
to function-first grouping (Monitoring, AI Systems, Apps, Media, Games,
Infra-<site>, Service Networking). Canonical config now tracked in
configs/homepage/ with Plex/Jellyfin widget keys moved to env
substitution.

Label sweep across fleet compose files:
  - beszel, dozzle, backrest -> Monitoring
  - rest-server-ana -> Service Networking

Healthcheck fixes (previous wget/curl paths broke on distroless +
--private-repos 401):
  - beszel hub:    /beszel health --url ...
  - beszel agent:  /agent health (newly added)
  - rest-server:   nc -z localhost 8000 (TCP probe)

Group name originally "Wiring / Plumbing" collapsed to single-word group
on homepage's parser; renamed to "Service Networking" everywhere.
This commit is contained in:
vh
2026-04-20 22:14:00 -07:00
parent 8c15ec2d5f
commit 2be296ffa0
16 changed files with 465 additions and 10 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ services:
networks:
- tnet
labels:
- homepage.group=PFI-ANA
- homepage.group=Monitoring
- homepage.name=Backrest
- homepage.icon=mdi-backup-restore
- homepage.description=Restic snapshot viewer / restore UI
+24 -5
View File
@@ -6,7 +6,8 @@
# Multi-host layout via compose profiles:
# COMPOSE_PROFILES=hub → hub only (ana-docker)
# COMPOSE_PROFILES=hub,agent → hub + local agent on the same host
# COMPOSE_PROFILES=agent → agent only (ana-ml2)
# COMPOSE_PROFILES=agent → agent only (ana-ml2, nh3-docker,
# esh-docker-vm, vm-esh-nas)
#
# The agent uses network_mode: host so it sees real host CPU/mem/net/disk
# counters rather than container-scoped ones — that's why it can't share
@@ -25,15 +26,17 @@ services:
volumes:
- beszel_data:/beszel_data
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:8090/api/health"]
interval: 30s
# Hub image is distroless — no wget/curl. Use the bundled `/beszel`
# binary's built-in health subcommand (https://beszel.dev/guide/healthchecks).
test: ["CMD", "/beszel", "health", "--url", "http://localhost:8090"]
interval: 120s
timeout: 10s
retries: 3
start_period: 15s
networks:
- tnet
labels:
- homepage.group=PFI-ANA
- homepage.group=Monitoring
- homepage.name=Beszel
- homepage.icon=mdi-chart-line
- homepage.description=Server + container monitoring
@@ -49,9 +52,25 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro
- beszel_agent_data:/var/lib/beszel-agent
environment:
# Agent auth has two modes (v0.13+ supports both side-by-side):
# - KEY-mode: agent listens, hub connects inbound over SSH using KEY.
# Requires BESZEL_HUB_KEY in .env.
# - Token-mode: agent initiates an outbound connection to HUB_URL
# using TOKEN. Easier through NAT. Requires HUB_URL + BESZEL_TOKEN.
# Leave unused ones empty ("") in .env; both can be set simultaneously.
- PORT=${BESZEL_AGENT_PORT:-45876}
- KEY=${BESZEL_HUB_KEY}
- KEY=${BESZEL_HUB_KEY:-}
- HUB_URL=${HUB_URL:-}
- TOKEN=${BESZEL_TOKEN:-}
- EXTRA_FILESYSTEMS=${BESZEL_EXTRA_FS:-}
healthcheck:
# Agent image ships the `/agent` binary with a `health` subcommand.
# Verifies the agent process is up — not that the hub can reach it.
test: ["CMD", "/agent", "health"]
interval: 120s
timeout: 10s
retries: 3
start_period: 15s
volumes:
beszel_data:
+1 -1
View File
@@ -34,7 +34,7 @@ services:
networks:
- tnet
labels:
- homepage.group=PFI-ANA
- homepage.group=Monitoring
- homepage.name=Dozzle
- homepage.icon=mdi-text-box-search
- homepage.description=Container logs (ana-docker + ana-ml2)
+6 -2
View File
@@ -40,7 +40,11 @@ services:
- OPTIONS=--private-repos --append-only --prometheus ${EXTRA_OPTIONS:-}
- TZ=${TZ:-America/Los_Angeles}
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:8000/metrics >/dev/null 2>&1 || [ $? -eq 6 ] && exit 0 || exit 1"]
# TCP port probe — busybox nc ships in the restic/rest-server Alpine
# image. HTTP-level checks fight with --private-repos returning 401
# (busybox wget exit 8, gnu wget exit 6 — version-dependent and hard
# to branch on cleanly in POSIX sh).
test: ["CMD", "nc", "-z", "localhost", "8000"]
interval: 30s
timeout: 10s
retries: 3
@@ -48,7 +52,7 @@ services:
networks:
- tnet
labels:
- homepage.group=PFI-ANA
- homepage.group=Service Networking
- homepage.name=Restic (rest-server)
- homepage.icon=mdi-cloud-upload
- homepage.description=Anaheim restic endpoint (data on NFS)
+3 -1
View File
@@ -33,7 +33,9 @@ services:
# automatically — no extra bind mount needed as long as the htpasswd
# file is created inside DATA_DIR before startup.
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:8000/metrics >/dev/null || exit 1"]
# TCP port probe — avoids the --private-repos 401 trap.
# See stacks/rest-server-ana/compose.yaml for reasoning.
test: ["CMD", "nc", "-z", "localhost", "8000"]
interval: 30s
timeout: 10s
retries: 3