Skip to content

Déploiement de Traefik avec Docker Compose

Traefik est né avec les conteneurs, et ça se sent. Là où les reverse proxies classiques demandent une config à retoucher à chaque nouveau service, Traefik découvre vos conteneurs tout seul : vous ajoutez quelques labels à un service, il détecte, route et génère le certificat Let's Encrypt sans que vous touchiez un fichier. Dans un monde Docker qui bouge sans cesse, c'est un reverse proxy qui suit le rythme.

Le piège du acme.json : les permissions

Traefik refuse de démarrer si le fichier acme.json (qui stocke vos certificats) n'est pas en permissions 600. C'est l'erreur qui coûte le plus de temps aux débutants : chmod 600 acme.json avant de lancer, sinon vous chercherez longtemps pourquoi rien ne se passe. Et ne l'exposez jamais — il contient vos clés privées TLS.


Structure du projet

.
├── docker-compose.yml
├── certs
│   └── acme.json        # Stockage des certificats SSL Let's Encrypt
├── conf.d
│   └── <templates_services>  # Configuration des services Traefik
└── README.md

1⃣ Préparation du fichier acme.json

Ce fichier va stocker les certificats SSL générés par Let's Encrypt.

touch certs/acme.json
chmod 600 certs/acme.json

Il doit être vide au départ et sécurisé.


2⃣ Configuration du fichier docker-compose.yml

version: '3.7'

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: always
    ports:
      - "80:80"       # HTTP
      - "443:443"     # HTTPS
      - "8080:8080"   # Dashboard Traefik (interface d’administration)
    volumes:
      - ./certs/acme.json:/acme.json
      - ./conf.d:/etc/traefik/conf.d
    command:
      - "--global.sendAnonymousUsage"
      - "--log.level=INFO"
      - "--accesslog=true"
      - "--api.insecure=true"
      - "--api.dashboard=true"
      - "--providers.file.directory=/etc/traefik/conf.d/"
      - "--providers.file.watch=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.email=votre-email@example.com"
      - "--certificatesresolvers.myresolver.acme.storage=/acme.json"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"

3⃣ Exemple de configuration pour un service (conf.d/myapp.toml)

[http.routers.myapp]
  entryPoints = ["websecure"]
  rule = "Host(`monapp.votre-domaine.tld`)"
  service = "myapp"
  [http.routers.myapp.tls]
    certResolver = "myresolver"

[http.routers.myapp-redirect]
  entryPoints = ["web"]
  rule = "Host(`monapp.votre-domaine.tld`)"
  middlewares = ["redirect-to-https"]
  service = "noop"

[http.middlewares.redirect-to-https.redirectScheme]
  scheme = "https"
  permanent = true

[http.services.myapp.loadBalancer]
  [[http.services.myapp.loadBalancer.servers]]
    url = "http://<IP>:<PORT>"

[http.services.noop.loadBalancer]
  [[http.services.noop.loadBalancer.servers]]
    url = "http://127.0.0.1"

Important : Remplacez <IP> et <PORT> par l’adresse IP et le port réels de votre service.


4⃣ Démarrer Traefik avec Docker Compose

docker-compose up -d

Traefik démarre en arrière-plan et commence à gérer les certificats SSL.


5⃣ Vérification

Accédez au tableau de bord Traefik (non sécurisé par défaut) :

http://<votre-serveur>:8080

Vous pouvez y vérifier que vos services sont bien configurés et que les certificats SSL sont générés.


En résumé

Le mécanisme tient en quatre gestes : un acme.json en 600 pour les certificats, un docker-compose.yml qui active la résolution automatique, la config par service dans conf.d/, et un dashboard pour vérifier. Une fois cette base posée, l'ajout d'un nouveau service se résume à quelques labels — plus jamais de certificat à renouveler à la main, plus jamais de vhost à éditer au fil de l'eau. C'est là que Traefik prend tout son sens : il travaille pendant que vous construisez.

Sécurisez le dashboard

Le tableau de bord sur le port 8080 est ouvert par défaut. Il révèle toute votre topologie de services : ne le laissez pas accessible en clair. Placez-le derrière une authentification (middleware basic-auth) ou fermez-le une fois la mise au point terminée.