docker traefik ssl tutorial
Traefik als Reverse Proxy
Traefik ist mein Go-To Reverse Proxy für Docker. Einmal aufsetzen, nie wieder SSL manuell konfigurieren.
Warum Traefik?
- Auto-Discovery: Findet Container automatisch via Docker Labels
- Auto-SSL: Let's Encrypt Zertifikate automatisch
- Zero Downtime: Hot-Reload bei Container-Änderungen
- Dashboard: Übersicht über alle Routes
Basis-Setup
Verzeichnis-Struktur
traefik/
├── docker-compose.yml
├── traefik.yml
├── .env
└── data/
├── acme.json
└── .gitkeep
docker-compose.yml
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=${TRAEFIK_AUTH}"
networks:
proxy:
external: true
traefik.yml
api:
dashboard: true
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: proxy
certificatesResolvers:
letsencrypt:
acme:
email: dein@email.de
storage: acme.json
httpChallenge:
entryPoint: http
Setup
# Netzwerk erstellen
docker network create proxy
# acme.json mit richtigen Rechten
touch data/acme.json
chmod 600 data/acme.json
# Basic Auth Password generieren
htpasswd -nb admin sicheres-passwort
# Output in .env als TRAEFIK_AUTH
# Starten
docker compose up -d
Container anbinden
Jetzt das Beste: Andere Container brauchen nur Labels!
Beispiel: Web-App
services:
app:
image: myapp
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.entrypoints=https"
- "traefik.http.routers.myapp.rule=Host(`app.example.com`)"
- "traefik.http.routers.myapp.tls=true"
- "traefik.http.routers.myapp.tls.certresolver=letsencrypt"
- "traefik.http.services.myapp.loadbalancer.server.port=3000"
networks:
proxy:
external: true
Das war's. App ist unter https://app.example.com erreichbar. SSL automatisch.
Wildcards & Subdomains
Für alle Subdomains:
labels:
- "traefik.http.routers.app.rule=Host(`app.example.com`) || Host(`www.app.example.com`)"
Middlewares
Redirect www zu non-www
labels:
- "traefik.http.middlewares.redirect-www.redirectregex.regex=^https://www\\.(.+)"
- "traefik.http.middlewares.redirect-www.redirectregex.replacement=https://$${1}"
- "traefik.http.routers.app.middlewares=redirect-www"
Rate Limiting
labels:
- "traefik.http.middlewares.rate-limit.ratelimit.average=100"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=50"
- "traefik.http.routers.app.middlewares=rate-limit"
Headers
labels:
- "traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000"
- "traefik.http.middlewares.secure-headers.headers.stsIncludeSubdomains=true"
Dashboard
Nach dem Setup erreichbar unter https://traefik.example.com (mit Basic Auth).
Zeigt:
- Alle Routers
- Alle Services
- Alle Middlewares
- Zertifikat-Status
Debugging
# Logs
docker logs traefik -f
# Config testen
docker exec traefik traefik healthcheck
Tipps
exposedByDefault: false- Nur Container mittraefik.enable=true- Externes Netzwerk - Alle Apps müssen im
proxyNetzwerk sein - acme.json Rechte - Muss 600 sein, sonst Fehler
- DNS zuerst - Domain muss auf Server zeigen bevor SSL klappt
Fazit
Traefik + Docker = Magie. Einmal konfiguriert, funktioniert SSL für immer automatisch.