Traefik : Retour sur mes premiers pas
Si Ansible m’a aidé à déclarer l’état souhaité de mes machines, il me fallait encore un moyen simple et automatique de router le trafic HTTP/HTTPS vers mes différents services (Docker, VMs, bare-metal). Après plusieurs recommandations, j’ai plongé dans Traefik, un reverse-proxy / ingress controller écrit en Go.
Pourquoi j’ai choisi Traefik ?
- Configuration dynamique : Traefik interroge en continu vos providers (Docker, Kubernetes, fichiers…) et met à jour les routes à la volée — fini le
nginx -s reload
dès qu’un conteneur apparaît. - Let’s Encrypt intégré : génération + renouvellement des certificats sans script maison.
- Tableau de bord clair : on visualise routes, middlewares et points d’entrée en temps réel.
- Support natif de Docker/K8s : trois labels suffisent pour exposer un service.
Mes premières découvertes
- Installation express
docker network create traefik
docker compose -f traefik.yml up -d
Statique vs dynamique Statique : ports, providers, ACME. Dynamique : règles de routage, middlewares, certificats — modifiables sans redémarrage.
Labels Docker Exemple minimal :
labels: - "traefik.enable=true" - "traefik.http.routers.blog.rule=Host(`blog.example.com`)" - "traefik.http.services.blog.loadbalancer.server.port=3000"
Let’s Encrypt en 30 s Un
certresolver=le
dans les labels + une adresse mail → Traefik s’occupe du reste.Middlewares Redirection HTTPS, headers de sécurité, auth basique… déclarables via YAML ou un label.
Exemple complet : Traefik + Vaultwarden en HTTPS
1. Stack Traefik (traefik.yml
)
services:
traefik:
image: traefik:v3.0
restart: unless-stopped
command:
- '--providers.docker=true'
- '--providers.docker.exposedByDefault=false'
- '--entrypoints.web.address=:80'
- '--entrypoints.websecure.address=:443'
- '[email protected]'
- '--certificatesresolvers.le.acme.storage=/certs/acme.json'
- '--certificatesresolvers.le.acme.tlschallenge=true'
- '--api.dashboard=true'
ports:
- '80:80'
- '443:443'
volumes:
- '/var/run/docker.sock:/var/run/docker.sock:ro'
- './certs:/certs'
networks:
- traefik
networks:
traefik:
external: true
2. Service exposé : Vaultwarden (vaultwarden.yml
)
version: '3.9'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
WEBSOCKET_ENABLED: "true"
DOMAIN: "https://vault.example.com"
SMTP_HOST: "smtp.example.net"
SMTP_FROM: "[email protected]"
SMTP_PORT: "587"
SMTP_SECURITY: "starttls"
SMTP_USERNAME: "smtp-user"
SMTP_PASSWORD: "smtp-pass"
volumes:
- ./bw-data:/data
networks:
- traefik
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.vault.rule=Host(`vault.example.com`)'
- 'traefik.http.routers.vault.entrypoints=websecure'
- 'traefik.http.routers.vault.tls.certresolver=le'
- 'traefik.http.services.vault.loadbalancer.server.port=80'
- 'traefik.http.routers.vault.middlewares=vault-redirect'
- 'traefik.http.middlewares.vault-redirect.redirectscheme.scheme=https'
networks:
traefik:
external: true
Ce que j’aime le plus
- Zéro redémarrage : ajouter/modifier un service n’interrompt aucune connexion.
- Dashboard temps réel : debug ultra-simple, on voit immédiatement les règles actives.
- Certificats auto-gérés : adieu les cron de renouvellement Let’s Encrypt.
Ce qui m’a (un peu) déplu
Friction | Détail |
---|---|
Labels verbeux | Un service complexe → 10-15 labels ; ça pique les yeux. |
Hiérarchie K8s | Entrypoint → Router → Middleware → Service : il faut l’assimiler. |
Priorités multi-provider | Docker + K8s + File : attention aux conflits de règles. |
Pistes à explorer
- Plugins Traefik : middlewares custom (rate-limit, OAuth…)
- ForwardAuth + Keycloak : SSO pour les apps auto-hébergées
- Monitoring Prometheus : metrics détaillées
- Redondance : test en swarm ou cluster K8s
Conclusion : débuts très prometteurs
Traefik a remplacé mes configs Nginx artisanales. Il offre aujourd’hui :
✅ Un reverse-proxy auto-découvrant ✅ Des certificats SSL auto-renouvelés ✅ Un dashboard simple à lire
Prochaine étape : auth centralisée et plugins communautaires !
Traefik s’impose comme un compagnon incontournable dans mon stack DevOps 2025.