dalan
August 31, 2020, 12:31pm
1
Have a router defined in my traefik-dynamic.toml
that makes use of http-to-https@docker
but I'm getting this error message in the logs:
Is there a way to validate that my traefik yaml config is valid?
Have I missed something moving to v2.2?
traefik | time="2020-08-31T12:16:55Z" level=error msg="middleware \"http-to-https@docker\" does not exist" entryPointName=http routerName=synology-http@file
Here is my yaml file:
version: "3"
volumes:
traefik:
driver: local
driver_opts:
type: nfs
o: "addr=192.168.2.198,soft,rw,nfsvers=3,async"
device: ":/volume1/docker/traefik"
services:
traefik:
container_name: traefik
image: traefik:v2.2
ports:
- "80:80"
- "443:443"
- "9090:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /nfs/docker/traefik/traefik-dynamic.toml:/traefik-dynamic.toml
- /nfs/docker/traefik/acme.json:/acme.json
command:
- "--log.level=DEBUG"
- "--entrypoints.http.address=:80"
- "--entrypoints.https.address=:443"
- "--providers.docker=true"
- "--providers.docker.exposedByDefault=false"
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
- "--providers.docker.watch=true"
- "--providers.file=true"
- "--providers.file.filename=/traefik-dynamic.toml"
- "--providers.file.watch=true"
- "--api=true"
- "--api.insecure=true"
- "--api.dashboard=true"
- "--api.debug=true"
- "--certificatesresolvers.cloudflare.acme.dnschallenge=true"
- "--certificatesresolvers.cloudflare.acme.email=email@gmail.com"
- "--certificatesresolvers.cloudflare.acme.storage=acme.json"
- "--certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53"
- "--certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare"
- "--serversTransport.insecureSkipVerify=true"
restart: always
env_file: ./traefik.env
labels:
- "traefik.enable=true"
- "traefik.http.middlewares.compress.compress=true"
- "traefik.http.middlewares.forward-auth.forwardauth.address=http://forward-auth/auth"
- "traefik.http.middlewares.forward-auth.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.forward-auth.forwardauth.authResponeHeader=X-Forwarded-User"
- "traefik.http.middlewares.http-to-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.http-to-https.redirectscheme.permanent=true"
hello:
container_name: hello
image: containous/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.hello-http.rule=Host(`hello.example.com`)"
- "traefik.http.routers.hello-http.service=hello-http"
- "traefik.http.routers.hello-http.entryPoints=http"
- "traefik.http.routers.hello-http.tls=false"
- "traefik.http.routers.hello-http.middlewares=compress,http-to-https"
- "traefik.http.routers.hello-https.rule=Host(`hello.example.com`)"
- "traefik.http.routers.hello-https.service=hello-http"
- "traefik.http.routers.hello-https.entryPoints=https"
- "traefik.http.routers.hello-https.tls.certresolver=cloudflare"
- "traefik.http.routers.hello-https.middlewares=compress"
- "traefik.http.services.hello-http.loadbalancer.server.port=80"
hello-auth:
container_name: hello-auth
image: containous/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.hello-auth-http.rule=Host(`hello-auth.example.com`)"
- "traefik.http.routers.hello-auth-http.service=hello-auth"
- "traefik.http.routers.hello-auth-http.entrypoints=http"
- "traefik.http.routers.hello-auth-http.middlewares=forward-auth,compress,http-to-https"
- "traefik.http.routers.hello-auth.rule=Host(`hello-auth.example.com`)"
- "traefik.http.routers.hello-auth.service=hello-auth"
- "traefik.http.routers.hello-auth.entrypoints=https"
- "traefik.http.routers.hello-auth.tls.certresolver=cloudflare"
- "traefik.http.routers.hello-auth.middlewares=forward-auth,compress"
- "traefik.http.services.hello-auth.loadbalancer.server.port=80"
cakiwi
August 31, 2020, 12:42pm
2
I see this only on startup with a docker provider middleware. But it works once the docker provider loads the config from docker labels.
Is it just the error concerning you or does it flat out not work ?
dalan
September 1, 2020, 10:32am
3
It just flat out does not work. ;(
traefik | time="2020-09-01T10:29:29Z" level=error msg="middleware "http-to-https@docker" does not exist" routerName=synology-http@file entryPointName=http
And none of the middlewares defined under the traefik
service in the yaml file, show up in the dashboard.
ldez
September 1, 2020, 11:02am
4
By using the global redirection system (and with some configuration improvements)
version: "3"
volumes:
traefik:
driver: local
driver_opts:
type: nfs
o: "addr=192.168.2.198,soft,rw,nfsvers=3,async"
device: ":/volume1/docker/traefik"
services:
traefik:
container_name: traefik
image: traefik:v2.2
ports:
- 80:80
- 443:443
- 9090:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /nfs/docker/traefik/traefik-dynamic.toml:/traefik-dynamic.toml
- /nfs/docker/traefik/acme.json:/acme.json
command:
- --log.level=INFO
- --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.certresolver=cloudflare
- --providers.docker.exposedByDefault=false
- --providers.docker.endpoint=unix:///var/run/docker.sock
- --providers.file.filename=/traefik-dynamic.toml
- --providers.file.watch=true
- --api=true
- --api.insecure=true
- --certificatesresolvers.cloudflare.acme.dnschallenge=true
- --certificatesresolvers.cloudflare.acme.email=email@gmail.com
- --certificatesresolvers.cloudflare.acme.storage=acme.json
- --certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53
- --certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare
- --serversTransport.insecureSkipVerify=true
restart: always
env_file: ./traefik.env
labels:
traefik.enable: 'true'
traefik.http.middlewares.compress.compress: 'true'
traefik.http.middlewares.forward-auth.forwardauth.address: http://forward-auth/auth
traefik.http.middlewares.forward-auth.forwardauth.trustForwardHeader: 'true'
traefik.http.middlewares.forward-auth.forwardauth.authResponeHeader: X-Forwarded-User
hello:
container_name: hello
image: containous/whoami
labels:
traefik.enable: 'true'
traefik.http.routers.hello.rule: Host(`hello.example.com`)
traefik.http.routers.hello.service: hello
traefik.http.routers.hello.entryPoints: websecure,web
traefik.http.routers.hello.middlewares: compress
traefik.http.services.hello.loadbalancer.server.port: 80
hello-auth:
container_name: hello-auth
image: containous/whoami
labels:
traefik.enable: 'true'
traefik.http.routers.hello-auth.rule: Host(`hello-auth.example.com`)
traefik.http.routers.hello-auth.service: hello-auth
traefik.http.routers.hello-auth.entrypoints: websecure,web
traefik.http.routers.hello-auth.middlewares: forward-auth,compress
traefik.http.services.hello-auth.loadbalancer.server.port: 80
2 Likes
dalan
September 2, 2020, 12:34pm
5
Just one nit @ldez , I believe that I'm having an issue because no hostname is specified for cert generation if I'm using dnschallenge for traefik's websecure entrypoint. Or am I missing something?
Also a million thank yous, this config is much cleaner than my katamari damacy config I've been lugging around from pre-2.0.
traefik | time="2020-09-02T12:31:53Z" level=error msg="Unable to obtain ACME certificate for domains \"traefik-docker\": unable to generate a certificate for the domains [traefik-docker]: acme: error: 400 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-order :: urn:ietf:params:acme:error:rejectedIdentifier :: Error creating new order :: Cannot issue for \"traefik-docker\": Domain name needs at least one dot, url: " providerName=cloudflare.acme routerName=https-traefik-docker@docker rule="Host(`traefik-docker`)"
ldez
September 2, 2020, 11:25pm
6
The behavior is expected and related to:
traefik:
image: traefik:v2.2
# ...
labels:
traefik.enable: 'true'
# ...
When you enable Traefik on a container, Traefik creates automatically one router and one service.
It's the same behavior when you set --providers.docker.exposedByDefault=true
(the default behavior).
You have several solutions, one is to use the API in secure mode (instead of the insecure mode)
version: "3"
volumes:
traefik:
driver: local
driver_opts:
type: nfs
o: "addr=192.168.2.198,soft,rw,nfsvers=3,async"
device: ":/volume1/docker/traefik"
services:
traefik:
container_name: traefik
image: traefik:v2.2
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /nfs/docker/traefik/traefik-dynamic.toml:/traefik-dynamic.toml
- /nfs/docker/traefik/acme.json:/acme.json
command:
- --log.level=INFO
- --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.certresolver=cloudflare
- --providers.docker.exposedByDefault=false
- --providers.docker.endpoint=unix:///var/run/docker.sock
- --providers.file.filename=/traefik-dynamic.toml
- --providers.file.watch=true
- --api=true
- --certificatesresolvers.cloudflare.acme.dnschallenge=true
- --certificatesresolvers.cloudflare.acme.email=email@gmail.com
- --certificatesresolvers.cloudflare.acme.storage=acme.json
- --certificatesresolvers.cloudflare.acme.dnschallenge.resolvers=1.1.1.1:53,8.8.8.8:53
- --certificatesresolvers.cloudflare.acme.dnschallenge.provider=cloudflare
- --serversTransport.insecureSkipVerify=true
restart: always
env_file: ./traefik.env
labels:
traefik.enable: 'true'
# Dashboard
traefik.http.routers.traefik.rule: Host(`traefik.example.com`)
traefik.http.routers.traefik.entrypoints: web, websecure
traefik.http.routers.traefik.service: api@internal
traefik.http.routers.traefik.middlewares: auth
# Middlewares
traefik.http.middlewares.auth.basicauth.users: user:$$apr1$$q8eZFHjF$$Fvmkk//V6Btlaf2i/ju5n/ # user/password
traefik.http.middlewares.compress.compress: 'true'
traefik.http.middlewares.forward-auth.forwardauth.address: http://forward-auth/auth
traefik.http.middlewares.forward-auth.forwardauth.trustForwardHeader: 'true'
traefik.http.middlewares.forward-auth.forwardauth.authResponeHeader: X-Forwarded-User
hello:
container_name: hello
image: containous/whoami
labels:
traefik.enable: 'true'
traefik.http.routers.hello.rule: Host(`hello.example.com`)
traefik.http.routers.hello.service: hello
traefik.http.routers.hello.entryPoints: websecure,web
traefik.http.routers.hello.middlewares: compress
traefik.http.services.hello.loadbalancer.server.port: 80
hello-auth:
container_name: hello-auth
image: containous/whoami
labels:
traefik.enable: 'true'
traefik.http.routers.hello-auth.rule: Host(`hello-auth.example.com`)
traefik.http.routers.hello-auth.service: hello-auth
traefik.http.routers.hello-auth.entrypoints: websecure,web
traefik.http.routers.hello-auth.middlewares: forward-auth,compress
traefik.http.services.hello-auth.loadbalancer.server.port: 80
Another solution can be to use the file provider to define the "shared middlewares" instead of using the labels on the Traefik container.