Files
vh 2be296ffa0 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.
2026-04-20 22:14:00 -07:00

96 lines
3.9 KiB
Markdown

# homepage
Canonical copies of the [gethomepage.dev](https://gethomepage.dev/) config
for the fleet dashboard running on `esh-docker-vm` (`10.0.50.45`).
## What lives here
| File | Purpose |
|---|---|
| `settings.yaml` | Title, theme, background, quick-launch, group layout |
| `services.yaml` | Manual entries — infra, BMCs, off-Docker endpoints, fleet hubs |
| `bookmarks.yaml` | External links (UltraSeedbox, etc.) |
| `widgets.yaml` | Top-of-page widgets (resource panel, search) |
| `docker.yaml` | Per-host Docker socket providers for label-based auto-discovery |
| `kubernetes.yaml`, `proxmox.yaml` | Empty / sample — kept so homepage doesn't warn on startup |
| `custom.css`, `custom.js` | Placeholders |
| `.env.example` | Template for widget secrets (Plex, Jellyfin, eventual Proxmox tokens) |
The real `.env` (with Plex + Jellyfin keys) lives on `esh-docker-vm` next
to the compose file and is gitignored.
## Layout convention
`settings.yaml` drives the group layout:
```
Monitoring row x 3 fleet hubs (Beszel, Dozzle, Backrest, Uptime Kuma)
AI Systems row x 3 GPU inference services (llama-swap, vLLM embed/rerank)
Apps list user-facing apps (Gitea, Vaultwarden, Seafile, ...)
Media list Plex, Jellyfin
Games list Pterodactyl
UltraSeedbox row x 3 external bookmarks
Infra - ANA list Anaheim hardware + hypervisors + BMCs
Infra - NH3 list NH3 hardware + hypervisors
Infra - ESH list ESH home-lab hardware + hypervisors
Service Networking collapsed toolchain (Traefik, CrowdSec, Dockge, AdGuard, MQTT)
```
- **Manual entries** (this file) cover things without a Docker label:
firewalls, switches, NAS web UIs, BMCs, hypervisors, and the cross-site
hubs where direct IP:port URLs are stable.
- **Docker-labeled stacks** auto-populate their group via the providers in
`docker.yaml`. To drop a new service into a group, add
`homepage.group=<group>` (plus `.name`, `.icon`, `.description`, `.href`)
labels to its compose file and redeploy.
## Placement rule (for new entries)
When deciding where a service lands, ask **function first**:
1. Does it watch or back up the fleet? -> `Monitoring`
2. Is it an inference / model service? -> `AI Systems`
3. Is it a user-facing app? -> `Apps`
4. Is it media / games? -> `Media` or `Games`
5. Is it a piece of hardware or a hypervisor? -> `Infra - <site>`
6. Is it toolchain / plumbing (no human interaction on the golden path)? ->
`Service Networking`
Site-specific sub-grouping is only used for `Infra -` because the device
inventory maps cleanly to physical sites. App groups are function-only.
## Deploying changes
These files are the **canonical source** for the homepage config. The
homepage compose file itself lives on `esh-docker-vm` (not yet tracked in
this repo as a stack), so the usual `scripts/deploy-stack.sh` flow doesn't
apply here yet.
Current workflow — push this directory onto the host:
```bash
rsync -av --delete \
--exclude='.env' --exclude='.env.*' \
configs/homepage/ esh-docker-vm:/opt/docker/conf/homepage/
```
The real `.env` lives on `esh-docker-vm` next to the compose file and must
not be overwritten (holds Plex/Jellyfin keys).
The homepage container reloads most files on-change; if a new group in
`settings.yaml` doesn't show up, `docker compose restart` on the host.
**Follow-up:** once the homepage compose file is pulled into
`stacks/homepage/compose.yaml`, move these files to `stacks/homepage/conf/`
and drop this ad-hoc rsync in favor of `scripts/deploy-stack.sh`.
## Secrets / env substitution
Any config can reference `{{HOMEPAGE_VAR_NAME}}` and homepage will
substitute from the container env at render time. Current uses:
- `HOMEPAGE_VAR_PLEX_KEY` (services.yaml -> Plex widget)
- `HOMEPAGE_VAR_JELLYFIN_KEY` (services.yaml -> Jellyfin widget)
Keep these out of the tracked YAML; only `.env.example` ships the names.