Si vous gérez plusieurs services web sur un seul serveur, tôt ou tard vous devez résoudre le problème du reverse proxy. Après avoir essayé plusieurs solutions, je suis passé à Traefik comme reverse proxy intégré à Docker et c’est l’une des meilleures décisions d’infrastructure que j’aie prises ces dernières années. Dans cet article, je vous raconte mon expérience concrète, en partant de la configuration que j’utilise en production sur ce même serveur.
Qu’est-ce que Traefik et pourquoi le choisir comme reverse proxy pour Docker
Traefik est un reverse proxy et load balancer moderne, conçu nativement pour les environnements conteneurisés. Contrairement à Nginx ou Apache configurés manuellement, Traefik s’intègre directement avec Docker et met à jour sa configuration automatiquement chaque fois qu’un conteneur est démarré ou arrêté.
Les principaux avantages qui m’ont convaincu :
- Configuration zéro-touch : il suffit d’ajouter des labels au conteneur Docker, pas de fichiers de configuration séparés à modifier
- SSL automatique avec Let’s Encrypt : les certificats sont générés et renouvelés sans intervention manuelle
- Dashboard web intégré pour surveiller les routeurs, services et middlewares
- Support natif pour Docker, Kubernetes, Consul et d’autres providers
- Middlewares puissants : redirections, authentification basic/OAuth, rate limiting, compression et bien plus
Mon architecture avec Traefik et Docker
Mon serveur fait tourner une infrastructure composée de plusieurs services, tous orchestrés via Docker Compose et connectés sur le même réseau bridge interne dédié. Traefik est le seul conteneur exposant des ports vers l’extérieur et sert de point d’entrée unique pour tout le trafic.
Les services actifs sont :
- Traefik — le reverse proxy, exposé sur les ports 80 et 443
- WordPress (ce blog) — accessible sur
rogue1.itetwww.rogue1.it - Divers services internes — chacun sur son propre sous-domaine, non exposé directement
- Bases de données — non exposées à l’extérieur, accessibles uniquement via le réseau interne
Aucun conteneur sauf Traefik n’a de ports mappés sur l’hôte : tout le trafic passe obligatoirement par le reverse proxy. Cela simplifie énormément la gestion de la sécurité.
Configuration de Traefik avec Docker Compose
Voici la structure du docker-compose.yml relative à Traefik, avec les points les plus importants commentés. Les domaines dans les blocs de code sont remplacés par example.com à titre d’exemple.
Entrypoints : les ports d’écoute
Les entrypoints définissent sur quels ports Traefik reste en écoute. Une configuration typique prévoit au moins HTTP et HTTPS :
command:
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
Traefik supporte également des entrypoints TCP génériques, utiles pour gérer d’autres protocoles (mail, fédération, etc.) en maintenant un seul point d’entrée pour tout le trafic du serveur.
Provider Docker : la magie de l’auto-découverte
Le paramètre --providers.docker=true active le provider Docker : Traefik se connecte au socket Docker en lecture seule et surveille en temps réel les conteneurs actifs. Lorsqu’un conteneur est démarré avec le label traefik.enable=true, Traefik l’enregistre automatiquement comme service.
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
Monter le socket en mode lecture seule (:ro) est une bonne pratique de sécurité : Traefik lit l’état des conteneurs mais ne peut pas les modifier.
SSL automatique avec Let’s Encrypt
C’est probablement la fonctionnalité la plus appréciée de Traefik : le renouvellement automatique des certificats SSL via Let’s Encrypt. La configuration est minimale :
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=vous@email.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
J’utilise le HTTP challenge (http-01) : Let’s Encrypt vérifie la propriété du domaine en effectuant une requête HTTP sur le port 80. Les certificats sont sauvegardés dans le fichier acme.json sur un volume persistant et renouvelés automatiquement avant expiration.
Routage avec les Labels Docker
Le cœur de la configuration de chaque service se trouve dans les labels Docker. Au lieu d’un fichier de configuration centralisé, chaque conteneur déclare ses propres règles de routage. Voici un exemple complet :
labels:
- "traefik.enable=true"
# Router HTTP : redirige vers HTTPS
- "traefik.http.routers.myapp-http.rule=Host(`example.com`) || Host(`www.example.com`)"
- "traefik.http.routers.myapp-http.entrypoints=web"
- "traefik.http.routers.myapp-http.middlewares=myapp-https-redirect"
- "traefik.http.middlewares.myapp-https-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.myapp-https-redirect.redirectscheme.permanent=true"
# Router HTTPS : trafic réel
- "traefik.http.routers.myapp.rule=Host(`example.com`) || Host(`www.example.com`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls=true"
- "traefik.http.routers.myapp.tls.certresolver=letsencrypt"
- "traefik.http.services.myapp.loadbalancer.server.port=80"
Le pattern de redirection HTTP → HTTPS
Un pattern que je répète pour chaque service est le double routeur : un pour HTTP (port 80) qui redirige en permanence vers HTTPS, et un pour HTTPS (port 443) qui gère le trafic réel avec TLS. Le middleware redirectscheme gère la redirection 301, également correcte pour le SEO.
Le Dashboard Traefik
Traefik inclut un très utile dashboard web pour la surveillance. La bonne pratique est de l’exposer sur un sous-domaine dédié accessible uniquement via HTTPS, avec authentification basic obligatoire :
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "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=VOTREUSER:HASH_BCRYPT"
Le service spécial api@internal est le dashboard lui-même. Le middleware basicauth protège l’accès avec un mot de passe haché en bcrypt — jamais en clair. Générez le hash bcrypt avec htpasswd -nB username. Important : dans docker-compose, les symboles $ doivent être échappés en $$.
Avantages et inconvénients après des mois en production
Avantages
- Ajouter un nouveau service ne nécessite que des labels dans docker-compose, sans autre configuration
- Les certificats SSL n’ont jamais expiré, le renouvellement est complètement automatique
- Le dashboard rend l’état de toute l’infrastructure immédiatement visible
- Les logs Traefik sont très détaillés et simplifient le débogage
- Communauté active et excellente documentation
Inconvénients
- La syntaxe des labels peut devenir verbeuse pour des configurations complexes
- Le débogage des middlewares nécessite un peu de pratique initiale
- L’échappement de
$dans les labels docker-compose (qui deviennent$$) est une source d’erreurs fréquente - Les configurations très personnalisées nécessitent des fichiers de configuration statique supplémentaires
Conclusions
Utiliser Traefik comme reverse proxy intégré à Docker a énormément simplifié la gestion de mon infrastructure. L’approche configuration-as-code via les labels Docker, la gestion automatique du SSL, et le dashboard de surveillance en font le choix idéal pour quiconque gère plusieurs services conteneurisés sur un seul serveur.
Si vous utilisez encore Nginx ou Apache avec des configurations manuelles dans un environnement Docker, je vous recommande d’évaluer une migration vers Traefik : le temps investi dans la courbe d’apprentissage initiale se rentabilise rapidement grâce à la simplicité de la gestion quotidienne.
Des questions sur la configuration ou vous voulez partager votre expérience avec Traefik ? Laissez un commentaire ci-dessous !








