Wenn mehrere Dienste auf demselben Server über Port 80 (HTTP) oder 443 (HTTPS) kommunizieren, kann es zu Port-Konflikten kommen, da normalerweise nur ein Dienst einen bestimmten Port zur gleichen Zeit belegen kann. Traefik löst dieses Problem als Reverse-Proxy und Load-Balancer.
Traefik leitet alle eingehenden Anfragen auf Port 80 oder 443 an die richtigen Dienste weiter. Dies geschieht anhand von konfigurierten Regeln, die das Routing bestimmen. So wird sichergestellt, dass jeder Dienst erreichbar ist, ohne dass Port-Konflikte entstehen. Nutze Traefik für eine effiziente und reibungslose Kommunikation der Webdienste.
In wie weit unterscheidet sich diese zu der bisherigen vorhandenen Anleitung?
- Die bisherige Anleitung ist etwas gealtert.
- Es gab viele wichtige Kommentare, Fragen und Anregungen – vielen Dank dafür!
- Traefik Major Release Version 3
Diese Anleitung ist nicht mehr die aktuelle und WIRD NICHT MEHR GEPFLEGT. Hier geht’s zur neuen Anleitung:
https://stage.goneuland.de/traefik-ab-v3-6-mit-crowdsec-installieren-und-konfigurieren/
Versionierung
| Datum | Änderung |
|---|---|
| Hinweis | Um die Docker-API-Problematik zu umgehen, kann in der Datei/opt/containers/traefik-crowdsec-stack/.env die VariableSERVICES_TRAEFIK_IMAGE_VERSION=3.6ergänzt werden. Diese Einstellung überschreibt die in compose/traefik.yml definierte Standard-Image-Version von Traefik. |
| 06.12.2025 | Kapitel 7.2.: SERVICES_TRAEFIK_IMAGE_VERSION in traefik.yml auf aktuellen Stand (3.6) gebracht. |
| 12.04.2025 | Kapitel 7.4.3.: In einzelne Middlewares aufgeschlüsselt und Header security um fehlenden Punkte erweitert. |
| 08.04.2025 | Kapitel 7.2.: Entfernen von default@file und Bouncer-Tausch default@file entfernt, da stets automatisch zugewiesen. Bouncer durch gepflegten Fork von FreifunkMUC ersetzt. |
| 07.04.2025 | Kapitel 7.2.: Elementare Änderungen im docker-socket-proxy von linuxserver.io wodurch der Healthcheck fehlschlägt. |
| 24.03.2025 | Kapitel 7.2.: Schreibfehler korrigiert (@nicklas) Kapitel 7.4.6.: Schreibfehler korrigiert (@nicklas) Kapitel 7.5.1.: Hinweis zu Debian 12 hinzugefügt (@christian) |
| 02.02.2025 | Kapitel 7.2: Fehler in der Compose von Traefik behoben (@thedj) / Traefik-Version auf 3.3 angepasst. |
| 10.10.2024 | Kapitel 7.3.1.: Hinweis erweitert (@steje) Kapitel 7.2. & Kapitel 7.3.2.: Anbindung von CrowdSec an den Docker-Socket-Proxy / Github aktualisiert |
| 09.10.2024 | Kapitel 7.5.1. & Kapitel 8.1.: Um Hinweis ergänzt (@Dearmon) |
| 07.10.2024 | Initialer Release |
WICHTIG!
Diese Anleitung nimmt keine Rücksicht auf die alte Anleitung. Ich werde schauen, dass ich eine gesonderte Anleitung für den Umstieg schreibe. Grundsätzlich ist es möglich in dem man alle Docker Container und Netzwerke herunterfährt dann diese Anleitung durchläuft und die Container nach und nach wieder hochfährt. Zu beachten gilt an dieser Stelle dann nur ein kleiner Unterschied in Angabe des Host in den Labels:
traefik.http.routers.nginx-mailcow-secure.rule: "Host(`mail.euredomain.de`) || Host(`autodiscover.euredomain.de`) || Host(`autoconfig.euredomain.de`) || Host(`mta-sts.euredomain.de`) || Host(`imap.euredomain.de`) || Host(`pop3.euredomain.de`) || Host(`smtp.euredomain.de`)"
Code-Sprache: JavaScript (javascript)
traefik.http.routers.nginx-mailcow-secure.rule: Host(`mail.euredomain.de`,`autodiscover.euredomain.de`,`autoconfig.euredomain.de`,`mta-sts.euredomain.de`,`imap.euredomain.de`,`pop3.euredomain.de`,`smtp.euredomain.de`)
Code-Sprache: CSS (css)
0. Testing
Ich werde versuchen, diese Anleitung so aktuell wie möglich zu halten. Die Kompatibilität der Anleitung und der dazugehörigen Konfigurationen kann im zugehörigen GitHub-Repository eingesehen werden. Ich empfehle, das GitHub-Repository nur dann zu verwenden, wenn du diese Anleitung bereits mehrfach durchgearbeitet hast oder generell ein erfahrener Anwender im Bereich Server- und Docker-Administration bist.
Repository-Link: https://github.com/psycho0verload/traefik-crowdsec-stack
1. Zielsetzung
- Traefik v3 installieren und konfigurieren
- Crowdsec installieren und konfigurieren
- Traefik Services via CrowdSec sichern
- Einzelner Stack
- Wie wir unsere Services mit Traefik verfügbar machen

2. Voraussetzung
Um die Installation und Konfiguration von Traefik v3 und CrowdSec durchzuführen, müssen die folgenden Systemanforderungen erfüllt sein:
- Ubuntu 24.04 LTS – “Noble” oder Debian 12 LTS – “Bookworm”
- Docker version 27.x
- Docker Compose version v2.28.x
root-Rechte auf dem Zielsystem
2.1. Hinweis
Diese Anleitung basiert auf meiner persönlichen Testumgebung, in der ich hauptsächlich mit der aktuellen Ubuntu-Version arbeite. Dennoch werde ich den gesamten Prozess auch auf der neuesten Debian-Version testen und bereitstellen.
Es ist möglich, dass die Anleitung auch rückwärtskompatibel zu älteren Versionen von Ubuntu und Debian ist. Dies werde ich jedoch weder testen noch sicherstellen.
Mir ist bekannt, dass es inzwischen ein CrowdSec-Plugin für Traefik gibt, allerdings möchte ich alle Möglichkeiten von CrowdSec in meinen Umgebungen voll ausschöpfen.
Wichtiger Hinweis:
ALLE Befehle werden als root-User ausgeführt!


Hi,
ich habe seit heute einen neuen Fehler bei Traefik v3. Er ist der meinung, dass keine middleware-chain mehr möglich wäre (ab v3), was Quatsch ist, weil ich habe einige traefiks, die das haben.
Fehler:
1.:
ERR error=”cannot create middleware: multi-types middleware not supported, consider declaring two different pieces of middleware instead” entryPointName=websecure routerName=traefik@docker
Also was er will (dynamic_conf.yml) ist:
middlewares:
# default:
# chain:
# middlewares:
# – default-security-headers
# – gzip
und bei den labels (bspw. traefik dashboard)
traefik.http.routers.traefik.middlewares: default-security-headers@file, gzip@file
ACHTUNG: Da steht nicht default@file
2.:
Man kann seit v3 nicht mehr folgende Host-Notation machen: Host (
host1.euredomain.de) || Host (host2.euredomain.de)ACHTUNG: Ich meine nicht die alte Notation sondern die neue.
Jetzt werden alle sagen: “Bei mir geht das” – Ja geht auch
Drei Monate lang und dann erneuert der traefik das Zertifikat nicht mehr – so geschehen bei mir, bei einigen Diensten.
Ihr müsst für jeden Namen einen eigenen Router (Labelsatz) bauen.
Ich finde diese beiden “Neuerungen” einen extremen Rückschritt!
Falls jemand eine Idee hat – immer her damit.
Das automatische Skript für die Traefik-Installation ist einfach nur genial!
Hallo,
wenn ich unter Punkt: 7.5.1 den Befehl:
docker compose up crowdsec -d && docker compose down
ausführe, kommt diese Fehlermeldung:
yaml: unmarshal errors:
line 23: mapping key “socket-proxy” already defined at line 2
Ich führe den Befehl im Ordner: /opt/containers/traefik-crowdsec-stack aus.
Jemand n Tipp?
VG Hardy
Hallo
psycho0verload
Vielen Dank für die tolle Anleitung. Bei mir zeigt er keine IP-Addresse und Type bei Firewall an? Ist das OK?
Ich habe den neuen Stack jetzt am Laufen, und auch schon die alte Nextcloud-Instanz mit dem neuen Stack wieder erreichbar, vielen Dank für die hilfreiche Anleitung und vor allem für das Skript. Ich musste es etwas anpassen, weil ich nicht in /opt installiere, da ich die Container nicht auf dem USB-Stick haben will, der mein Boot-Medium ist (OpenMediaVault), aber danach hat es funktioniert.
Lediglich ein Problem tritt gelegentlich auf, und zwar dass ich selbst gebannt werde. Gibt es eine einfache Möglichkeit, Anfragen von der eigenen öffentlichen IP-Adresse (DynDNS) immer durchzulassen? Also dynamisch, ohne dass ich jetzt meine IP in der Whitelist eintrage, weil die sich ja jederzeit ändern kann? Wenn ich von Außerhalb zugreife ist das dann halt so, weil ja nicht klar sein kann, dass die Anfrage von mir ist, aber wenn ich zu Hause bin, dann ist das ja die gleiche IP unter der der Server auch zu erreichen ist, das ist doch bestimmt machbar.
Viele Grüße
Mir fällt jetzt gerade noch was auf..
daemon.json -> “base”: “172.25.0.0/14″ ist für v4 so glaube ich nicht richtig.
Es handelt sich dabei um eine Adresse aus dem 172.24.0.0/14 Netzwerk.
Auch wenn es funktioniert, (docker scheint es richtig zu interpretieren, jedenfalls gehen die Netze/Ips mit 172.24. los) würde ich hier wie folgt eintragen “172.24.0.0/14”
Dann passt auch bei einer Size 23 die 512(-2) Hosts bzw verfügbare IP Adressen pro Netzwerk.
Danke Gruss Marco
Hallo Christian, mal wieder eine super Anleitung! Ich habe die neue V3 Anleitung in einen separaten Ordner aufgebaut, meine spezifischen Änderungen wie IPWhitelist, Telegram Alerting, Collections usw. in die Config Files eingepflegt. Dann die alte Umgebung runtergefahren, die neue gestartet, lief auf Anhieb.
Frage: Hast du IPv6 getestet?
Danke Gruss Marco
Hallo und eine kurze Frage: ist es geplant, den Cloudflaretunnel mit in die Konfiguration zu übernehmen?
Authelia Integration in Traefik-Crowdsec-Stack (Traefik3)
Anlegen von Verzeichnissen.
Erstellen der Secrets
Das Secret authelia_notifier_smtp_password enthält euch Password zum Email Account wenn Ihr SMTP Notifications nutzen wollt.
Wenn ihr File Notifications nutzen wollte dann lasst dies bitte weg.
Ergänzen der docker-compose.yml
—
—
Erstellen der .env File in /opt/containers/traefik-crowdsec-stack/data/authelia/
Legt hier bitte eine .env File mit folgendem Inhalt an.
—
—
Erstellen authelia.yml im compose Verzeichnis.
nano /opt/containers/traefik-crowdsec-stack/compose/authelia.yml
—
services: authelia: container_name: 'authelia' depends_on: traefik: condition: service_healthy hostname: ${SERVICES_AUTHELIA_HOSTNAME:-authelia} image: 'docker.io/authelia/authelia:latest' restart: 'unless-stopped' env_file: ${ABSOLUTE_PATH}/data/authelia/.env networks: proxy: ipv4_address: ${SERVICES_AUTHELIA_NETWORKS_PROXY_IPV4:-172.31.191.200} ipv6_address: ${SERVICES_AUTHELIA_NETWORKS_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:7f00} socket_proxy: ipv4_address: ${SERVICES_AUTHELIA_NETWORKS_SOCKET_PROXY_IPV4:-172.31.255.200} ipv6_address: ${SERVICES_AUTHELIA_NETWORKS_SOCKET_PROXY_IPV6:-fd00:1:be:a:7001:0:3e:8f00} volumes: - /etc/localtime:/etc/localtime:ro - ${ABSOLUTE_PATH}/data/authelia/config:/config secrets: ['JWT_SECRET', 'SESSION_SECRET', 'STORAGE_ENCRYPTION_KEY', 'NOTIFIER_SMTP_PASSWORD'] environment: AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE: '/run/secrets/JWT_SECRET' AUTHELIA_SESSION_SECRET_FILE: '/run/secrets/SESSION_SECRET' AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE: '/run/secrets/STORAGE_ENCRYPTION_KEY' AUTHELIA_NOTIFIER_SMTP_PASSWORD_FILE: '/run/secrets/NOTIFIER_SMTP_PASSWORD' labels: traefik.enable: true traefik.http.routers.authelia.rule: HOST(auth.domain.tld) traefik.http.routers.authelia.entryPoints: websecure traefik.http.routers.authelia.tls: true traefik.http.routers.authelia.tls.certresolver: tls_resolver traefik.http.services.authelia.loadbalancer.server.port: 9091 traefik.http.middlewares.authelia.forwardAuth.address: https://authelia:9091/api/authz/forward-auth traefik.http.routers.authelia.middlewares: default@file traefik.http.routers.authelia.service: authelia security_opt: - no-new-privileges:true secrets: JWT_SECRET: file: ${SECRETDIR}/authelia/authelia_jwt_secret SESSION_SECRET: file: ${SECRETDIR}/authelia/authelia_session_secret STORAGE_ENCRYPTION_KEY: file: ${SECRETDIR}/authelia/authelia_storage_encryption_key NOTIFIER_SMTP_PASSWORD: file: ${SECRETDIR}/authelia/authelia_notifier_smtp_password…
Erzeugen Traefik Middelware Yml für Authelia.
Erzeugt im Verzeichnis /opt/containers/traefik-crowdsec-stack/data/traefik/dynamic_conf
eine Datei http.middlewares.middlewares-authelia.yml mit folgendem Inhalt.
—
—
Erzeugen der Authelia Configuration in /opt/containers/traefik-crowdsec-stack/data/authelia/config
mit nano /opt/containers/traefik-crowdsec-stack/data/authelia/config/configuration.yml die entsprechende Datei erstellen.
Inhalt:
—
############################################################### # Authelia configuration # ############################################################### theme: dark identity_validation: reset_password: # Wird durch das Secret gesetzt jwt_secret: server: address: tcp://0.0.0.0:9091/ # https://www.authelia.com/configuration/miscellaneous/logging/ log: level: error format: json file_path: /config/authelia.log keep_stdout: true # https://www.authelia.com/configuration/second-factor/time-based-one-time-password/ totp: issuer: domain.tld period: 30 skew: 1 # https://www.authelia.com/reference/guides/passwords/ authentication_backend: password_reset: disable: false refresh_interval: 5m file: path: /config/users.yml password: algorithm: argon2id iterations: 1 salt_length: 16 parallelism: 8 memory: 256 # https://www.authelia.com/overview/authorization/access-control/ access_control: default_policy: deny rules: - domain: 'auth.domain.tld' # Hier deine Authelia Domain einsetzen. policy: bypass networks: # Optional - 10.0.0.0/8 - 192.168.0.0/16 - 172.16.0.0/12 - domain: - "*.domain.tld" # Wildcard Adresse für Domain optional - "traefik.domain.tld" # Hier deine Traefik Domain einsetzen. - "domain.tld" # Hier deine Domain einsetzen. policy: two_factor # https://www.authelia.com/configuration/session/introduction/ session: name: authelia_session same_site: lax secret: expiration: 5h inactivity: 15m remember_me: 10M cookies: - domain: 'domain.tld' authelia_url: https://auth.domain.tld # Authelia URL default_redirection_url: https://auth.domain.tld/ # Default Redirect URL # https://www.authelia.com/configuration/security/regulation/ regulation: max_retries: 3 find_time: 10m ban_time: 12h # https://www.authelia.com/configuration/storage/introduction/ storage: # For local storage, uncomment lines below and comment out mysql. https://docs.authelia.com/configuration/storage/sqlite.html # This is good for the beginning. If you have a busy site then switch to other databases. local: path: '/config/db.sqlite3' # Wird durch Secret gesetzt encryption_key: # https://www.authelia.com/configuration/notifications/introduction/ notifier: disable_startup_check: false # For testing purposes, notifications can be sent in a file. Be sure to map the volume in docker-compose. filesystem: filename: '/config/notification.txt' # SMTP nur aktivieren wenn es sicher funktioniert bei euch #notifier: # disable_startup_check: false # smtp: # username: 'admin@domain.tld' # Username für deinen Mailserver # password: 'Sicheres Password' # alternativ Secret anlegen AUTHELIA_NOTIFIER_SMTP_PASSWORD_FILE # address: 'smtp://mail.domain.tld:587' # sender: 'Authelia Notifier <admin@domain.tld>' # subject: "[Notification domain.tld] {titel}" # startup_check_address: 'test@domain.tld' # disable_starttls: false # disable_html_emails: false # disable_require_tls: false—
Mit diesem Befehl erzeugt ihr den Hash für Euren User:
den angezeigten String tragt ihr dann in die users.yml ein als password:
Mit nano /opt/containers/traefik-crowdsec-stack/data/authelia/config/users.yml die entsprechende Datei erstellen.
Inhalt:
—
—
Nach dem ihr dann alle Container mit docker compose -up -d –force-recreate neugestartet habt, ruft ihr
eure Authelia domain auf auth.domain.tld und log euch mit den angelegten Zugangsdaten ein.
Durch den rest führt euch dann Authelia. Beachtet der 6 stellige Code der angefordert wird wird euch in der Notification.txt im config Verzeichnis angezeigt.
Nach dem erfolgreichen Anlegen des 2FA könnt ihr nun folgende Anpassungen vornehmen:
Manuelle Anpassungen an der traefik.yml im /compose
um Traefik hinter die Authelia Middleware zu bekommen muss folgende Zeile angeasst werden.
Original:
traefik.http.routers.traefik-dashboad.middlewares: default@file,traefik-dashboard-auth@file
Angepasst:
traefik.http.routers.traefik-dashboad.middlewares: default@file,middlewares-authelia@file
Macht das bitte erst wenn euer Authelia Container läuft und ihr euch bei Authelia mindestens einmal angemeldet habt.
alternativ kann man hier auch eine traefik.override.yml anlegen.
nach einem erneuten restart mit
docker compose up -d –force-recreate
und ein paar minuten Wartezeit sollte sich beim Aufruf eurer Traefik Domain nun erst Authelia melden.
Ich hoffe ich habe dies nun vollständig dokumentiert. Falls doch was schiefgehen sollte fragt einfach.
Ich habe dies auch gleichzeitig an Psycho0verload geschickt zur Prüfung und ggf einbau in den Stack.
Tag zusammen, habe gestern Abend die Anleitung genauestens ausgeführt. Aber ich bekomme außer Traefik-Dashboard keinen meiner Services von außen erreicht. Auch wenn ich zB meine Portainer Installation wie hier beschrieben einbinde, keine Chance. Das ganze hängt hinter CloudFlare und ich bekomme nen 525er also SSL Handshake, oder auch gar keine Response.
Im Traefik.log stehen bei den Certificates 403er Fehler.
Werd irre, hat jemand nen Tip was ich noch schauen kann?