Avancé ⏱ 30 min de mise en œuvre Mis à jour le 11 août 2026

Traefik : le reverse proxy moderne pour vos conteneurs Docker

Plusieurs conteneurs à exposer en HTTPS sur un même VPS ? Traefik découvre vos services via les labels Docker et gère les certificats tout seul. Voici comment le déployer proprement.

Dès que plusieurs conteneurs doivent partager un même VPS, leur exposition devient un sujet à part entière. Chaque application nécessite un nom de domaine, une terminaison HTTPS, un certificat valide et un routage vers le bon port interne. Publier manuellement chaque port complique rapidement le déploiement et augmente la surface d’attaque.

Traefik v3 répond à ce problème en jouant le rôle de reverse proxy devant Docker. Il découvre les conteneurs grâce à leurs labels, crée les routes correspondantes et peut obtenir automatiquement les certificats TLS auprès de Let’s Encrypt. Contrairement à une configuration Nginx classique ou à Nginx Proxy Manager, le routage est principalement décrit avec les applications. L’ajout d’un service ne demande donc pas de modifier manuellement un fichier central.

Comment fonctionne Traefik avec Docker ?

Traefik sépare sa configuration en plusieurs concepts :

  • Les providers indiquent où rechercher la configuration dynamique. Le provider Docker observe les conteneurs et lit leurs labels.
  • Les entrypoints représentent les points d’entrée réseau. On utilise généralement web sur le port 80 et websecure sur le port 443.
  • Les routers analysent les requêtes et appliquent des règles, par exemple un nom de domaine avec Host().
  • Les services définissent la destination interne vers laquelle Traefik transmet la requête.
  • Les middlewares modifient ou filtrent les requêtes avant leur arrivée dans l’application.
  • Les certificate resolvers demandent et renouvellent les certificats TLS.

La configuration statique concerne notamment les entrypoints, les providers et le stockage ACME. Elle est chargée au démarrage de Traefik. La configuration dynamique contient les routers, services et middlewares. Avec Docker, elle provient directement des labels.

Lorsqu’un nouveau conteneur démarre, Traefik détecte ses labels et actualise sa configuration sans redémarrage. Cette approche convient particulièrement aux plateformes composées de plusieurs applications ou microservices.

Prérequis du déploiement

Il faut disposer des éléments suivants :

  • Un VPS Linux avec Docker et Docker Compose (voir installer Docker sur un VPS).
  • Un nom de domaine dont vous contrôlez la zone DNS.
  • Un enregistrement DNS de type A pour chaque sous-domaine, pointant vers l’adresse IPv4 du VPS.
  • Les ports TCP 80 et 443 ouverts dans le pare-feu.
  • Une adresse électronique utilisée pour les notifications ACME.

Le port 80 reste nécessaire lorsque le challenge HTTP de Let’s Encrypt est utilisé, même si toutes les visites sont ensuite redirigées vers HTTPS. Le challenge TLS-ALPN peut être choisi à la place, à condition que le port 443 soit directement accessible.

Pour une infrastructure hébergée en France, un VPS TalCloud permet de conserver les services et leurs données sur des serveurs français, avec un environnement RGPD, du stockage NVMe, une protection Anti-DDoS Netrix et un support humain. L’offre VPS démarre à 4,99 € par mois.

Déployer Traefik v3 avec Docker Compose

Créez d’abord un répertoire consacré à Traefik, puis un fichier vide letsencrypt/acme.json. Ce fichier doit appartenir à l’utilisateur qui lance Docker et disposer de permissions 600. Traefik y enregistrera les comptes ACME, les certificats et leurs clés privées.

La commande de préparation peut prendre cette forme :

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

Voici un fichier compose.yaml complet :

services:
  traefik:
    image: traefik:v3.3
    container_name: traefik
    restart: unless-stopped
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=admin@example.fr"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--accesslog=true"
      - "--log.level=INFO"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
    networks:
      - proxy
    security_opt:
      - no-new-privileges:true

networks:
  proxy:
    name: proxy

Remplacez admin@example.fr par une adresse valide. Le réseau proxy devient le réseau partagé entre Traefik et les applications exposées.

exposedbydefault=false est important : aucun conteneur n’est publié tant qu’il ne porte pas explicitement le label traefik.enable=true. Le dashboard reste également désactivé, car aucune option api.dashboard n’est présente.

Après vérification du fichier, le service peut être lancé avec :

docker compose up -d

Exposer un premier service avec des labels

Le service suivant utilise l’image whoami, pratique pour tester le routage. Il ne publie aucun port sur l’hôte. Traefik l’atteint directement par le réseau Docker proxy.

services:
  whoami:
    image: traefik/whoami:v1.10
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.example.fr`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls=true"
      - "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"

networks:
  proxy:
    external: true

L’enregistrement DNS whoami.example.fr doit pointer vers le VPS. Au premier accès, Traefik demande un certificat, répond au challenge ACME sur le port 80, puis sert l’application sur le port 443.

Le label loadbalancer.server.port désigne le port écouté à l’intérieur du conteneur. Il ne publie pas ce port sur Internet. Pour une application écoutant sur le port 3000, sa valeur serait simplement 3000.

Ajouter des middlewares utiles

Les middlewares peuvent être définis avec des labels et réutilisés par plusieurs routers. Voici une chaîne combinant des en-têtes de sécurité et une limitation de débit :

labels:
  - "traefik.http.middlewares.security-headers.headers.contenttypenosniff=true"
  - "traefik.http.middlewares.security-headers.headers.framedeny=true"
  - "traefik.http.middlewares.security-headers.headers.referrerpolicy=strict-origin-when-cross-origin"
  - "traefik.http.middlewares.app-rate-limit.ratelimit.average=100"
  - "traefik.http.middlewares.app-rate-limit.ratelimit.burst=50"
  - "traefik.http.middlewares.app-chain.chain.middlewares=security-headers,app-rate-limit"
  - "traefik.http.routers.whoami.middlewares=app-chain"

La redirection globale de web vers websecure est déjà configurée dans les entrypoints. Elle évite de répéter un middleware de redirection sur chaque router.

Pour protéger une interface d’administration, une authentification HTTP Basic peut être ajoutée :

labels:
  - "traefik.http.middlewares.admin-auth.basicauth.users=admin:$$2y$$05$$REMPLACER_PAR_UN_HASH_BCRYPT"
  - "traefik.http.routers.admin.middlewares=admin-auth"

Dans un fichier Compose, chaque caractère $ du hash doit être doublé. Un hash réel doit être généré avec un outil compatible bcrypt. Évitez d’inscrire un mot de passe en clair dans les labels ou dans le dépôt Git.

Sécuriser Traefik et le socket Docker

Le dashboard Traefik ne doit jamais être exposé publiquement sans authentification. Le choix le plus sûr consiste à le laisser désactivé. S’il devient nécessaire, activez-le sans mode non sécurisé, routez api@internal derrière HTTPS et appliquez au minimum une authentification forte ainsi qu’une restriction réseau.

Le socket Docker donne accès à des informations sensibles sur l’hôte. Son montage en lecture seule avec /var/run/docker.sock:/var/run/docker.sock:ro empêche les écritures directes, mais ne supprime pas tous les risques liés à l’API Docker. Limitez les utilisateurs autorisés à modifier les labels et envisagez un proxy de socket filtrant pour les environnements les plus sensibles.

Les applications placées derrière Traefik ne devraient pas déclarer ports. Utilisez expose si une documentation explicite du port interne est utile, puis connectez les conteneurs au réseau proxy. Seuls les ports 80 et 443 de Traefik doivent être accessibles publiquement au niveau du pare-feu.

Protéger les certificats et le fichier acme.json

Le fichier acme.json contient les clés privées des certificats. Ses permissions 600 doivent être contrôlées après toute restauration ou migration. Ne le placez jamais dans un dépôt Git et ne l’affichez pas dans des journaux de diagnostic.

Sauvegardez ce fichier dans un emplacement chiffré. Une restauration de acme.json permet de conserver les certificats et d’éviter des demandes répétées susceptibles d’atteindre les limites de Let’s Encrypt. La sauvegarde doit être cohérente et réalisée lorsque Traefik n’écrit pas dans le fichier.

Pour tester une nouvelle configuration ACME, utilisez d’abord l’environnement de validation de Let’s Encrypt. Une fois le routage et le DNS confirmés, retirez cette option afin d’obtenir les certificats de production.

Bonnes pratiques et supervision

Évitez le tag latest. Épinglez au minimum une version mineure, comme traefik:v3.3, puis planifiez les mises à jour après lecture des changements et test sur un environnement distinct.

Activez les logs d’accès pour observer les domaines appelés, les codes HTTP, les temps de réponse et les services ciblés. Centralisez-les si plusieurs VPS sont utilisés, tout en appliquant une politique de conservation compatible avec le RGPD. Surveillez également les erreurs ACME, les réponses 404, 502 et 504, l’expiration des certificats et la consommation de ressources du conteneur.

Enfin, conservez les labels avec les fichiers Compose des applications. Chaque service décrit ainsi son propre routage, son port interne, son certificat et ses middlewares. Cette configuration déclarative rend les déploiements reproductibles et permet à Traefik d’accompagner naturellement l’ajout de nouveaux conteneurs.