Proxy inverse Traefik pour services Docker : configuration de production pragmatique

Quand plusieurs services Docker tournent sur un même hôte, la gestion des ports devient vite complexe. Traefik résout ce problème en jouant le rôle de proxy inverse dynamique : il découvre les conteneurs via labels et met à jour le routage automatiquement.

Ce guide propose une base solide pour la production, avec TLS automatique, routage propre par domaine et stratégie sécurisée pour le dashboard.

Vue d’ensemble de l’architecture

Une architecture classique comprend :

  • Un point d’entrée externe sur 80/443
  • Un réseau Docker interne partagé entre Traefik et les applications
  • Des labels par service pour hostnames, middlewares et ports internes
  • Un resolver ACME pour HTTPS automatique

Traefik écoute les événements Docker et adapte les routes sans rechargement manuel, ce qui réduit fortement l’effort opérationnel.

1) Créer le réseau partagé

docker network create edge

Utilisez ce réseau pour Traefik et tous les conteneurs à publier.

2) Déployer Traefik avec Docker Compose

Exemple docker-compose.yml :

services:
  traefik:
    image: traefik:v3.1
    container_name: traefik
    restart: unless-stopped
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.email=admin@example.com
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
      - --api.dashboard=true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - edge

networks:
  edge:
    external: true

Créez le fichier ACME avec des permissions strictes :

mkdir -p letsencrypt
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json

3) Router une application via labels

Exemple de service applicatif :

services:
  app:
    image: ghcr.io/example/myapp:latest
    restart: unless-stopped
    networks:
      - edge
    labels:
      - traefik.enable=true
      - traefik.http.routers.myapp.rule=Host(`app.example.com`)
      - traefik.http.routers.myapp.entrypoints=websecure
      - traefik.http.routers.myapp.tls.certresolver=letsencrypt
      - traefik.http.services.myapp.loadbalancer.server.port=8080

Le DNS de app.example.com doit pointer vers l’IP publique de votre serveur.

4) Sécuriser les endpoints d’exploitation

N’exposez jamais le dashboard sans authentification. Si nécessaire, protégez-le :

labels:
  - traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$...
  - traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
  - traefik.http.routers.traefik.service=api@internal
  - traefik.http.routers.traefik.entrypoints=websecure
  - traefik.http.routers.traefik.tls.certresolver=letsencrypt
  - traefik.http.routers.traefik.middlewares=admin-auth

5) Durcissement production

  • Gardez exposedByDefault=false
  • Socket Docker en lecture seule
  • Règles pare-feu minimales
  • Limitation de débit sur endpoints publics
  • Headers de sécurité (HSTS, anti-sniff, etc.)

Exemple middleware headers :

- traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000
- traefik.http.middlewares.secure-headers.headers.browserXssFilter=true
- traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true

Attachez ces middlewares à chaque router exposé.

Checklist de validation

docker ps
docker logs traefik --tail=100
curl -I https://app.example.com

Résultat attendu :

  • Certificat valide émis
  • Réponse HTTP/2 200 (ou code attendu)
  • Aucun avertissement TLS dans le navigateur

Conclusion

Traefik est un excellent choix pour des environnements Docker où les services évoluent souvent. Avec le routage par labels et TLS automatique, vous réduisez la configuration manuelle et gagnez en fiabilité.

Les gains majeurs viennent d’une segmentation réseau propre, d’un dashboard correctement protégé et de middlewares explicites par application.