fegger 55e871bd4f Add backend data aggregator and API proxy services
- update-data.js: cron job that aggregates Google Calendar ICS feeds
  (today + upcoming, node-ical), Netbird reachability, Gitea/GitLab
  commit stats and Open WebUI models into data.json
- server.js: small Node proxy behind nginx exposing /api/chat
  (Open WebUI completions), /api/gpu-stats and /api/ollama
- gitlab-relay.js: prepared HTTP relay for GitLab over a Netbird VPN
  (not wired up yet; the setup key was rejected by vpn.ixsol.at)
- docker-entrypoint.sh: starts updater in the background, API proxy,
  cron (15 min refresh) and nginx without blocking startup
- nginx: proxy locations + no-cache for data.json
- compose: TZ, token env wiring from .env, gpu-stats service
  (python + rocm-smi with device passthrough)
- dockerignore: keep .env out of the build context
2026-09-04 14:07:01 +02:00
2026-09-04 14:06:42 +02:00
2026-09-04 14:06:49 +02:00

Homelab Dashboard

A small, self-contained single-page dashboard that links all your homelab services. Static site (HTML + CSS + JS), served by a lightweight nginx image. No backend, no database, no build step — just static files.

Services

Internal: Open WebUI, ComfyUI, Gitea, Jellyfin, Immich, Home Assistant, Audio Server / Dubplate, Nextcloud, Vaultwarden, Nginx Proxy Manager, Netbird.

External: gitlab-ixsol, gem360.

Features

  • Responsive grid of service cards with icons, categories and a live "Online" indicator
  • Open (new tab) + Copy URL per service
  • Live search / filter across names, categories and URLs
  • Live local clock
  • Dark, themeable design; respects prefers-reduced-motion

Run with Docker

docker compose up -d --build

Then open http://localhost:8888.

Without Docker (quick dev)

Any static file server works:

# from this directory
python3 -m http.server 8888
# or: npx serve . -l 8888

Edit services

All services live in one array at the top of script.js. Add / remove / reorder entries there:

{ section: "internal", name: "My Service", url: "http://10.0.0.5:9000", cat: "infra", icon: "⚙️" }

section is either "internal" or "external". cat is any key from the CATEGORIES map (or add your own).

Build the image manually

docker build -t homelab-dashboard .
docker run -d --name homelab-dashboard -p 8888:80 --restart unless-stopped homelab-dashboard

Notes

  • The "Online" badge is cosmetic (a static site can't probe your services from the browser due to CORS). If you want real health checks later, a tiny backend that pings each URL would be the next step.
  • Port 8888 is published by the Compose file; change it there if needed.
S
Description
No description provided
Readme 173 KiB
Languages
JavaScript 69%
CSS 20.4%
HTML 5%
Python 3.5%
Dockerfile 1.2%
Other 0.9%