Here is another template using only a docker-compose file.
traefik-int
is labeled with traefik.ext=true
, so it is automatically picked up by traefik-ext
, and using entrypoint websecure
, it is (incl. /dashboard/
) practically available externally.
Again, it's missing a TLS wildcard certresolver for traefik-ext
and all requests unknown to traefik-ext
are passed to traefik-int
using rule=PathPrefix(`/`)
.
Other "internal" services must use label traefik.int=true
and entrypoint web
.
version: '3.9'
networks:
proxy-ext:
name: proxy-ext
driver: overlay
proxy-int:
name: proxy-int
driver: overlay
volumes:
traefik-certificates:
services:
traefik-ext:
image: traefik:v2.10
hostname: '{{.Node.Hostname}}'
ports:
- target: 80
published: 80
protocol: tcp
mode: host
- target: 443
published: 443
protocol: tcp
mode: host
networks:
- proxy-ext
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik-certificates:/certificates
command:
- --providers.docker=true
- --providers.docker.swarmMode=true
- --providers.docker.exposedByDefault=false
- --providers.docker.network=proxy-ext
- --providers.docker.constraints=Label(`traefik.ext`,`true`)
- --entryPoints.web.address=:80
- --entryPoints.web.http.redirections.entryPoint.to=websecure
- --entryPoints.web.http.redirections.entryPoint.scheme=https
- --entryPoints.websecure.address=:443
- --entryPoints.websecure.http.tls=true
- --entryPoints.websecure.http.tls.certResolver=myresolver
- --api.debug=true
- --api.dashboard=true
- --log.level=INFO
- --accesslog=true
- --certificatesResolvers.myresolver.acme.email=mail.example.com
- --certificatesResolvers.myresolver.acme.storage=/certificates/acme.json
- --certificatesresolvers.myresolver.acme.tlschallenge=true
deploy:
mode: global
placement:
constraints:
- node.role==manager
labels:
- traefik.ext=true
- traefik.enable=true
- traefik.http.routers.traefik-ext.entrypoints=websecure
- traefik.http.routers.traefik-ext.rule=Host(`traefik-ext.example.com`)
- traefik.http.routers.traefik-ext.service=api@internal
- traefik.http.routers.traefik-ext.middlewares=auth-ext
- 'traefik.http.middlewares.auth-ext.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/'
- traefik.http.services.dummy-svc.loadbalancer.server.port=9999
traefik-int:
image: traefik:v2.10
hostname: '{{.Node.Hostname}}'
networks:
- proxy-ext
- proxy-int
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
command:
- --providers.docker=true
- --providers.docker.swarmMode=true
- --providers.docker.exposedByDefault=false
- --providers.docker.network=proxy-int
- --providers.docker.constraints=Label(`traefik.int`,`true`)
- --entryPoints.web.address=:80
- --entryPoints.web.forwardedHeaders.insecure=true
- --api.debug=true
- --api.dashboard=true
- --log.level=INFO
- --accesslog=true
deploy:
mode: global
placement:
constraints:
- node.role==manager
labels:
- traefik.ext=true
- traefik.enable=true
- traefik.http.routers.traefik-int.entrypoints=websecure
- traefik.http.routers.traefik-int.rule=Host(`traefik-int.example.com`)
- traefik.http.routers.traefik-int.service=api@internal
- traefik.http.routers.traefik-int.middlewares=auth-int
- 'traefik.http.middlewares.auth-int.basicauth.users=test:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/'
- traefik.http.services.dummy-svc.loadbalancer.server.port=9999
- traefik.http.routers.traefik-fwd.entrypoints=websecure
- traefik.http.routers.traefik-fwd.rule=PathPrefix(`/`)
- traefik.http.routers.traefik-fwd.service=fwd
- traefik.http.services.fwd.loadbalancer.server.port=80
whoami-ext:
hostname: '{{.Node.Hostname}}'
image: traefik/whoami:v1.10
networks:
- proxy-ext
deploy:
mode: global
labels:
- traefik.ext=true
- traefik.enable=true
- traefik.http.routers.whoami-ext.entrypoints=websecure
- traefik.http.routers.whoami-ext.rule=Host(`whoami-ext.example.com`)
- traefik.http.services.whoami-ext.loadbalancer.server.port=80
whoami-int:
hostname: '{{.Node.Hostname}}'
image: traefik/whoami:v1.10
networks:
- proxy-int
deploy:
mode: global
labels:
- traefik.int=true
- traefik.enable=true
- traefik.http.routers.whoami-int.entrypoints=web
- traefik.http.routers.whoami-int.rule=Host(`whoami-int.example.com`)
- traefik.http.services.whoami-int.loadbalancer.server.port=80