Add reference Traefik stack config for replication
ci/woodpecker/push/woodpecker Pipeline was successful
Details
ci/woodpecker/push/woodpecker Pipeline was successful
Details
Stripped-down, generic version of the Traefik Swarm setup that the tunnel-server depends on for dynamic label-based routing. Sanitized of infrastructure-specific details so others can replicate the setup. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
fd31e40285
commit
58092e24c8
|
|
@ -0,0 +1,84 @@
|
|||
# Reference Traefik stack configuration for Docker Swarm.
|
||||
# This is NOT deployed by this project — it documents the Traefik setup
|
||||
# that the tunnel-server depends on for dynamic routing via Swarm labels.
|
||||
#
|
||||
# Key requirements:
|
||||
# - Docker Swarm provider enabled (--providers.docker.swarmMode=true)
|
||||
# - Exposed by default OFF (--providers.docker.exposedbydefault=false)
|
||||
# - A shared overlay network (e.g. "traefik")
|
||||
# - An ACME cert resolver for automatic TLS
|
||||
# - NO file providers — all routing is done via Docker service labels
|
||||
#
|
||||
# Deploy: docker stack deploy -c traefik-reference.yml traefik
|
||||
|
||||
networks:
|
||||
traefik:
|
||||
external: true
|
||||
|
||||
services:
|
||||
traefik-http:
|
||||
image: traefik:v2
|
||||
command:
|
||||
- --providers.docker.endpoint=unix:///var/run/docker.sock
|
||||
- --providers.docker.swarmMode=true
|
||||
- --providers.docker.exposedbydefault=false
|
||||
- --providers.docker.network=traefik
|
||||
- --serverstransport.insecureskipverify=true
|
||||
- --log.level=ERROR
|
||||
- --global.checknewversion=false
|
||||
- --global.sendanonymoususage=false
|
||||
- --entrypoints.web.address=:80
|
||||
- --entrypoints.websecure.address=:443
|
||||
- --entrypoints.web.http.redirections.entryPoint.to=websecure
|
||||
- --entrypoints.web.http.redirections.entryPoint.scheme=https
|
||||
- --entrypoints.web.http.redirections.entryPoint.permanent=true
|
||||
- --entryPoints.websecure.forwardedHeaders.insecure=true
|
||||
- --entryPoints.websecure.transport.respondingTimeouts.idleTimeout=600s
|
||||
- --entryPoints.websecure.transport.respondingTimeouts.readTimeout=600s
|
||||
- --entryPoints.websecure.transport.respondingTimeouts.writeTimeout=600s
|
||||
- --certificatesresolvers.letsencryptresolver.acme.httpchallenge=true
|
||||
- --certificatesresolvers.letsencryptresolver.acme.httpchallenge.entrypoint=web
|
||||
- --certificatesresolvers.letsencryptresolver.acme.email=admin@example.com
|
||||
- --certificatesresolvers.letsencryptresolver.acme.storage=/letsencrypt/acme.json
|
||||
- --api.dashboard=true
|
||||
ports:
|
||||
- target: 80
|
||||
published: 80
|
||||
protocol: tcp
|
||||
mode: host
|
||||
- target: 443
|
||||
published: 443
|
||||
protocol: tcp
|
||||
mode: host
|
||||
- target: 443
|
||||
published: 443
|
||||
protocol: udp
|
||||
mode: host
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- traefik-letsencrypt:/letsencrypt
|
||||
networks:
|
||||
- traefik
|
||||
deploy:
|
||||
endpoint_mode: dnsrr
|
||||
replicas: 1
|
||||
placement:
|
||||
constraints:
|
||||
- node.role == manager
|
||||
labels:
|
||||
traefik.enable: "true"
|
||||
traefik.docker.network: "traefik"
|
||||
traefik.http.routers.traefik-dashboard.rule: "Host(`traefik.example.com`)"
|
||||
traefik.http.routers.traefik-dashboard.entrypoints: "websecure"
|
||||
traefik.http.routers.traefik-dashboard.tls: "true"
|
||||
traefik.http.routers.traefik-dashboard.tls.certresolver: "letsencryptresolver"
|
||||
traefik.http.routers.traefik-dashboard.service: "api@internal"
|
||||
traefik.http.services.traefik-dashboard.loadbalancer.server.port: "888"
|
||||
update_config:
|
||||
order: stop-first
|
||||
failure_action: rollback
|
||||
restart_policy:
|
||||
condition: on-failure
|
||||
|
||||
volumes:
|
||||
traefik-letsencrypt:
|
||||
Loading…
Reference in New Issue