Homelab-External (Hetzner vServer)¶
Selbst-gehostete Infrastruktur auf einem Hetzner vServer (CX23, ~5 EUR/Monat).
Betreibt VPN-Koordination, Monitoring, Push-Notifications und Cron-Ueberwachung —
vollstaendig provisioniert per Shell-Script (bootstrap.sh).
- Server: Hetzner CX23 (Falkenstein), Ubuntu 24.04, 2 vCPU, 4 GB RAM, 40 GB SSD
- Domain:
*.homelab-external.robinwerner.net - Reverse Proxy: Traefik v3 (Let's Encrypt HTTP-Challenge)
- Repo: homelab-external
- Provisionierung:
./bootstrap.sh(lokal ausfuehren, ~3-5 Min)
Services¶
| Service | Version | URL | Beschreibung |
|---|---|---|---|
| Headscale | v0.28.0 | headscale.homelab-external.robinwerner.net |
Selbst-gehosteter Tailscale Coordination Server (VPN) |
| Headplane | 0.6.2 | headscale.homelab-external.robinwerner.net/admin |
Web-UI fuer die Headscale-Verwaltung |
| Authelia | 4.39 | auth.homelab-external.robinwerner.net |
Identity Provider, Forward-Auth mit 2FA |
| lldap | 2026-05 | ldap.homelab-external.robinwerner.net |
Benutzer- und Gruppenverzeichnis |
| Uptime Kuma | 2.1.3 | uptime.homelab-external.robinwerner.net |
HTTP/TCP/Ping-Monitoring fuer interne und externe Dienste |
| ntfy | v2.17.0 | ntfy.homelab-external.robinwerner.net |
Push-Notification-Server fuer alle Homelab-Alerts |
| Healthchecks | v4.0 | hc.homelab-external.robinwerner.net |
Cron-Job-Monitoring via Ping-URLs |
| Traefik | v3.6.9 | traefik.homelab-external.robinwerner.net |
Reverse Proxy, SSL-Termination, Security Headers |
Dazu drei PostgreSQL-Instanzen: je eine fuer Headscale und Healthchecks sowie
identity-postgres, das sich Authelia und lldap teilen.
Identity ist erst teilweise ausgerollt
Authelia und lldap laufen bereits. Die Forward-Auth-Middleware haengt aber
noch nicht an den Routern von Uptime Kuma, Healthchecks und Headplane —
diese Dienste sind derzeit nur durch ihren eigenen Login geschuetzt. Der
Stand liegt im Branch feat/forward-auth-hetzner-tools.
Siehe Authelia und RFC-003.
Architektur¶
Internet
│
▼ :80/:443
Traefik ──── proxy-Netzwerk ──────────────────────────────────────┐
│ │
├─► headscale.* ──► Headscale (8080) │
│ └─ /admin ──► Headplane (3000) [authelia@file] │
├─► auth.* ──► Authelia (9091) │
├─► ldap.* ──► lldap (17170) [authelia@file] │
├─► uptime.* ──► Uptime Kuma (3001) [authelia@file] │
├─► ntfy.* ──► ntfy (80) │
└─► hc.* ──► Healthchecks (8000)[authelia@file] │
│
internal-Netzwerk │
├─ headscale-postgres (5432) │
├─ healthchecks-postgres (5432) │
├─ identity-postgres (5432) ◄─ Authelia + lldap│
├─ Headscale ◄────────────────────────────────┘
├─ Headplane
├─ Authelia ──LDAP:3890──► lldap
└─ Healthchecks
Tailscale (host network) ◄──VPN──► Homelab NUC (10.10.10.0/24)
- Traefik ist der einzige Einstiegspunkt fuer HTTP/HTTPS (Ports 80, 443)
- proxy-Netzwerk: Services mit Traefik-Routing
- internal-Netzwerk: Datenbanken und Services, die DB-Zugriff benoetigen (kein Traefik)
- Tailscale laeuft mit
network_mode: hostund verbindet den Hetzner-Server per VPN ins lokale Heimnetz — dadurch koennen Uptime Kuma und Healthchecks interne Dienste erreichen
Netzwerke¶
| Netzwerk | Typ | Teilnehmer |
|---|---|---|
proxy |
bridge | traefik, headscale, headplane, uptime-kuma, ntfy, healthchecks, authelia, lldap |
internal |
bridge | headscale-postgres, healthchecks-postgres, identity-postgres, headscale, headplane, healthchecks, authelia, lldap |
| host | host | tailscale |
Datenpfade¶
| Kategorie | Pfad | Beschreibung |
|---|---|---|
| Git-Config (read-only) | /opt/homelab-repo/hetzner/ |
traefik/, headscale/, headplane/ |
| Persistente Daten | /opt/homelab-data/<service>/ |
Datenbanken, Uploads, Cache |
| Secrets | /opt/homelab-data/secrets/cookie_secret |
Session-Secret fuer Headplane (generiert via Cloud-Init) |
| SSL-Zertifikate | /opt/homelab-data/traefik/certs/acme.json |
Let's Encrypt ACME-Daten |
Schnelleinstieg¶
# Voraussetzungen: hcloud CLI, curl, jq, openssl
export HCLOUD_TOKEN="..."
export CLOUDFLARE_API_TOKEN="..."
export CLOUDFLARE_ZONE_ID="..."
./bootstrap.sh # Erstellt Server, DNS, startet alle Services (~3-5 Min)
./teardown.sh # Loescht alles (Bestaetigung mit "yes" noetig)
Manuelle Ops auf dem Server¶
cd /opt/homelab-repo/hetzner
# Status aller Services
docker compose ps
# Logs eines Services
docker compose logs -f headscale
# Update nach git pull
docker compose pull && docker compose up -d
# Einzelnen Service neu starten
docker compose restart ntfy
Sicherheitskonzept¶
Alle Container laufen mit no-new-privileges: true und cap_drop: ALL.
Zusaetzliche Capabilities werden nur wo zwingend noetig hinzugefuegt
(PostgreSQL, Headscale, Uptime Kuma: Dateisystem-Permissions; Tailscale: Netzwerk).
Traefik erzwingt TLS 1.2+ mit sicheren Cipher Suites, HSTS (1 Jahr, includeSubdomains, preload), X-Frame-Options, Content-Type-Sniffing-Schutz sowie Rate Limiting (50 req/s avg, Burst 100).
Kosten¶
| Posten | Monat |
|---|---|
| Hetzner CX23 (Falkenstein) | ~5 EUR |
| Cloudflare DNS | kostenlos |
| Let's Encrypt SSL | kostenlos |