Caddy als Reverse Proxy mit automatischem HTTPS

Einen Dienst sicher per HTTPS unter einer eigenen Domain erreichbar machen – normalerweise ein Gefummel mit Zertifikaten. Nicht mit Caddy. Der moderne Webserver holt und erneuert TLS-Zertifikate vollautomatisch. In dieser Anleitung richtest du Caddy als Reverse Proxy mit automatischem HTTPS ein.

Caddy als Reverse Proxy nimmt dir die lästigste Aufgabe beim Betrieb eigener Webdienste ab: das Verwalten von TLS-Zertifikaten. Der Webserver fordert Let’s-Encrypt-Zertifikate automatisch an, erneuert sie rechtzeitig und leitet Anfragen sauber an deine Backend-Dienste weiter. In diesem Artikel vergleichen wir Caddy mit Nginx und Traefik, schauen uns nützliche Direktiven an und gehen der Zertifikats-Fehlersuche auf den Grund.

Was macht Caddy besonders?

Caddy besorgt sich für jede konfigurierte Domain automatisch ein kostenloses Let’s-Encrypt-Zertifikat und erneuert es rechtzeitig – ganz ohne Zusatzarbeit. Als Reverse Proxy leitet er Anfragen von außen an deine internen Dienste weiter, ähnlich wie der Nginx Proxy Manager, aber besonders schlank per Textdatei konfiguriert.


Schritt 1: Caddy installieren

Installiere Caddy aus dem offiziellen Repository:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf "https://dl.cloudsmith.io/public/caddy/stable/gpg.key" | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf "https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt" | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy

Schritt 2: Den Caddyfile anlegen

Die gesamte Konfiguration steht in /etc/caddy/Caddyfile. Für einen Reverse Proxy genügen zwei Zeilen – Caddy kümmert sich um das HTTPS von selbst:

meine-domain.de {
    reverse_proxy localhost:8080
}

Damit leitet Caddy alle Anfragen an meine-domain.de an den lokal auf Port 8080 laufenden Dienst weiter – automatisch über HTTPS.


Schritt 3: Konfiguration laden

Nach jeder Änderung lädst du die Konfiguration neu – ohne Ausfallzeit:

sudo systemctl reload caddy

Wichtig: Die Domain muss per DNS auf deinen Server zeigen und die Ports 80 und 443 müssen in der Firewall offen sein, damit Let’s Encrypt das Zertifikat ausstellen kann.


Mehrere Dienste hinter einer Caddy-Instanz

Du kannst beliebig viele Domains untereinander definieren – jede mit eigenem Ziel:

app.meine-domain.de {
    reverse_proxy localhost:3000
}

cloud.meine-domain.de {
    reverse_proxy localhost:8080
}

Das eignet sich perfekt, um mehrere Docker-Dienste unter verschiedenen Subdomains zu veröffentlichen.


Caddy im Vergleich zu Nginx und Traefik

Caddy ist nicht der einzige Reverse Proxy, aber einer der einfachsten. Der große Vorteil gegenüber Nginx ist das automatische HTTPS ohne zusätzliche Tools wie Certbot. Traefik wiederum glänzt in dynamischen Docker-Umgebungen, ist aber komplexer zu konfigurieren. Für einen überschaubaren Selfhosting-Server mit wenigen Diensten ist Caddy meist der schnellste Weg zum Ziel.

MerkmalCaddyNginxTraefik
Auto-HTTPSJa, integriertNur mit CertbotJa
KonfigurationSehr einfachUmfangreichMittel
Docker-IntegrationGutManuellSehr gut
RessourcenGeringSehr geringMittel

Wenn du bereits auf den Nginx Proxy Manager setzt, gibt es keinen zwingenden Grund zu wechseln – für neue, textbasiert verwaltete Setups ist Caddy aber oft angenehmer.


Nützliche Direktiven im Caddyfile

Der Caddyfile ist bewusst minimalistisch, bietet aber alles, was ein Reverse Proxy braucht. Neben dem einfachen reverse_proxy kannst du Antworten komprimieren, Sicherheits-Header setzen, einzelne Pfade schützen oder Zugriffe protokollieren. Diese Direktiven fügst du einfach innerhalb des Domain-Blocks hinzu.

  • encode gzip zstd – Antworten automatisch komprimieren
  • basicauth – einzelne Bereiche mit Passwort schützen
  • header – Sicherheits-Header wie HSTS setzen
  • log – Zugriffe in eine Datei schreiben
  • handle_path – Anfragen nach Pfad-Präfix aufteilen

Damit dein Server von außen erreichbar ist, müssen die Ports 80 und 443 offen sein. Prüfe deine UFW-Firewall entsprechend.

Besonders praktisch wird Caddy, wenn du mehrere Container hinter einer Instanz betreibst. Jeder Dienst bekommt seinen eigenen Domain-Block, und Caddy kümmert sich um das passende Zertifikat pro Subdomain. Läuft dein Backend in einem Docker-Container, verweist die reverse_proxy-Zeile einfach auf den Container-Namen und den internen Port – vorausgesetzt, Caddy und der Dienst teilen sich ein Docker-Netzwerk. So ersetzt eine einzige, gut lesbare Konfigurationsdatei ein ganzes Geflecht aus Zertifikaten und Weiterleitungsregeln.


Fehlersuche: Wenn das Zertifikat nicht kommt

Bleibt das HTTPS-Zertifikat aus, liegt es fast immer an einer von drei Ursachen: Die Domain zeigt per DNS nicht auf deinen Server, Port 80 ist blockiert (Let’s Encrypt braucht ihn für die HTTP-Challenge), oder der Dienst läuft hinter einem weiteren NAT ohne Portweiterleitung. Kontrolliere deine Konfiguration zunächst mit caddy validate --config /etc/caddy/Caddyfile und wirf einen Blick in die Logs über journalctl -u caddy -f.

Ein häufiger Anfängerfehler ist außerdem das Rate-Limit von Let’s Encrypt: Wer beim Ausprobieren zu oft ein echtes Zertifikat anfordert, wird zeitweise ausgesperrt. Nutze für Tests deshalb den Staging-Endpunkt, indem du in der globalen Options-Sektion des Caddyfile acme_ca https://acme-staging-v02.api.letsencrypt.org/directory setzt. Erst wenn alles fehlerfrei läuft, entfernst du die Zeile wieder und Caddy holt das gültige Produktiv-Zertifikat.

Häufige Fragen

Brauche ich für Caddy zwingend Port 80?

Für die Standard-Zertifikatsausstellung ja, denn Let’s Encrypt nutzt die HTTP-Challenge über Port 80. Alternativ kannst du die DNS-Challenge einrichten, die ohne offenen Port 80 auskommt und auch Wildcard-Zertifikate ermöglicht – dafür braucht Caddy aber API-Zugriff auf deinen DNS-Anbieter.

Kann Caddy Wildcard-Zertifikate ausstellen?

Ja, aber nur über die DNS-Challenge. Dazu benötigst du das passende DNS-Plugin für deinen Anbieter und hinterlegst einen API-Token im Caddyfile. Danach kann Caddy Zertifikate für *.deine-domain.de automatisch anfordern und erneuern.

Wie lade ich Caddy ohne Downtime neu?

Mit caddy reload --config /etc/caddy/Caddyfile übernimmt Caddy die neue Konfiguration im laufenden Betrieb, ohne bestehende Verbindungen zu unterbrechen. Ein vollständiger Neustart des Dienstes ist dafür nicht nötig.


Fazit

Caddy nimmt dir den lästigsten Teil des Hostings ab: Zertifikate. Zwei Zeilen im Caddyfile genügen, und dein Dienst ist per HTTPS erreichbar – automatisch verlängert. Für schlanke Setups ist Caddy damit eine der elegantesten Reverse-Proxy-Lösungen. Ein VPN wie WireGuard ist die Alternative, wenn ein Dienst gar nicht öffentlich sein soll.

Siehe auch  Proxmox RAW Disk verkleinern - qemu-img resize
Nach oben scrollen