- Traefik oder nginx: Was ist der Unterschied?
- Überblick
- Traefik v3 installieren
- middlewares.yml anlegen
- traefik.yml anlegen
- docker-compose.yml anlegen
- Docker Netzwerk erstellen
- Konfiguration anpassen
- DNS-Einstellungen anpassen
- Auf DNS-Bestätigung warten
- Traefik starten
- Traefik Dashboard aufrufen
- Sicherheit der Webseite testen
- Weiteren Dienst hinzufügen
- Traefik aktualisieren
- Häufige Fehler und Lösungen
- Der passende VPS für dein Traefik-Setup
Traefik oder nginx: Was ist der Unterschied?
Auch nginx lässt sich als Reverse Proxy einsetzen und ist dafür weit verbreitet. Der wichtigste Unterschied liegt im Alltag: Bei nginx legt ihr für jeden neuen Dienst selbst eine Konfiguration an und kümmert euch separat um die SSL-Zertifikate. Traefik erkennt neue Docker-Container dagegen automatisch über einige Zeilen in deren docker-compose.yml und holt sich die passenden Let's-Encrypt-Zertifikate selbst.
Wer mehrere Dienste per Docker auf einem Server betreibt, spart mit Traefik also viel Handarbeit. nginx spielt seine Stärken eher aus, wenn ihr ohne Docker arbeitet oder den Server auch als klassischen Webserver nutzen wollt. Mehr zu den Grundlagen findet ihr in unserem Glossar unter Traefik Reverse-Proxy.
Überblick
- Stand der Anleitung 09/2026
- Verwendetes System: Debian 13 64 Bit
- Voraussetzung: Docker inklusive Docker-Compose-Plugin muss installiert sein. Falls noch nicht geschehen, erst die verlinkte Anleitung durchführen.
- Genutzter User: Ich nehme alles als „root“ vor
- Zeitdauer: ca. 5 Minuten. Kann durch die DNS Einstellungen aber länger dauern, bis diese wirken
- Schwierigkeit: Einfach, Grundkenntnisse in der Linux-Konsole hilfreich
- Besonderheiten: Die Ports 80 und 443 müssen frei sein. Es dürfen also keine anderen Dienste laufen.
Traefik v3 installieren
Vorbereitung
Diese Anleitung basiert auf dem aktuellen Debian 13 Betriebssystem. Traefik werden wir unter Docker installieren. Dies ermöglicht uns später sehr schnelle Updates sowie eine einfache Integration neuer Dienste.
Die nachfolgenden Befehle führe ich alle als Benutzer „root“ aus. Zu diesem Benutzer wechselt ihr mittels folgenden Befehls:
sudo -i
htpasswd installieren
Dieses Programm benötigen wir um uns ein sicheres Kennwort für unseren Traefik Login zu generieren. Zur Installation gebt ihr Folgendes ein:
apt install -y apache2-utils
nano Texteditor installieren
Nano ist ein sehr einfach zu bedienender Texteditor. Da wir später viele Dateien erstellen werden, installieren wir diesen nun schnell:
apt install -y nano
Benötigte Dateien / Verzeichnisse anlegen
Nun erstellen wir das Verzeichnis, in welches später Traefik installiert werden soll. Dazu gebt ihr folgenden Befehl ein. Das Verzeichnis könnt ihr natürlich verändern. Wir verwenden dieses Verzeichnis in der gesamten Anleitung. Ihr könnt ein anderes Verzeichnis wählen, müsst dementsprechend aber an einigen Stellen dann die Befehle abändern.
mkdir -p /opt/containers/traefik/{acme,dynamic}
chmod 700 /opt/containers/traefik/acme
Infos zu yml Dateien
Bei yml Dateien ist es sehr wichtig, dass die Zeilen alle richtig eingerückt sind. Die Zeilen MÜSSEN immer mit der Leertaste eingerückt werden. Es dürfen KEINE Tabs enthalten sein. Ihr könnt den nachfolgenden Code immer online „überprüfen“ lassen. Die meisten Fehler entstehen nämlich durch die falsche Formatierung.
dig installieren
Dig ist ein Programm, welches uns später ermöglicht zu kontrollieren, ob eine korrekte Zuordnung zwischen unserer Domain und der IP Adresse des Servers, erfolgt ist.
apt install -y dnsutils
Ports 80 und 443 prüfen
Traefik muss aus dem Internet über die Ports 80 (HTTP) und 443 (HTTPS) erreichbar sein, sonst kann Let's Encrypt kein Zertifikat ausstellen. Prüft zuerst, ob die Ports noch von einem anderen Dienst belegt sind, etwa von einem vorinstallierten Apache oder nginx:
ss -tlnp | grep -E ':80 |:443 '
Gibt der Befehl nichts aus, sind die Ports frei. Läuft dort bereits ein Webserver, beendet und deaktiviert ihn, zum Beispiel:
systemctl disable --now apache2
Nutzt ihr zusätzlich eine Firewall, müssen beide Ports dort freigegeben sein. Bei UFW geht das so:
ufw allow 80/tcp
ufw allow 443/tcp
Gut zu wissen: Docker umgeht UFW bei veröffentlichten Container-Ports. Die Regeln sind für Traefik also meist nicht zwingend, dokumentieren aber sauber, welche Ports auf eurem Server offen sein sollen.
middlewares.yml anlegen
In dieser Datei wird festgelegt, welche Parameter für die „sichere Verbindung“ mittels HTTPS genutzt werden sollen. Wir wollen eine sehr gute Bewertung (A+) bei SSL Labs. SSL Labs ist eine Webseite um seine eigene Webseite auf Sicherheit zu testen.
Gebt nun folgenden Code in eure Konsole ein:
nano /opt/containers/traefik/dynamic/middlewares.yml
In die Datei kopiert ihr nun folgendes:
http:
middlewares:
# Basic Auth für das Traefik-Dashboard
dashboard-auth:
basicAuth:
users:
- "PLATZHALTER"
# Empfohlene Sicherheits-Header
security-headers:
headers:
frameDeny: true
contentTypeNosniff: true
browserXssFilter: true
referrerPolicy: "strict-origin-when-cross-origin"
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
tls:
options:
default:
minVersion: VersionTLS12
sniStrict: true
traefik.yml anlegen
In diesem Schritt erstellen wir uns eine Konfigurationsdatei.
nano /opt/containers/traefik/traefik.yml
In diese Datei kopiert ihr nun folgendes:
################################################################
# Globale Einstellungen
################################################################
global:
checkNewVersion: true
sendAnonymousUsage: false
################################################################
# EntryPoints (offizielle Namen: web = HTTP, websecure = HTTPS)
################################################################
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
################################################################
# API und Dashboard
################################################################
api:
dashboard: true
insecure: false
################################################################
# Provider
################################################################
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: proxy
file:
directory: /etc/traefik/dynamic
watch: true
################################################################
# Zertifikate (ACME / Let's Encrypt)
################################################################
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /etc/traefik/acme/acme.json
caServer: https://acme-v02.api.letsencrypt.org/directory
tlsChallenge: {}
################################################################
# Logging
################################################################
log:
level: INFO
format: common
accessLog:
format: common
docker-compose.yml anlegen
Nun können wir mit der eigentlichen „Installation“ von Traefik beginnen. Dazu öffnet ihr folgende Datei:
nano /opt/containers/traefik/docker-compose.yml
Nun kopiert ihr folgenden Code in die Datei. Dieser Code ist sozusagen unser Bauplan für unseren Traefik Container.
services:
traefik:
image: traefik:v3.7
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
environment:
- TZ=Europe/Berlin
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./dynamic:/etc/traefik/dynamic:ro
- ./acme:/etc/traefik/acme
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.entrypoints=websecure"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=security-headers@file,dashboard-auth@file"
networks:
proxy:
external: true
Docker Netzwerk erstellen
Zum Schluss müssen wir nur noch ein Docker Netzwerk anlegen. Dies dient später zur Kommunikation der einzelnen Container mit Traefik. Wir nennen das Netzwerk hier „proxy“. Ihr könnt aber auch jeden anderen Namen verwenden, müsst dann aber einige Schritte entsprechend anpassen. Dazu gebt ihr folgenden Code ein:
docker network create proxy
Konfiguration anpassen
Ihr habt vorhin verschiedene Konfigurationsdateien erstellt, welche ihr nun noch anpassen müsst. Dies ist unter anderem die E-Mail Adresse sowie eure Domain. Damit ihr dies nicht alles von Hand machen müsst, könnt ihr einfach folgendes Skript ausführen:
nano /opt/containers/traefik/setup.sh
Inhalt:
#!/bin/bash
#
read -rp "Domain fürs Dashboard (z. B. traefik.meinedomain.de): " DOMAIN
read -rp "E-Mail für Let's Encrypt: " EMAIL
read -rp "Benutzername fürs Dashboard: " TUSER
read -rsp "Passwort: " TPASS
echo
sed -i "s|admin@example\.com|${EMAIL}|g" traefik.yml
sed -i "s|traefik\.example\.com|${DOMAIN}|g" docker-compose.yml
HASH="$(htpasswd -nbB -C 12 "$TUSER" "$TPASS")"
sed -i "s|PLATZHALTER|${HASH}|" dynamic/middlewares.yml
unset TPASS HASH
echo
echo "Fertig."
echo "Dashboard: https://${DOMAIN}"
echo "Login: ${TUSER}"
Dieses Skript macht ihr nun ausführbar und startet es:
cd /opt/containers/traefik/
chmod +x setup.sh
./setup.sh
Wichtige Info:
Das Skript zeigt die Eingabe des Passwortes nicht an. Dies ist aus Sicherheitsgründen „nicht sichtbar“.
Warum steht das Passwort in der middlewares.yml?
In vielen Anleitungen wird der Dashboard-Login direkt als Label in der docker-compose.yml hinterlegt. Das führt oft zu Fehlern: Der verschlüsselte Passwort-Hash enthält mehrere $-Zeichen, und Docker Compose interpretiert diese als Variablen. Der Hash kommt dann unvollständig bei Traefik an, und der Login schlägt fehl, obwohl das Passwort stimmt.
Unser Setup umgeht das Problem, weil der Hash in der middlewares.yml steht, die Traefik direkt einliest. Wollt ihr die Zugangsdaten später doch einmal als Label hinterlegen, müsst ihr jedes $ verdoppeln. Das erledigt dieser Befehl automatisch:
htpasswd -nbB -C 12 BENUTZERNAME PASSWORT | sed -e 's/\$/\$\$/g'
DNS-Einstellungen anpassen
Damit wir später einfach bei Traefik Subdomains anlegen (z.B. mail.euredomain.de, cloud.euredomain.de) können, müssen wir noch die DNS-Einstellungen anpassen.
Dazu wechselt Ihr zum Kundenbereich.
Hier loggt ihr euch mit euren Zugangsdaten ein und geht dann auf den Bereich „Meine Produkte".
Scrollt nun ganz nach unten bis ihr „Domains“ seht:
Bei der gewünschten Domain klickt ihr nun auf die „3 Punkte“ und wählt „Produkt öffnen“ aus:
Nun wählt ihr den Bereich „DNS“ aus:
Nun seht ihr eine Übersicht eurer DNS-Einträge für diese Domain. Wir benötigen den „*“ Eintrag sowie den „leeren Eintrag“ darüber:
Sollten diese Einträge bereits vorhanden sein, dann könnt ihr mit dem nächsten Kapitel starten. Ansonsten klickt ihr nun auf „Record hinzufügen“:
Fügt nun die beiden Einträge hinzu:
Anschließend klickt ihr noch auf „Hinzufügen“. Dies wiederholt ihr für den „leeren Eintrag“:
Es kann mehrere Stunden dauern, bis diese Einstellungen weltweit übertragen wurden und funktionieren.
Auf DNS-Bestätigung warten
Da wir eine korrekte Zuordnung zwischen IP-Adresse und unserer Domain benötigen, warten wir darauf. Dies können wir mittels folgenden Tools kontrollieren:
dig +short traefik.euredomain.de
Wenn alles korrekt ist, erscheint hier die IP-Adresse eures Servers. Sollte hier NICHT eure IP-Adresse angezeigt werden, so müsst ihr noch warten. Wiederholt diesen Vorgang so lange, bis die IP-Adresse korrekt ist.
Traefik starten
Gebt nun folgendes ein, um euren Traefik Container zu starten:
docker compose -f /opt/containers/traefik/docker-compose.yml up -d
Wartet nun einen kurzen Moment. Anschließend schaut ihr kurz in die Logs. Im Idealfall sollte dort kein Fehler zu sehen sein:
cd /opt/containers/traefik
docker compose logs
So sieht es bei mir aus:
Traefik Dashboard aufrufen
Traefik bringt ein eigenes Dashboard mit, über das ihr jederzeit seht, was auf eurem Server läuft. Ruft dazu im Browser die Adresse auf, die ihr im Setup-Skript angegeben habt (z. B. traefik.euredomain.de). Nach einigen Sekunden erscheint das Login-Fenster:
Geht nun mit eurem Webbrowser auf eure Webseite (z.B. traefik.euredomain.de). Dort sollte nach einigen Sekunden Folgendes zu sehen sein:
Meldet euch mit den eben erstellten Zugangsdaten an. Danach sollte es in etwa so aussehen:
Das Dashboard zeigt euch auf einen Blick:
- Entrypoints: die Ports, auf denen Traefik Anfragen annimmt, in unserem Fall 80 (HTTP) und 443 (HTTPS).
- Routers: welche Domains Traefik kennt und an welchen Dienst sie weitergeleitet werden.
- Services: die Container, die hinter Traefik laufen.
- Middlewares: zusätzliche Regeln wie der Passwortschutz oder die Sicherheits-Header.
Grüne Symbole bedeuten, dass alles funktioniert. Gelbe oder rote Symbole weisen auf Warnungen oder Fehler hin. Ein Klick darauf zeigt die Details.
Das Dashboard ist rein zur Ansicht gedacht, Einstellungen ändert ihr weiterhin über die Konfigurationsdateien. Da es Einblick in eure gesamte Server-Struktur gibt, solltet ihr den Passwortschutz nie entfernen.
Sicherheit der Webseite testen
Nun gehen wir auf folgende Webseite und schauen, ob wir die gewünschte A+ Bewertung bekommen: https://www.ssllabs.com/ssltest/
Hier gebt ihr jetzt eure Webseite ein (z.B. traefik.euredomain.de). Nun sollte es so bei euch aussehen:
Weiteren Dienst hinzufügen
Ihr habt jetzt einen kompletten Reverseproxy installiert. Damit könnt ihr sehr einfach weitere Dienste auf eurem Server bereitstellen. Dies wollen wir beispielhaft nun durchführen. Dazu legt ihr euch ein neues Verzeichnis an:
mkdir /opt/containers/test
Darin erstellt ihr nun eine Docker Compose Datei:
nano /opt/containers/test/docker-compose.yml
Inhalt:
services:
whoami:
image: traefik/whoami
container_name: whoami
restart: unless-stopped
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`test.euredomain.de`)"
- "traefik.http.routers.whoami.entrypoints=websecure"
- "traefik.http.routers.whoami.middlewares=security-headers@file"
networks:
proxy:
external: true
Hier müsst ihr nun noch eure Domain korrekt eintragen: test.euredomain.de
Anschließend können wir den neuen Dienst starten:
cd /opt/containers/test/
docker compose up -d
Der Dienst ist jetzt über eure Domain erreichbar und auch in Traefik sollte er angezeigt werden:
Nach diesem Prinzip könnt ihr beliebig viele Dienste hinter Traefik betreiben. Für jeden Dienst braucht ihr nur einen DNS-Eintrag bzw. die Wildcard-Subdomain, das Netzwerk „proxy“ und die passenden Labels. Ideen findet ihr in unseren weiteren Anleitungen, zum Beispiel:
- Nextcloud per Docker installieren für eure eigene Cloud
- Bitwarden per Docker installieren als eigenen Passwortmanager
- Portainer per Docker installieren, um eure Container bequem im Browser zu verwalten
- Grafana via Docker installieren für Monitoring und Dashboards
- Authelia installieren, um eure Dienste zusätzlich mit Zwei-Faktor-Login abzusichern
Traefik aktualisieren
In der docker-compose.yml ist eine feste Version eingetragen (traefik:v3.7) und nicht einfach latest. So entscheidet ihr selbst, wann ein Update eingespielt wird, und Traefik ändert sich nicht unbemerkt beim nächsten Neustart.
Dank der Einstellung checkNewVersion: true weist Traefik in den Logs darauf hin, wenn eine neue Version verfügbar ist. Für ein Update öffnet ihr die docker-compose.yml:
cd /opt/containers/traefik
nano docker-compose.yml
Ändert dort in der Zeile image: die Versionsnummer auf die gewünschte neue Version. Anschließend ladet ihr das neue Image herunter und startet den Container neu:
docker compose pull
docker compose up -d
Ein kurzer Blick in die Logs zeigt, ob alles sauber läuft:
docker compose logs
Eure Zertifikate, Einstellungen und alle angebundenen Dienste bleiben dabei erhalten, weil sie außerhalb des Containers gespeichert sind.
Wichtig: Updates innerhalb von Version 3 (z. B. von v3.7 auf eine neuere 3er-Version) sind in der Regel unproblematisch. Werft trotzdem vorher einen Blick in die Release Notes. Bei einem Sprung auf eine neue Hauptversion ändert sich meist die Konfiguration, dann solltet ihr vorher den offiziellen Migrationsleitfaden von Traefik lesen.
Häufige Fehler und Lösungen
Der Browser meldet ein unsicheres Zertifikat
Traefik liefert ein eigenes Standardzertifikat aus, solange Let's Encrypt noch kein echtes Zertifikat ausgestellt hat. Schaut in die Logs, ob dort ein Fehler auftaucht:
cd /opt/containers/traefik
docker compose logs | grep -i acme
Die häufigsten Ursachen sind, dass die DNS-Einträge noch nicht auf euren Server zeigen (prüft das mit dig +short traefik.euredomain.de) oder dass Port 443 nicht erreichbar ist. Wichtig: Let's Encrypt begrenzt fehlgeschlagene Versuche. Wenn es mehrmals nicht geklappt hat, behebt erst die Ursache und wartet dann etwa eine Stunde, bevor ihr Traefik neu startet.
Die Seite zeigt „404 page not found“
Traefik läuft, findet aber keinen passenden Dienst für die aufgerufene Adresse. Prüft in der docker-compose.yml des Dienstes:
- Ist das Label
traefik.enable=truegesetzt? - Stimmt die Domain in der
Host(...)-Regel exakt mit der aufgerufenen Adresse überein? - Ist der Container im Netzwerk „proxy“?
Im Traefik-Dashboard unter „HTTP Routers“ seht ihr, welche Dienste Traefik erkannt hat.
Traefik startet nicht
Meist steckt ein Formatierungsfehler in einer der yml-Dateien dahinter, oft ein Tab statt Leerzeichen. Die docker-compose.yml könnt ihr so prüfen:
docker compose -f /opt/containers/traefik/docker-compose.yml config
Fehler in der traefik.yml oder middlewares.yml zeigen die Logs mit docker compose logs.
Der Dashboard-Login funktioniert nicht
Das Setup-Skript ersetzt den Platzhalter nur beim ersten Durchlauf. Um Benutzer oder Passwort zu ändern, erzeugt ihr einen neuen Eintrag:
htpasswd -nbB -C 12 BENUTZERNAME PASSWORT
Die Ausgabe tragt ihr in der middlewares.yml anstelle des alten Eintrags unter users ein. Traefik übernimmt die Änderung automatisch, ein Neustart ist nicht nötig.
Der passende VPS für dein Traefik-Setup
Traefik selbst braucht nur wenig Arbeitsspeicher. Für Traefik und einige leichtere Dienste, etwa eine Website oder einen Passwortmanager, reicht bereits der Cloud Server S mit 4 GB RAM und 2 vCores. Willst du mehrere größere Anwendungen parallel betreiben, ist der Cloud Server M mit 8 GB RAM die bessere Wahl. Und falls dein Setup wächst, kannst du jederzeit upgraden.
Dein Server steht in ISO-zertifizierten Rechenzentren in Deutschland, und jeden Linux-VPS kannst du 30 Tage kostenlos testen.