1. Qu'est-ce que Traefik ? #
Un edge router dynamique.
Principe #
Traefik est un reverse proxy et load balancer HTTP/TCP conçu pour les environnements dynamiques (Docker, Kubernetes, Swarm, Consul). Sa particularité : il découvre automatiquement les services via des providers et se reconfigure à chaud, sans rechargement, à partir des labels des conteneurs ou des CRD Kubernetes. Il gère aussi les certificats Let's Encrypt automatiquement.
| Concept | Rôle |
|---|---|
| Entrypoint | Port d'écoute (web :80, websecure :443) |
| Router | Associe une requête à un service selon des règles (Host, Path, Headers) |
| Middleware | Modifie la requête (auth, redirection, compression, rate limit) |
| Service | Définit comment répartir vers les serveurs (load balancing) |
| Provider | Source de configuration dynamique (Docker, Kubernetes, fichiers) |
2. Configuration statique et dynamique #
Deux niveaux.
Les fichiers #
# traefik.yml : configuration STATIQUE (démarrage)
api: { dashboard: true }
entryPoints:
web: { address: ":80", http: { redirections: { entryPoint: { to: websecure, scheme: https } } } }
websecure: { address: ":443" }
providers:
docker: { exposedByDefault: false }
file: { directory: /etc/traefik/dynamic, watch: true }
certificatesResolvers:
letsencrypt:
acme:
email: admin@exemple.fr
storage: /letsencrypt/acme.json
httpChallenge: { entryPoint: web }
log: { level: INFO }
accessLog: {}# dynamic/middlewares.yml : configuration DYNAMIQUE (rechargée à chaud)
http:
middlewares:
securite:
headers: { stsSeconds: 31536000, contentTypeNosniff: true, frameDeny: true }
limite:
rateLimit: { average: 100, burst: 50 }3. Premier déploiement avec Docker Compose #
Traefik et une application.
compose.yaml #
services:
traefik:
image: traefik:v3.1
command: ["--configFile=/etc/traefik/traefik.yml"]
ports: ["80:80", "443:443"]
volumes:
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./dynamic:/etc/traefik/dynamic:ro
- ./letsencrypt:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
labels:
- traefik.enable=true
- traefik.http.routers.dash.rule=Host(`traefik.exemple.fr`)
- traefik.http.routers.dash.service=api@internal
- traefik.http.routers.dash.entrypoints=websecure
- traefik.http.routers.dash.tls.certresolver=letsencrypt
- traefik.http.routers.dash.middlewares=auth
whoami:
image: traefik/whoami
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`app.exemple.fr`)
- traefik.http.routers.whoami.entrypoints=websecure
- traefik.http.routers.whoami.tls.certresolver=letsencrypt
- traefik.http.routers.whoami.middlewares=securite@file,limite@file
- traefik.http.services.whoami.loadbalancer.server.port=80Erreur Courante : Monterdocker.sockdonne à Traefik un accès quasi-root à l'hôte. Utilisez un proxy de socket en lecture seule (tecnativa/docker-socket-proxy) et protégez le dashboard par authentification.
Tester #
docker compose up -d
curl -H 'Host: app.exemple.fr' http://localhost/ -L -k # redirection puis réponse de whoami
docker compose logs traefik | grep -i -E "error|certificate"
curl -s http://localhost:8080/api/http/routers | jq '.[].name' # API (si l'entrypoint traefik est exposé)
traefik versionBonne Pratique : Activez les métriques Prometheus (metrics.prometheus) et l'access log JSON dès le départ : ce sont vos meilleurs outils de diagnostic.