Ce fichier docker-compose.yml modélise la façon dont je configure et déploie mes services web derrière le reverse-proxy Traefik avec gestion automatique des certificats SSL Let's Encrypt.

version: "3.8"

services:
  traefik:
    image: traefik:v3.0
    container_name: global-reverse-proxy
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
      - "--certificatesresolvers.myresolver.acme.email=mon_email@exemple.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
    networks:
      - web-network

  mon-app-web:
    image: php:8.3-apache
    container_name: portfolio-app
    restart: unless-stopped
    volumes:
      - ./www:/var/www/html
    networks:
      - web-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.myportfolio.rule=Host(`cv.fredt.eu`)"
      - "traefik.http.routers.myportfolio.entrypoints=websecure"
      - "traefik.http.routers.myportfolio.tls.certresolver=myresolver"
      - "traefik.http.services.myportfolio.loadbalancer.server.port=80"

networks:
  web-network:
    external: true

Note d'expert : L'accès au socket Docker (docker.sock) par le conteneur Traefik est défini en lecture seule (:ro) pour des raisons évidentes de sécurité. Le reverse proxy n'a pas à interagir de manière active avec l'API Docker.