services: traefik: image: traefik:v3.4 networks: # Connect to the 'traefik_proxy' overlay network for inter-container communication across nodes - traefik_proxy ports: # Expose Traefik's entry points to the Swarm # Swarm requires the long syntax for ports. - target: 80 # Container port (Traefik web entry point) published: 80 # Host port exposed on the nodes protocol: tcp # 'host' mode binds directly to the node's IP where the task runs. # 'ingress' mode uses Swarm's Routing Mesh (load balances across nodes). # Choose based on your load balancing strategy. 'host' is often simpler if using an external LB. mode: host - target: 443 # Container port ( Traefik websecure entry point) published: 443 # Host port protocol: tcp mode: host # External EntryPoint host port - target: 8443 published: 8443 protocol: tcp mode: host volumes: # Mount the Docker socket for the Swarm provider # This MUST be run from a manager node to access the Swarm API via the socket. - /docker-shared/stacks/data/traefik/certs:/certs:ro - /docker-shared/stacks/data/traefik/dynamic:/dynamic:ro - /docker-shared/stacks/data/traefik/logs:/logs/ - /var/run/docker.sock:/var/run/docker.sock:ro # Swarm API socket # Traefik Static configuration via command-line arguments command: # HTTP EntryPoint - "--entrypoints.web.address=:80" # External EntryPoint - "--entrypoints.external.address=:8443" - "--entrypoints.external.http.tls=true" # Configure HTTP to HTTPS Redirection - "--entrypoints.web.http.redirections.entrypoint.to=websecure" - "--entrypoints.web.http.redirections.entrypoint.scheme=https" - "--entrypoints.web.http.redirections.entrypoint.permanent=true" # HTTPS EntryPoint - "--entrypoints.websecure.address=:443" - "--entrypoints.websecure.http.tls=true" # Attach dynamic TLS file - "--providers.file.filename=/dynamic/tls.yaml" # Providers # Enable the Docker Swarm provider (instead of Docker provider) - "--providers.swarm.endpoint=unix:///var/run/docker.sock" # Watch for Swarm service changes (requires socket access) - "--providers.swarm.watch=true" # Recommended: Don't expose services by default; require explicit labels - "--providers.swarm.exposedbydefault=false" # Specify the default network for Traefik to connect to services - "--providers.swarm.network=traefik_traefik_proxy" # API & Dashboard # - "--api=true" # Enable API # - "--api" # - "--api.insecure=true" # Enale API - "--api.dashboard=true" # Enable the dashboard - "--api.insecure=false" # Explicitly disable insecure API mod # Observability - "--log.level=DEBUG" # Set the Log Level e.g INFO, DEBUG - "--accesslog=true" # Enable Access Logs - "--metrics.prometheus=true" # Enable Prometheus deploy: mode: replicated replicas: 1 placement: # Placement constraints restrict where Traefik tasks can run. # Running on manager nodes is common for accessing the Swarm API via the socket. constraints: - node.role == manager # Traefik Dynamic configuration via labels # In Swarm, labels on the service definition configure Traefik routing for that service. labels: - "traefik.enable=true" # Dashboard router - "traefik.http.routers.dashboard.rule=Host(`traefik.lan.xbazzi.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))" - "traefik.http.routers.dashboard.entrypoints=websecure" # - "traefik.http.routers.dashboard.entrypoints=web" - "traefik.http.routers.dashboard.service=api@internal" - "traefik.http.routers.dashboard.tls=true" # - "traefik.http.routers.dashboard.tls=false" # Basic‑auth middleware - "traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$E5TT9jjy$$FWtnebebWTH/fiL.oz3jg1" - "traefik.http.routers.dashboard.middlewares=dashboard-auth@swarm" # Service hint - "traefik.http.services.traefik.loadbalancer.server.port=8080" # Deploy the Whoami application whoami: image: traefik/whoami networks: - traefik_proxy deploy: labels: # Enable Service discovery for Traefik - "traefik.enable=true" # Define the WHoami router rule - "traefik.http.routers.whoami.rule=Host(`whoami.lan.xbazzi.com`)" # Expose Whoami on the HTTPS entrypoint - "traefik.http.routers.whoami.entrypoints=websecure" # - "traefik.http.routers.whoami.entrypoints=web" # Enable TLS - "traefik.http.routers.whoami.tls=true" # - "traefik.http.routers.whoami.tls=false" # Expose the whoami port number to Traefik - "traefik.http.services.whoami.loadbalancer.server.port=80" placement: constraints: - node.role != manager # Define the overlay network for Swarm networks: traefik_proxy: driver: overlay attachable: true