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) |
| 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 |
Architektur
Internet
│
▼ :80/:443
Traefik ──── proxy-Netzwerk ──────────────────────────────────────┐
│ │
├─► headscale.* ──► Headscale (8080) + Headplane (3000) │
├─► uptime.* ──► Uptime Kuma (3001) │
├─► ntfy.* ──► ntfy (80) │
└─► hc.* ──► Healthchecks (8000) │
│
internal-Netzwerk │
├─ headscale-postgres (5432) │
├─ healthchecks-postgres (5432) │
├─ Headscale ◄────────────────────────────────┘
├─ Headplane
└─ 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: host und 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 |
internal |
bridge |
headscale-postgres, healthchecks-postgres, headscale, headplane, healthchecks |
| 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 |