Einführung: Verstehe deinen Türsteher
Heute installieren wir das Herzstück unserer Infrastruktur: Traefik. Wenn du bisher nur mit Apache oder Nginx gearbeitet hast, wird Traefik dich vielleicht verwirren. Es funktioniert anders. Aber wenn der Groschen einmal gefallen ist, wirst du es lieben.
Stell dir deinen Server wie ein riesiges Hotel vor.
- Die Container (WordPress, Nextcloud): Das sind die Hotelzimmer.
- Die Domain (cloud.deine-domain.de): Das ist der Name des Gastes.
- Traefik: Das ist der Empfangschef an der Rezeption.
Wenn ein Gast (eine Anfrage aus dem Internet) kommt, fragt er nicht nach „Zimmer 402“. Er sagt: „Hallo, ich möchte zu Herrn Nextcloud.“ Traefik schaut in seine aktuelle Belegungsliste, sieht, dass Herr Nextcloud gerade in Zimmer 402 (Container ID xyz) wohnt, und schickt den Gast dorthin. Zieht Herr Nextcloud in ein anderes Zimmer um (Container-Neustart), aktualisiert Traefik seine Liste automatisch.
Das Kern-Konzept: Statisch vs. Dynamisch
Das ist der Punkt, an dem 90% aller Einsteiger scheitern. Traefik hat zwei Arten von Konfigurationen. Wir müssen sie strikt trennen.
1. Die Statische Konfiguration (Der Bauplan)
Das sind Dinge, die sich fast nie ändern. Sie werden beim Start von Traefik festgelegt.
- Auf welchen Ports höre ich? (80 und 443)
- Wo schreibe ich meine Logs hin?
- Wer gibt mir SSL-Zertifikate? (Let’s Encrypt)
- Wo soll ich nach Containern suchen? (Docker Socket)
Wir definieren dies in der Datei /opt/containers/traefik/traefik.yml.
2. Die Dynamische Konfiguration (Die Zurufe)
Das sind Dinge, die sich ständig ändern können. Laufende Container kommen und gehen.
- „Ich bin WordPress und höre auf blog.de“
- „Ich bin Authentik und brauche extra Sicherheit“
Diese Infos schreiben wir nicht in eine Datei. Wir schreiben sie als Labels direkt an die jeweiligen Docker-Container. Traefik liest diese Labels live aus.
Schritt 1: Die Statische Konfiguration (traefik.yml)
Schauen wir uns deine traefik.yml im Detail an. Ich erkläre die wichtigsten Blöcke.
Die EntryPoints (Eingangstüren)
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
Hier öffnen wir Port 80 (HTTP) und 443 (HTTPS). Der geniale Trick hier: Wir sagen bei Port 80 sofort: „Leite alles automatisch an websecure (HTTPS) weiter.“ Damit ist jeder Dienst auf deinem Server automatisch verschlüsselt erreichbar. Nie wieder manuelles Redirect-Einrichten.
Cloudflare & Trusted IPs
In deiner Config findest du eine lange Liste unter trustedIPs. Warum?
Da wir Cloudflare als DNS und Proxy nutzen, kommen alle Besucher technisch gesehen von Cloudflare-Servern. Ohne diese Liste würde Traefik denken: „Alle Besucher haben die IP von Cloudflare“. Wenn wir Crowdsec nutzen wollen, um Angreifer zu blockieren, müssen wir aber die echte IP kennen. Mit trustedIPs sagen wir Traefik: „Vertraue Cloudflare, wenn sie sagen, die Anfrage kommt eigentlich von IP 1.2.3.4“.
Zertifikate (Let’s Encrypt)
certificatesResolvers:
letsencrypt:
acme:
dnsChallenge:
provider: cloudflare
Das ist der „Zauber-Teil“. Wir nutzen die DNS-Challenge. Traefik beweist den Besitz der Domain nicht, indem es eine Datei hochlädt, sondern indem es kurzzeitig einen DNS-Eintrag über die Cloudflare-API setzt. Das erlaubt uns, SSL-Zertifikate für Server zu bekommen, die gar nicht öffentlich im Internet stehen (z.B. im Intranet).
Der Provider (Die Verbindung zu Docker)
providers:
docker:
endpoint: "tcp://socket-proxy:2375" # Sicherheit!
exposedByDefault: false
Hier greift unser Sicherheitskonzept aus Teil 5. Wir verbinden uns nicht mit dem gefährlichen Socket, sondern mit unserem Proxy. exposedByDefault: false ist extrem wichtig: Es bedeutet, dass kein Container automatisch ins Internet gestellt wird, es sei denn, wir erlauben es explizit.
Schritt 2: Der Traefik Container (docker-compose.yml)
Jetzt starten wir Traefik selbst. In der traefik-docker-compose.yml siehst du:
services:
traefik:
image: traefik:latest
ports:
- "80:80"
- "443:443"
environment:
- CLOUDFLARE_DNS_API_TOKEN
volumes:
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./acme/acme.json:/letsencrypt/acme.json
Wichtig: Die Datei acme.json speichert deine privaten SSL-Schlüssel. Wenn du sie verlierst, musst du alle Zertifikate neu beantragen. Backups sind hier Pflicht!
Schritt 3: Traefik konfiguriert sich selbst (Labels)
Traefik ist auch nur ein Container. Wie sagen wir Traefik, dass es sein eigenes Dashboard anzeigen soll? Mit Labels!
Schauen wir uns die Labels in der traefik-docker-compose.yml an. Das ist die „Sprache“, die du ab jetzt für jeden neuen Dienst (WordPress, Wiki etc.) sprechen musst.
labels: # 1. Einschalten - "traefik.enable=true" # 2. Router definieren (Die Regel) - "traefik.http.routers.traefik.rule=Host(`traefik.deine-domain.de`)" # 3. Den Service zuweisen (Wohin soll es gehen?) - "traefik.http.routers.traefik.service=api@internal" # 4. SSL aktivieren - "traefik.http.routers.traefik.tls.certresolver=letsencrypt" # 5. Middleware (Sicherheit) - "traefik.http.routers.traefik.middlewares=auth-traefik,crowdsec"
Die Anatomie eines Labels:
traefik.http.routers.MEIN-NAME.rule: „MEIN-NAME“ ist ein frei wählbarer Name für diese Verbindung. Er muss innerhalb von Traefik eindeutig sein.service=api@internal: Das ist ein Spezial-Service von Traefik, der das Dashboard bereitstellt. Normalerweise würde hier stehen, auf welchen internen Port der Container hört (z.B. Port 80 für nginx).middlewares: Hier ketten wir Sicherheitsmodule aneinander. Bevor man das Dashboard sieht, muss man durch „auth-traefik“ (Login) und „crowdsec“ (IP-Check).
Zusammenfassung
Wir haben jetzt ein System, das:
- Auf Port 80/443 lauscht.
- Anfragen anhand der Domain (Host) erkennt.
- Automatisch Zertifikate via Cloudflare holt.
- Sich seine Konfiguration dynamisch aus den Docker-Containern zieht.
Wenn du jetzt docker compose up -d machst, sollte nach kurzer Zeit unter traefik.deine-domain.de das Dashboard erreichbar sein (sofern DNS gesetzt ist). Aber Vorsicht: Es ist noch offen wie ein Scheunentor! Im nächsten Teil installieren wir Crowdsec, um die Türsteher-Funktion zu aktivieren.

Sei der Erste der einen Kommentar abgibt