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.

Traefik als Reverse Proxy für deine Dienste verwenden
Bild: doc.traefik.io/traefik (2024)

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:

apt update && apt install docker.io docker-compose -y

Dieser Befehl aktualisiert die Paketquellen und installiert anschliessend Docker & Docker Compose

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)

version: '3'

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    command: --api.insecure=true --providers.docker
    restart: unless-stopped
    ports:
      - "80:80" # HTTP
      - "443:443" # HTTPS
      - "8080:8080" # Web UI (enabled by --api.insecure=true)
    volumes:
      - ./config:/etc/traefik # Traefik Configuration
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - traefik

networks:
  traefik:

docker-compose.yml

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.

Der Traefik Container wurde erstellt

Wenn Traefik erfolgreich gestartet wurde, kannst du im Browser unter folgender Adresse das Dashboard von Traefik sehen: http://<IP-ADRESSE-DEINES-SERVERS:8080

Dashboard von Traefik

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.

HTTP Routers im Dashboard von Traefik

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.

Hinweis: Wenn deine Dienste im Netzwerk von Traefik sind, erscheint beim Neustart von Traefik eine Warnung, dass das Netzwerk nicht entfernt werden konnte. Diese Warnung kannst du ignorieren.

Links