Worum geht es in diesem Artikel?

Traefik ist ein Open Source, Cloud-native Reverse Proxy. Als solche stellt sie eine Alternative zu den etablierten Reverse Proxies NGINX und Apache dar. Der große Vorteil von Traefik ist, dass die Einbindung eines zusätzlichen Services nicht über die Konfiguration des Reverse Proxies erfolgt, sonder dynamisch im docker-compose.yaml des Services definiert wird.

Voraussetzungen

Grundlagen

Es gibt eine sehr gute englische Dokumentation. Man muss sich aber etwas Zeit nehmen um sich in ein paar Konzepte von Traefik einzulesen und die weitere Konfiguration zu verstehen. Wichtig ist auch, dass man zwischen Traefik V1 und Traefik V2 unterscheiden muss, da sich die Konfiguration grundlegend unterscheidet! In diesem Artikel und allen anderen Artikeln auf dieser Seite wir ausschliesslich V2 verwendet.

In diesem Artikel wird eine Traefik Instanz installiert. Diese Instanz hat zwei Entrypoints:

Der Certificate Resolver erzeugt automatisch für neue Services Let’s Encrypt Zertifikate und aktualisiert sie bei Bedarf … coole Sache!

Beispielhaft werden wir in diesem Artikel auch ein Middleware konfigurieren, die HSTS konfigurieren. Dieses Middlewares können von den Services (Docker Container) genutzt werden.

Server Container vorbereiten und konfigurieren

Nun erzeugen wir uns ein neues Verzeichnis traefik_2 und erstellen darin ein docker-compose.yml …

version: '3'

services:
  traefik:
    image: traefik:latest
    ports:
      - 80:80
      - 443:443
      - 8080:8080
    networks:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
      - ./dynamic_conf:/dynamic_conf
      - ./acme.json:/acme.json
    container_name: traefik

networks:
  web:
    external: true

Im docker-compose file werden 4 Dateien eingebunden (Volumes).

Es muss auch ein Netzwerk mit dem Namen “web” (Beispiel) generiert - docker network create web. Alle Services die auf diesen Container zugreifen müssen sich entsprechend ebenfalls an dieses Netzwerk hängen.

traefik.toml

In der Datei traefik.toml wird die statische Konfiguration vorgenommen. Änderungen dieser Parameter erfordern einen Neustart von Traefik.

[entryPoints]
  [entryPoints.http]
    address = ":80"
  [entryPoints.http.http]
    [entryPoints.http.http.redirections]
      [entryPoints.http.http.redirections.entryPoint]
        to = "https"
        scheme = "https"

  [entryPoints.https]
    address = ":443"

[providers]
  providersThrottleDuration = "2s"
  [providers.docker]
    watch = true
    endpoint = "unix:///var/run/docker.sock"
    swarmModeRefreshSeconds = "15s"
    exposedByDefault=false
  [providers.file]
    directory = "dynamic_conf"
    watch = true

[certificatesResolvers]
  [certificatesResolvers.letsencrypt.acme]
    email = "<E-Mail>"
    storage = "acme.json"
    [certificatesResolvers.letsencrypt.acme.httpChallenge]
      entryPoint = "http"

In der Datei werden die beiden entryPoints definiert (diese Ports müssen im Docker-compose file entsprechend an den Host exportiert werden. Für den http entryPoint wird eine Weiterleitung auf HTTPS festgelegt.

Unter Providers wird festgelegt, dass die dynamische Konfiguration über Docker und die Dateien im Unterverzeichnis dynamic_conf festgelegt wird.

dynamic_conf/conf.toml

Die Router, Services und Middleware werden als dynamisch Konfiguration festgelegt. Für Docker erfolgt dies in den docker-compose Dateien. Alternative kann die dynamische Knfiguration auch über Dateien erfolgen. Hier ein Beispiel für die Definition einer Middleware:

[http.middlewares]
  [http.middlewares.secureHeaders.headers]
    stsSeconds = 31536000
    stsIncludeSubdomains = true
    browserXssFilter = true
    contentTypeNosniff = true
    referrerPolicy = "no-referrer"   

Verifikation

Nun dieses Setup mit docker_compose up starten und im Webbrowser (Port 8080) die Konfiguration am Dashboard verifizieren.