# ============================================================================= # CUSTOMER STACK TEMPLATE — Uptime Kuma # ============================================================================= # Single-service stack for each paying customer. Simple webapp for testing # routing and auth at https://{{.Domain}}/i/{{.Subdomain}} # # Traefik: priority 10 ensures /i/{{.Subdomain}} always hits this stack, not # ss-atlas (priority 1). Strip prefix sends e.g. /i/user/foo -> /foo to the app. # # Template variables (injected by swarm/client.go): # {{.ID}}, {{.Subdomain}}, {{.Domain}}, {{.TraefikNetwork}} # ============================================================================= services: web: image: louislam/uptime-kuma:2 volumes: - app_data:/app/data networks: - traefik_net deploy: replicas: 1 labels: traefik.enable: "true" traefik.docker.network: "atlas_{{.TraefikNetwork}}" traefik.http.routers.customer-{{.ID}}-web.rule: "Host(`{{.Domain}}`) && PathPrefix(`/i/{{.Subdomain}}`)" traefik.http.routers.customer-{{.ID}}-web.entrypoints: "websecure" traefik.http.routers.customer-{{.ID}}-web.priority: "10" traefik.http.routers.customer-{{.ID}}-web.tls: "true" traefik.http.routers.customer-{{.ID}}-web.middlewares: "strip-customer-{{.ID}}@swarm,authelia-auth@swarm" traefik.http.middlewares.strip-customer-{{.ID}}.stripprefix.prefixes: "/i/{{.Subdomain}}" traefik.http.services.customer-{{.ID}}-web.loadbalancer.server.port: "3001" restart_policy: condition: on-failure networks: traefik_net: external: true name: "atlas_{{.TraefikNetwork}}" volumes: app_data: driver: local