services: traefik: image: traefik:v3.7.1 container_name: traefik restart: unless-stopped command: # Dashboard sécurisé - "--api.dashboard=true" - "--api.insecure=false" # Découverte Docker - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--providers.docker.network=web" # Config file dynamique - "--providers.file.filename=/etc/traefik/dynamic.yml" - "--providers.file.watch=true" # Entrypoints - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" # Redirection HTTP → HTTPS - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - "--entrypoints.web.http.redirections.entrypoint.scheme=https" # Let's Encrypt - "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}" - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true" - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" # Logs - "--log.level=INFO" - "--accesslog=true" ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./letsencrypt:/letsencrypt - ./dynamic.yml:/etc/traefik/dynamic.yml:ro networks: - web labels: # Dashboard accessible via traefik. - "traefik.enable=true" - "traefik.http.routers.traefik.rule=Host(`${TRAEFIK_DOMAIN}`)" - "traefik.http.routers.traefik.entrypoints=websecure" - "traefik.http.routers.traefik.tls.certresolver=letsencrypt" - "traefik.http.routers.traefik.service=api@internal" - "traefik.http.routers.traefik.middlewares=traefik-auth" # Basic auth (à remplacer par hash htpasswd réel) - "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_DASHBOARD_AUTH}" networks: web: external: true