↓ Zum Hauptinhalt springen
  1. Anleitungen/

Traefik installieren: Reverse Proxy mit Docker und automatischem SSL

Patrick Adams
Autor
Patrick Adams
Linux-Administrator und IT-Specialist. Ich schreibe über Server, Self-Hosting und Open-Source-Software, praxisnah und selbst getestet. Mehr über mich →
Inhaltsverzeichnis
Traefik ist ein Reverse Proxy, der perfekt zu Docker passt. Du konfigurierst ihn nicht in einer Weboberfläche, sondern direkt in der compose-Datei deiner Dienste. Neue Container bekommen dann automatisch ihre Domain und ein SSL-Zertifikat, sobald sie starten.
Voraussetzungen: Debian mit Root-Zugriff, eine Domain und die Ports 80 und 443, die von außen erreichbar und noch frei sind. Auf einem Server mit CloudPanel oder dem Nginx Proxy Manager sind die Ports schon belegt, dort brauchst du Traefik nicht zusätzlich.

Docker installieren
#

System aktualisieren
#

apt update && apt upgrade -y && apt install ca-certificates curl -y

Docker-Paketquelle einrichten
#

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list

Docker und Docker Compose installieren
#

apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

So funktioniert Traefik
#

Traefik beobachtet Docker und liest die Labels deiner Container aus. Steht dort zum Beispiel, dass ein Container unter app.deine-domain.de erreichbar sein soll, richtet Traefik die Weiterleitung ein und holt das passende Zertifikat bei Let’s Encrypt. Alle Dienste, die Traefik erreichen soll, hängen dafür in einem gemeinsamen Docker-Netzwerk namens proxy.

Traefik einrichten
#

Netzwerk und Ordner anlegen
#

docker network create proxy
mkdir -p /opt/stacks/traefik/letsencrypt
touch /opt/stacks/traefik/letsencrypt/acme.json
chmod 600 /opt/stacks/traefik/letsencrypt/acme.json

In der Datei acme.json speichert Traefik deine Zertifikate. Mit den Rechten 600 darf nur root sie lesen, sonst verweigert Traefik den Start.

Passwort für das Dashboard erzeugen
#

Das Dashboard von Traefik schützt du mit Benutzername und Passwort:

apt install apache2-utils -y
htpasswd -nbB admin 'dein-sicheres-passwort' | sed -e 's/\$/\$\$/g'

Die Ausgabe sieht ungefähr so aus: admin:$$2y$$05$$.... Kopier sie, du brauchst sie gleich. Die doppelten Dollarzeichen sind Absicht, damit Docker Compose sie nicht als Variable versteht.

docker-compose.yml erstellen
#

cd /opt/stacks/traefik && nano docker-compose.yml

Füge diesen Inhalt ein. Ersetze dabei deine E-Mail-Adresse, die Domain für das Dashboard und bei basicauth.users die Ausgabe aus dem vorherigen Schritt:

services:
  traefik:
    image: traefik:v3
    container_name: traefik
    restart: unless-stopped
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.docker.network=proxy
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.email=du@deine-domain.de
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
      - --api.dashboard=true
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.dashboard.rule=Host(`traefik.deine-domain.de`)
      - traefik.http.routers.dashboard.entrypoints=websecure
      - traefik.http.routers.dashboard.tls.certresolver=letsencrypt
      - traefik.http.routers.dashboard.service=api@internal
      - traefik.http.routers.dashboard.middlewares=dashboard-auth
      - traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$2y$$05$$HIER-DEIN-HASH

networks:
  proxy:
    external: true

Was die wichtigsten Zeilen bedeuten:

  • exposedbydefault=false: Traefik veröffentlicht nur Container, bei denen du es ausdrücklich mit traefik.enable=true erlaubst.
  • redirections: Alles, was über HTTP kommt, wird automatisch auf HTTPS umgeleitet.
  • httpchallenge: Let’s Encrypt prüft über Port 80, dass dir die Domain gehört, und stellt dann das Zertifikat aus.

DNS-Einträge anlegen
#

Leg bei deinem Domain-Anbieter für traefik.deine-domain.de und jeden weiteren Dienst einen A-Eintrag an, der auf die IP-Adresse deines Servers zeigt. Ohne diese Einträge kann Let’s Encrypt keine Zertifikate ausstellen.

Traefik starten
#

docker compose up -d

Ruf danach https://traefik.deine-domain.de auf und melde dich mit deinem Benutzer und Passwort an. Im Dashboard siehst du alle Router, Dienste und Middlewares.

Einen Dienst hinter Traefik stellen
#

Zum Testen eignet sich der kleine Dienst whoami, der einfach Infos über die Anfrage anzeigt. Leg dafür einen eigenen Stack an:

services:
  whoami:
    image: traefik/whoami
    container_name: whoami
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.rule=Host(`whoami.deine-domain.de`)
      - traefik.http.routers.whoami.entrypoints=websecure
      - traefik.http.routers.whoami.tls.certresolver=letsencrypt
      - traefik.http.services.whoami.loadbalancer.server.port=80

networks:
  proxy:
    external: true

Nach dem Start ist der Dienst unter https://whoami.deine-domain.de erreichbar, mit gültigem Zertifikat. Genauso gehst du bei jedem anderen Dienst vor: Container ins Netzwerk proxy hängen, die vier Labels mit Router-Namen, Domain und Port anpassen, fertig.

Beim Router-Namen, hier whoami, muss jeder Dienst einen eigenen eindeutigen Namen bekommen. Haben zwei Container denselben Namen, überschreiben sie sich gegenseitig.

Fehlersuche
#

Bekommt ein Dienst kein Zertifikat oder ist nicht erreichbar, schau in die Logs von Traefik:

docker logs traefik --tail 50

Die häufigsten Ursachen sind ein fehlender DNS-Eintrag, ein geschlossener Port 80 in der Firewall oder ein Container, der nicht im Netzwerk proxy hängt.

Traefik aktualisieren
#

cd /opt/stacks/traefik && docker compose pull && docker compose up -d

Verwandte Artikel