traefik

Traefik habe ich als Reverse Proxy lieben und schätzen gelernt. Ich betreibe inzwischen mehrere Traefik Instanzen. Traefik ist super gut konfigurierbar und erneuert stabil seit Jahren meine SSL Zertifikate.

Traefik kann man auf verschiedene Arten konfigurieren. So unterstütz Traefik es, die Labels aus Docker Containern zu nutzen. Ihr könnt dann die Konfiguration von Routen dann über die Labels direkt in einer docker-compose.yml steuern. Traefik übernimmt dann die Route, sofern diese im gleichen Netz sind.

Zuhause habe ich Traefik über Docker in einem LXC Container laufen der. Der LXC Container hat eine fixe IP in meinem Server-Netzwerk. Dort bevorzuge ich eine fixe Konfiguration über Dateien.

Konfiguration

Ich nutze als Domain Hoster INWX. Damit Wildcard Zertifikate funktionieren habe ich in der referenzierten traefik.env Datei die folgende Variablen eingetragen:

INWX_USERNAME=xxxxxxxxxxx
INWX_PASSWORD=xxxxxxxxxxx
INWX_SHARED_SECRET=xxxxxxxxxxx

Wenn ihr auch INWX nutzt, dann ersetzt die maskierten Werte einfach durch eure.

Interessant ist noch die Provider Konfiguration. Diese habe ich so eingestellt, dass ich einfach weitere Konfigurationsdateien anlegen kann die Traefik dann aus einem Unterverzeichnis laden kann.
Das watch: true sorgt dafür, dass Traefik Änderungen in den Dateien erkennt und diese direkt lädt. Damit muss ich den Traefik Server nicht durchstarten, wenn mal eine Änderung vorgenommen wird.

Hier ist meine Grund-Konfiguration:

api:
  insecure: true
  dashboard: true
  debug: true

certificatesResolvers:
  letsencrypt:
    acme:
      caServer: "https://acme-v02.api.letsencrypt.org/directory"
      email: "christian@muench-worms.de"
      storage: "/letsencrypt/acme.json"
      httpChallenge:
        entrypoint: "http"
      dnsChallenge:
        provider: "inwx"

log:
  level: "INFO"

metrics:
  prometheus:
    entryPoint: "traefik"

providers:
  file:
    directory: "/etc/traefik/configurations"
    watch: true

ping:
  entryPoint: "http"

Im Unterverzeichnis für die Konfigurationen liegen bei mir diese Dateien:

  • middlewares.yml
  • router.yml
  • services.yml
  • tcp.yml
  • tls.yml

Ich habe die Route, Middlewares und Services in einzelnen Dateien ausgelagert.
Ein Request wird in der Regel immer in folgender Reihenfolge verarbeitet:

Entrypoint -> Router -> Middleware -> Service

Router

http:

  # ----------------------------------
  # Router
  # ----------------------------------

  routers:

    # ----------------------------------
    # Routes: muench.dev
    # ----------------------------------

    archivebox:
      rule: "Host(`archivebox.muench.dev`)"
      entryPoints:
        - http
        - https
      middlewares:
        - https_redirect
      service: archivebox
      tls:
        certResolver: letsencrypt
        
    # .... weitere Routen

Middleware

http:
  # ----------------------------------
  # Middlewares
  # ----------------------------------

  middlewares:
  
    https_redirect:
      redirectscheme:
         scheme: https
         permanent: true
         
   # .... weitere Middlewares

Services

hier ist ein Beispiel für eine Service Konfiguration:

http:
  # ----------------------------------
  # Services
  # ----------------------------------
  services:

    archivebox:
      loadBalancer:
        servers:
          - url: "http://archivebox.muench.lan"
          
    # .... weitere Services

Docker Composer

Das ist meine docker-compose.yml

services:
  traefik:
    container_name: traefik
    
    # hier im Bedarfsfall eine neuere Traefik version einsetzen
    image: traefik:3.3.1
    
    restart: always
    env_file:
      - traefik.env
    ports:
      # The HTTP ports
      - "80:80"
      - "443:443"
      # The Web UI (enabled by --api)
      - "8080:8080"
      # Home Assistant
      - "8123:8123"
      # imaps
      - "993:993"
      # git ssh
      - "22222:22222"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      #- "/var/log/crowdsec/traefik/:/var/log/traefik/"
      - "./volumes/letsencrypt:/letsencrypt"
      - "./etc:/etc/traefik"
      - "./volumes/certs:/certs"
    cap_add:
      - NET_ADMIN