Traefik Reverseproxy auf vServer/VPS installieren

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".

Webseitenkopf mit Logo 'dogado' und Navigationsleiste; orange markiertes 'Meine Produkte'; Seitenüberschrift 'Meine Produkte'.

Scrollt nun ganz nach unten bis ihr „Domains“ seht: 

Screenshot einer Domain-Verwaltungsseite mit den Domains windows-vps.net und testbereich.net.

Bei der gewünschten Domain klickt ihr nun auf die „3 Punkte“ und wählt „Produkt öffnen“ aus: 

Dropdown-Menü mit Einträgen 'Produkt öffnen' und 'Zu den Abonnements gehen'; rechts drei Punkte.

Nun wählt ihr den Bereich „DNS“ aus: 

Screenshot einer Website: dogado-Logo oben links, seitliche Navigation mit Startseite, Domains, DNS (hervorgehoben).

Nun seht ihr eine Übersicht eurer DNS-Einträge für diese Domain. Wir benötigen den „*“ Eintrag sowie den „leeren Eintrag“ darüber: 

DNS-Verwaltung: Tabelle mit Name, TTL, Typ und Wert; gelber Button 'Record hinzufügen'; Zeile 600 A 178.250.170.125.

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“: 

DNS-Verwaltungsseite: linke Navigation, Überschrift DNS-Verwaltung, gelb umrissener Button '+ Record hinzufügen'.

Fügt nun die beiden Einträge hinzu: 

DNS-Record hinzufügen: Typ A gewählt; Name leer; TTL 600; Ziel-IP-Platzhalter 'IP-eures Servers'.

Anschließend klickt ihr noch auf „Hinzufügen“. Dies wiederholt ihr für den „leeren Eintrag“: 

DNS-Record hinzufügen: Typ A; Name Subdomain=testbereich.net; TTL 600; Ziel-IP Platzhalter 'IP-eures Servers'.

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: 

Terminalfenster mit Logzeilen und Zeitstempeln; Meldungen wie 'Starting provider' auf dunklem Hintergrund.

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: 

Screenshot eines Browserfensters mit weißer Seite; rechts ein Dialog mit Feldern Benutzername, Passwort und zwei Buttons.

Meldet euch mit den eben erstellten Zugangsdaten an. Danach sollte es in etwa so aussehen:

Screenshot eines Traefik-Dashboards mit drei Kreisdiagrammen (Routers, Services, Middlewares) und Entrypoints :80, :443.

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: 

SSL-Report mit grünem A+-Symbol; Balkendiagramm zeigt Certificate, Protocol Support, Key Exchange, Cipher Strength.

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: 

Traefik Proxy-Dashboard: linkes Menü, Tabelle mit drei Host-Einträgen und EntryPoint websecure, grüne Statussymbole.

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:

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=true gesetzt?
  • 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.

Nächster Artikel
Uptime Monitor / Statping auf vServer/VPS installieren
Weitere passende Themen