Viele Dienste laufen auf demselben Server, jeder auf einem eigenen Port. Ein Reverse Proxy nimmt alle Anfragen an einer Stelle entgegen und leitet sie anhand des Namens an den richtigen Dienst weiter – z. B. vault.meinhomelab.duckdns.org an den Passwort-Manager. Caddy kümmert sich dabei ganz automatisch um gültige HTTPS-Zertifikate von Let's Encrypt.
Du brauchst:
- einen Server mit Docker und Docker Compose
- eine DuckDNS-Adresse (oder eigene Domain), die auf deine öffentliche IP zeigt
- eine echte öffentliche IPv4-Adresse (kein DS-Lite/CGNAT)
- ca. 30 Minuten
Vorab: Was willst du öffentlich machen?
Ein Dienst hinter dem Reverse Proxy ist aus dem ganzen Internet erreichbar. Das ist praktisch, aber jeder Dienst muss dann sicher und aktuell sein. Überlege für jede Anwendung:
- Nur für dich? Dann reicht oft der Zugriff über das VPN – ganz ohne öffentliche Freigabe.
- Soll auch ohne VPN funktionieren (z. B. Passwort-Manager auf allen Geräten, Fotos mit Familie teilen)? Dann ist der Reverse Proxy der richtige Weg.
Schritt 1: Portfreigaben durch beide Router
Let's Encrypt prüft über Port 80, dass dir die Domain gehört, HTTPS läuft über Port 443. Beide müssen bis zum Server durchgereicht werden:
In der Fritzbox (Internet-Router): Portfreigaben für TCP 80 und TCP 443 an den Flint 2 – genau wie im VPN-Guide beschrieben, nur mit TCP und diesen Ports.
In OpenWrt (Flint 2): Network → Firewall → Port Forwards → Add
| Feld | Regel 1 | Regel 2 |
|---|---|---|
| Name | HTTP |
HTTPS |
| Protocol | TCP | TCP |
| External port | 80 |
443 |
| Internal IP address | 192.168.50.30 |
192.168.50.30 |
| Internal port | 80 |
443 |
Save & Apply.
Schritt 2: Caddy einrichten
mkdir -p ~/apps/caddy && cd ~/apps/caddy
nano docker-compose.yml
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./data:/data
- ./config:/config
networks:
- proxy
networks:
proxy:
name: proxy
Das Netzwerk proxy verbindet Caddy später mit deinen anderen Diensten.
Schritt 3: Das Caddyfile
nano Caddyfile
Zum Testen leiten wir eine Adresse an einen kleinen Test-Container weiter:
test.meinhomelab.duckdns.org {
reverse_proxy whoami:80
}
Mehr braucht es nicht – Caddy holt das Zertifikat selbst.
Schritt 4: Test-Dienst ins Proxy-Netz hängen
mkdir -p ~/apps/whoami && cd ~/apps/whoami
nano docker-compose.yml
services:
whoami:
image: traefik/whoami
restart: unless-stopped
networks:
- proxy
networks:
proxy:
external: true
Beachte: keine ports-Angabe – der Dienst ist nur noch über Caddy erreichbar.
Schritt 5: Starten
cd ~/apps/caddy && docker compose up -d
cd ~/apps/whoami && docker compose up -d
docker compose -f ~/apps/caddy/docker-compose.yml logs -f
Im Log siehst du, wie Caddy das Zertifikat anfordert ("certificate obtained successfully"). Dann im Browser https://test.meinhomelab.duckdns.org öffnen – mit Schloss-Symbol.
Weitere Dienste hinzufügen
- Dienst mit
networks: proxy(external) starten, ohneports - Im Caddyfile einen neuen Block ergänzen:
fotos.meinhomelab.duckdns.org {
reverse_proxy immich-server:2283
}
- Caddy neu laden, ohne Unterbrechung:
cd ~/apps/caddy && docker compose exec caddy caddy reload --config /etc/caddy/Caddyfile
Wenn es nicht klappt
- Kein Zertifikat, Fehler "timeout" im Log: Port 80 kommt nicht an – beide Portfreigaben prüfen, zeigt DuckDNS auf die richtige IP?
- "502 Bad Gateway": Caddy erreicht den Dienst nicht. Ist er im Netzwerk
proxy? Stimmen Containername und Port im Caddyfile? - Zu Hause geht die Adresse nicht, unterwegs schon: Manche Router können "sich selbst von innen" nicht erreichen (NAT-Loopback). In der Fritzbox klappt es meist; alternativ in Pi-hole unter Local DNS Records die Domain direkt auf die Server-IP zeigen lassen.