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