Traefik als Reverse Proxy für deine Dienste verwenden
In diesem Beitrag erkläre ich dir, was Traefik ist und wie du Traefik als Reverse Proxy für deine Dienste nutzen kannst.
Was ist Traefik?
Traefik ist ein Reverse Proxy mit vielen nützlichen Funktionen wie eingebautem Load Balancing und dynamischen Konfigurationen. Aber zuerst: Was ist ein Reverse Proxy? Ein Reverse Proxy ermöglich es auf einem Server unter einer IP-Adresse mehrere Dienste zu betrieben. Der Reverse Proxy ist dabei die Schnittstelle zwischen dem User und der Applikation und leitet den Traffic an die gewünschte Applikation weiter. Die unterschiedlichen Applikationen/Dienste werden anhand der Domain/angeforderten Webadresse des Dienstes unterschieden. In der Regel ist der Reverse Proxy auch für die Verwaltung der SSL-Zertifikate zuständig.
Der Traefik Proxy ist Open Source und wird von Traefik Labs entwickelt. Die Software wird als Docker Container betrieben und besitzt eine dynamischen sowie statische Konfiguration. In der statischen Konfiguration sind einige Grundeinstellungen von Traefik festgelegt und wird beim Start von Traefik geladen. Die dynamische Konfiguration von Traefik passt sich während dem Betrieb an. Wenn Traefik Zugriff auf den Docker Socket hat, ist es beispielsweise möglich, dass die Proxy-Konfiguration eines Dienstes automatisch aktiviert wird, sobald der Dienst gestartet wurde und sich auch wieder deaktiviert, wenn der Dienst beendet wird. Ausserdem bietet Traefik die Möglichkeit sogenannte Middlewares einzusetzen, welche es ermöglichen vor dem Zugriff auf einen Dienst eine Authentifizierung mittels HTTP Basic-Auth oder SSO zu erzwingen.
Wenn einem die eingebauten Funktionen von Traefik nicht ausreichen, gibt es ausserdem noch die Möglichkeit Plugins zu installieren, welche weitere Funktionen wie eine Web Application Firewall (WAF) oder Caching nachrüsten.
Installation
Um Traefik zu verwenden, benötigst du einen Linux Server und in unserem Fall Docker. Ich verwende im folgenden einen debianbasierten Server. Wenn Docker auf deinem Server noch nicht installiert ist, kannst du es mit folgendem Befehl installieren:
Nun können wir mit der eigentlichen Installation von Traefik fortfahren. Erstelle als erstes einen Ordner, in welcher die Konfiguration von Traefik abgelegt werden soll:
mkdir /app/
mkdir /app/traefik
Navigiere anschliessend in den erstellten Ordner
cd /app/traefik
Und erstelle hier eine Datei mit dem Namen docker-compose.yml
nano docker-compose.yml
Kopiere nun folgenden Text und füge diesen in die Datei ein: (Auf macOS mit Cmd+V
, auf Windows mit Rechtsklick auf das PowerShell Fenster oder mit Ctrl+V
)
Speichere und schliesse die Datei mit Control
+ X
auf macOS oder Ctrl
+ X
unter Windows und anschliessend Y
.
Als nächstes muss ein Ordner mit dem Namen config
erstellt werden. In diesem wird dann die statische Konfiguration von Traefik als YAML abgespeichert.
mkdir config
Erstelle und öffne nun eine zweite Datei mit dem Namen traefik.yaml
nano traefik.yaml
Füge hier folgenden Inhalt ein und ersetze you@example.com
durch deine E-Mail Adresse. Die angegebene E-Mail-Adresse wird für die Erstellung von SSL-Zertifikaten bei Let's Encrypt verwendet.
---
global:
checkNewVersion: false
sendAnonymousUsage: false
# Dashboard should be disabled in production
api:
dashboard: true
insecure: true
entryPoints:
http:
address: :80
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: :443
traefik:
address: :8080
certificatesResolvers:
staging:
acme:
email: you@example.com
storage: /etc/traefik/certs/acme.json
caServer: https://acme-staging-v02.api.letsencrypt.org/directory
httpChallenge:
entryPoint: http
production:
acme:
email: you@example.com
storage: /etc/traefik/certs/acme.json
caServer: https://acme-v02.api.letsencrypt.org/directory
httpChallenge:
entryPoint: http
providers:
docker:
exposedByDefault: false
file:
directory: /etc/traefik
watch: true
Wenn du Traefik nur für Container auf demselben Server und mit den Standardports für HTTP (80) & HTTPS (443) verwenden möchtest, kannst du die restliche Konfiguration belassen. Speichere die Datei mit Command+X
/Ctrl+X
und Y
.
Nun sind die nötigen Vorbereitungen für die Nutzung von Traefik geschaffen und Traefik kann gestartet werden. Navigieren dazu zuerst wieder in den Ordner der docker-compose.yml
-Datei.
cd /app/traefik
Anschliessend kann Traefik mit folgendem Befehl gestartet werden
docker-compsose up -d
Wenn Traefik das erste Mal gestartet wird, wird zuerst die aktuellste Version heruntergeladen was einige Minuten dauern kann. Anschliessend wird der Container gestartet.
Wenn Traefik erfolgreich gestartet wurde, kannst du im Browser unter folgender Adresse das Dashboard von Traefik sehen: http://<IP-ADRESSE-DEINES-SERVERS:8080
Eine Applikation mit Traefik bereitstellen
Um Traefik in Aktion zu sehen, zeige ich im folgenden wie ein Dienst mit Traefik als Reverse Proxy bereitgestellt werden kann. Ich werde dies anhand der Software "Homarr" durchführen. Homarr ist ein Dashboard um sich einen Überblick über seine selbst gehosteten Dienste zu verschaffen/alles an einem Ort zu sammeln.
Damit du Dienste mit HTTPS und einem SSL-Zertifikat von Let's Encrypt bereitstellen kannst, benötigst du eine Domain. Diese kannst du beispielsweise bei Cloudflare kaufen. Anschliessend musst du einen DNS-Eintrag, mit der öffentlichen IP-Adresse deines Servers, für deinen Dienst erstellen. Der DNS-Eintrag für eine Subdomain example
könnte beispielsweise so aussehen:
homarr 3600 IN A 1.1.1.1
Anschliessend kannst du auf deinem Server einen neuen Ordner für Homarr (bzw. deinen gewünschten Dienst) erstellen und in diesen navigieren.
mkdir /app/homarr && cd /app/homarr
Erstellen nun eine docker-compose.yml
-Datei für deinen Dienst oder kopiere folgenden Inhalt um Homarr bereitzustellen:
version: '3'
services:
homarr:
container_name: homarr
image: ghcr.io/ajnart/homarr:latest
restart: unless-stopped
volumes:
- ./configs:/app/data/configs
- ./icons:/app/public/icons
- ./data:/data
#ports:
# - '7575:7575'
labels:
- "traefik.enable=true"
- "traefik.http.routers.homarr.entrypoints=http, https"
- "traefik.http.routers.homarr.rule=Host(`homarr.example.com`)"
- "traefik.http.routers.homarr.tls=true"
- "traefik.http.routers.homarr.tls.certresolver=production"
- "traefik.docker.network=traefik_traefik"
networks:
- traefik_traefik
- homarr
networks:
homarr:
external: false
traefik_traefik:
external: true
Wie du siehst, hat diese docker-compose.yml
-Datei eine Liste "Labels". Mit diesen Labels, kannst du konfigurieren, wie Traefik mit diesem Container umgehen soll. Ausserdem befindet sich der Container im Netzwerk von Traefik. Dies ist notwendig, damit Traefik überhaupt auf deinen Dienst zugreifen kann. Wenn deine Applikation aus mehreren Container besteht (zB. wenn diese noch eine Datenbank hat), muss nur der Container mit dem Web-Interface der Applikation im Netzwerk von Traefik sein. Die restlichen Container sollten aus Sicherheitsgründen im Netzwerk der Applikation belassen werden.
In der folgenden Tabelle siehst du, was die einzelnen Labels machen und was du anpassen musst:
Label | Bedeutung |
---|---|
traefik.enable=true |
Hiermit wird festgelegt, ob dieser Dienst für Traefik aktiviert werden soll. |
traefik.http.routers.homarr.entrypoints=http, https |
Hier kannst du festlegen, ob dein Dienst per HTTP und/oder HTTPS erreichbar ist. |
traefik.http.routers.homarr.rule=Host(`homarr.example.com`) |
Hier kannst du den Domainnamen für deinen Dienst festlegen. Es muss ein DNS-Eintrag mit der öffentlichen IP-Adresse deines Servers vorhanden sein, damit dies funktioniert. |
traefik.http.routers.homarr.tls=true |
Hier wird festgelegt, dass dein Dienst TLS für die verschlüsselte Verbindung verwendet. Wenn du HTTPS verwenden willst, ist dies notwendig. |
traefik.http.routers.homarr.tls.certresolver=production |
Hier kannst einstellen ob für diesen Dienst ein gültiges Zertifikat von Let's Encrypt oder ein Dummy-Zertifikat verwendet werden soll. Mögliche Optionen sind staging & production |
traefik.docker.network=traefik_traefik |
Hier kannst du festlegen, in welchem Docker Netzwerk sich der Traefik Container befindet. |
traefik.http.services.homarr.loadbalancer.server.port=443 |
Dieses Label definiert, auf welchem Port sich der Dienst im Container befindet, auf welchen zugegriffen werden soll. Wenn nur ein Port vom Container freigegebn ist, kann dieses Label weggelassen werden. |
*Ersetze jeweils das "homarr" durch den Namen deines Dienstes. Dieser Wert muss pro Dienst einmalig sein, damit Traefik die Dienste voneinander trennen kann.
Um den Container das richtige Netzwerk zuzuordnen muss folgendes ganz unten in der docker-compose.yml
-Datei ergänzt werden:
networks:
<NAME DES DIENSTES>:
external: false
traefik:
name: traefik_traefik
external: true
Zudem muss bei den jeweiligen Container das Netzwerk zugeordnet werden:
networks:
- traefik_traefik
- homarr
Wenn du die Konfiguration fertig angepasst hast, kannst du mit folgendem Befehl deine Applikation starten:
docker-compose up -d
Anschliessend wird der Container erstellt und Traefik passt seine Konfiguration automatisch an, damit der Dienst erreichbar ist. Innerhalb der ersten Minuten nach dem Start des Dienstes, wird Traefik automatisch ein Zertifikat bei Let's Encrypt anfordern, für die Domain des Dienstes. Traefik verlängert das Zertifikat automatisch, bevor es abläuft. Darum musst du dich also nicht kümmern.
Im Dashboard im Browser siehst du zudem die Routen, welche Traefik automatisch konfiguriert hat. Das Dashboard im Browser kann nützlich sein, um den Fehler zu finden, wenn dein Dienst nicht wie gewünscht erreichbar ist.
Update von Traefik installieren
Von Zeit zu Zeit erscheinen Updates für Traefik, welche Verbesserungen bringen und Sicherheitslücken schliessen. Diese sollten regelmässig installiert um die Sicherheit deiner Umgebung zu gewährleisten. Da wir Docker verwenden ist es ein Kinderspiel den Container zu aktualisieren.
Verbinde dich als erstes auf den Server und navigiere in den Ordner, mit der docker-compose.yml
-Datei von Traefik.
cd /app/traefik
Lade nun die neuste Version von Traefik herunter
docker-compose pull
Starte anschliessend Traefik neu (währenddessen sind deine Dienste kurzzeitig nicht verfügbar)
docker-compose down && docker-compose up -d
Fertig, nun ist Traefik auf dem aktuellsten Stand. Die dynamische Konfiguration erstellt Traefik wieder automatisch, anhand der momentan laufenden Container.