Im vorangegangenen Artikel haben wir ein eigenes VLAN für unsere Docker-Container eingerichtet. Das ermöglicht es uns unter anderem, Container direkt auf Ports wie 80 und 443 verfügbar zu machen und damit unsere installierten Anwendungen schnell und bequem erreichbar zu machen.
Was ist ein Reverse Proxy?
Ganz einfach gesagt kann man sich einen Reverse Proxy wie einen Platzanweiser im Kino vorstellen. Alle Gäste kommen durch dieselbe Tür und der Platzanweiser schaut auf das Ticket und weist dem Gast den Weg in den richtigen Kinosaal.

Der Reverse Proxy nimmt in dem Fall sämtliche HTTP/HTTPS-Anfragen an und leitet die Anfragen an den richtigen Server/Container im Hintergrund weiter.
Warum Traefik wenn Synology DSM doch schon einen eigenen Reverse Proxy mitbringt?
Richtig, DSM bringt bereits einen eigenen Reverse Proxy mit. Dieser beherrscht auch die wichtigsten Funktion. Aber Traefik kann noch viel mehr, wie z.B.:
- Let’s Encrypt Zertifikate automatisch erstellen
- automatische Konfiguration über Docker Labels
- Middleware-Support für z.B. Authentifizierungsprovider wie Authelia oder Authentik, Rate Limit, HTTP/Security Header
Traefik als Docker Container installieren
Voraussetzungen:
- einen lokalen DNS Server
- ein MacVLAN Docker-Netzwerk
- eine eigene Domain (bei Cloudflare gehostet)
- ein Cloudflare-API-Token
- ein Verzeichnis für die Konfigurationsdateien auf der Diskstation
Cloudflare API Token erstellen
Falls noch nicht geschehen ist es jetzt an der Zeit eine Domain bei Cloudflare zu erstellen und ein API Token zu erstellen, damit Traefik Zertifikate für unsere Container erstellen kann.
Nachdem Login bei Cloudflare geben wir oben rechts im Suchfeld «API» ein und wählen «{} API-Token» aus.

Auf der folgenden Seite klicken wir oben auf den Button «Token erstellen» und wählen im nächsten Schritt in der Zeile «Benutzerdefiniertes Token erstellen» den Button «Erste Schritte». Daraufhin öffnet sich ein Formular in dem wir folgendes eintragen:

Wir klicken auf «Weiter zur Zusammenfassung» und anschliessend auf «Token erstellen».

Das angezeigte Token müssen wir kopieren und an einem sicheren Ort abspeichern. Wir benötigen es später für unsere Konfiguration.
Konfiguration der Traefik-Installation auf der Synology

Ich habe für alle Docker-Container/Projekte das Verzeichnis «docker-data» erstellt. Die Unterverzeichnisse wie z.B. traefik lassen sich dann über einen absoluten Pfad im Container einbinden.
Zunächst legen wir ein eigenes Verzeichnis für Traefik in unserem «docker-data»-Ordner an. Daran erstellen wir anschliessend die drei Unterverzeichnisse «certs», «conf» und «logs» sowie die Dateien «docker-compose.yaml», «traefik.yaml» und «.env».
In der docker-compose.yaml definieren wir den Traefik-service:
- Wir nutzen als Hauptnetzwerk unser MacVLAN «unifi_container_network» und ebenfalls ein neues Bridge-Netzwerk «traefik-proxy». Dieses benötigen wir später einmal.
- In unserem MacVLAN erstellen wir die feste IP-Adresse 192.168.200.200
- Wir mounten alle Verzeichnisse und Dateien an die entsprechenden Stellen im Container
- In den Umgebungsvariablen erstellen wir eine Variable für den Cloudflare-Certificate-Resolver, dieser erstellt uns Let’s-Encrypt-Zertifikate, damit wir unsere Services über HTTPS aufrufen können
services:
traefik:
container_name: traefik-reverse-proxy
# The official v3 Traefik docker image
image: traefik:v3.6.6
restart: always
# Tells Traefik to listen to docker
command:
- --providers.docker
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock:ro
- /volume1/docker-data/traefik/traefik.yaml:/etc/traefik/traefik.yaml:ro
- /volume1/docker-data/traefik/conf:/etc/traefik/conf/
- /volume1/docker-data/traefik/certs:/etc/traefik/certs/
- /volume1/docker-data/traefik/logs:/var/log/traefik/
networks:
traefik-network:
ipv4_address: 192.168.200.200
traefik-proxy:
networks:
traefik-network:
name: unifi_container_network
external: true
traefik-proxy:
name: traefik-proxy
docker-compose.yamlDas Cloudflare API Token, welches wir weiter oben erstellt haben, legen wir in der .env Datei folgendermassen an. Die Variablen in der .env-Datei werden beim Starten des Containers automatisch gelesen und als Umgebungsvariablen gesetzt.
GOMAXPROCS=2
CF_DNS_API_TOKEN=<EIGENES CLOUDFLARE TOKEN>.envDie Traefik Konfiguration schreiben wir in die traefik.yaml Datei.
Darin definieren wir grundlegende Parameter wie das Dashboard (damit wir auch etwas sehen), Loglevel und so weiter.
Unter «entrypoints» definieren wir die Ports auf die der Traefik-Service lauscht. Mit dieser Konfiguration werden HTTP (Port 80) und HTTPS (Port 443) benutzt und alle Anfragen über Port 80 werden automatisch auf 443 umgeleitet. Für 443 werden automatisch SSL bzw. TLS Zertifikate erstellt mit dem «certResolver: cloudflare». Dieser wird im Abschnitt certificatesResolvers eingestellt.
Zu guter Letzt werden im Bereich «providers» die Schnittstellen definiert von denen Traefik die Einstellungen für die einzelnen Dienste bezieht. Der Provider vom Typ «file» liest alle yaml-Dateien aus dem angegebenen Ordner während «docker» die Konfiguration aus Labels der jeweiligen Container bezieht. Das schauen wir uns später an.
global:
checkNewVersion: true
sendAnonymousUsage: false
api:
dashboard: true
insecure: false
debug: false
log:
level: INFO
filePath: /var/log/traefik/traefik.log
accessLog:
filePath: /var/log/traefik/access.log
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
network: unifi_container_network # VLAN-Netz
watch: true
exposedByDefault: false
file:
directory: /etc/traefik/conf/
watch: true
entryPoints:
web:
address: :80
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: :443
http:
tls:
certResolver: cloudflare
certificatesResolvers:
cloudflare:
acme:
email: <<EIGENE MAIL ADRESSE>>
storage: /etc/traefik/certs/cloudflare.json
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "8.8.8.8:53"
delayBeforeCheck: 5
serversTransport:
insecureSkipVerify: true
traefik.yamlIn der file_provider.yaml erstellen wir Regeln für das Routing zu den entsprechenden Services:
http:
routers:
dashboard:
rule: Host(`traefik-dashboard.hnrx.net`)
service: api@internal
entryPoints:
- websecure
tls:
certResolver: cloudflare
to-portainer:
rule: "Host(`portainer.hnrx.net`)"
tls:
certResolver: cloudflare
service: portainer
to-ds920:
rule: "Host(`ds920.hnrx.net`)"
tls:
certResolver: cloudflare
service: ds920
services:
ds920:
loadBalancer:
servers:
- url: http://192.168.250.10:5000
portainer:
loadBalancer:
servers:
- url: https://192.168.200.11:9443 conf/file_provider.yamlDas Routing funktioniert folgendermassen (am Beispiel der Portainer-Route):
Gelangt ein Request mit dem Hostnamen «portainer.hnrx.net» wird dieser an den Service «portainer» weitergeleitet. Sobald die Route definiert wird erstellt Traefik automatisch ein TLS-Zertifikat mit dem Cloudflare-Resolver. Der Request wird dann zur URL weitergeleitet der für den portainer-Service definiert ist. In diesem Fall ist das «https://192.168.200.11:9443».
Dabei spielt es keine Rolle ob es sich beim Ziel um einen Container handelt, einen anderen Server (z.B. das NAS selbst) oder ein interner Service in der Traefik-App selbst.
DNS-Eintrag erstellen
In unserem Beispiel möchten wir alle Subdomains von hnrx.net an Traefik schicken. Dazu müssen wir unser Netzwerk entsprechend konfigurieren und in unserem DNS-Server einen Wildcard-Eintrag (z.B. *.domain.name) erstellen.
Ich erkläre das wieder anhand der Unifi Konsole. Unter «Einstellungen (1) -> Richtlininientabelle (2)» erstellen wir eine neue Richtlinie (3) vom Typ DNS (4). Dort wählen wir als Typ «Host (A)» und tragen unter Name «*.hnrx.net» und unter IP-Adresse die Adresse unseres Traefik-Containers ein. Anschliessend speichern wir den neuen Eintrag mit dem Button «Hinzufügen» ganz unten rechts (nicht im Bild).

Wenn wir das erledigt haben werden alle Hostnamen, die auf .hnrx.net enden zu unserem Traefik-Server weitergeleitet. Wir können dies in einem Terminal mit dem nslookup prüfen.

Wenn wir jetzt portainer.hnrx.net im Browser aufrufen, sollten wir unsere Portainer-Installation finden oder auch unser Traefik-Dashboard für das wir die Route «traefik-dashboard.hnrx.net erstellt haben.

Damit haben wir Traefik grundsätzlich einmal installiert und unsere ersten Routen erstellt. In einem folgenden Artikel erkläre ich wie wir Container mit Labels definieren so dass die Route automatisch erstellt wird wenn wir den Container starten.