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:

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

  1. Dienst mit networks: proxy (external) starten, ohne ports
  2. Im Caddyfile einen neuen Block ergänzen:
fotos.meinhomelab.duckdns.org {
    reverse_proxy immich-server:2283
}
  1. 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.

Wie geht es weiter?