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.