Hello,
I'm trying to use traefik in docker compose to point to a service on my host that can't run in a docker. I have thus the following configuration
harbor:
image: alpine
command: sleep infinity
extra_hosts:
- host.docker.internal:host-gateway
labels:
- "traefik.enable=true"
- "traefik.http.routers.harbor.rule=Host(`harbor.example.com`)"
- "traefik.http.routers.harbor.entrypoints=websecure"
- "traefik.http.routers.harbor.tls.certresolver=myresolver"
- "traefik.http.services.harbor.loadbalancer.server.url=http://host.docker.internal:8081"
- "traefik.http.services.harbor.loadbalancer.server.port=8081"
That should simply point to a service on my host running on port 8081, but in the current state, a current request will never return and get a Gateway error. The port is allowed by the firewall
I already have multiple service in that swarm with traefik acting very well as a reverse proxy to add https and redirect based on the host. I saw in a recent PR that it's possible to use the url.
The port is supposed to be a dummy port because traefik will raise an error if I don't specify a port. I use traefik image 3.3 which is the latest
loadbalancer.server.url is not available with providers.docker and labels (reference ), as the labels always target the service/container itself.
You need to use a dynamic config file.
Also note that host.docker.internal is only available with Docker Desktop.
You need to use the real host IP. Not localhost 127.0.0.1, as that is only localhost within the container itself.
I see,
I actually struggle to configure the dynamic configuration file. I use a volume that seems to do the trick but I get error="the service is missing on the router for the following configuration
http:
routers:
harbor:
rule: "Host(`harbor.example.com`)"
entryPoints:
- websecure
tls:
certresolver: myresolver
services:
harbor:
loadBalancer:
servers:
- url: "http://<ip>:8081"
Is there something I don't get ? The configuration looks a lot like the docker label configuration tho
says exactly what it means
There is no automatic assignment of a service to a router with the same name, so you need to add the assignment:
http:
routers:
harbor:
rule: "Host(`harbor.example.com`)"
entryPoints:
- websecure
tls:
certresolver: myresolver
service: harbor
oh yeah stupid mistake :') I didn't see that in the documentation. However it still seems that traefik doesn't find the service. A curl to that host doesn't return anything, the request seems to be dropped. I simply run a python http server to make the tests, and my traefik configuration is that
reverse-proxy:
image: traefik:v3.3
command:
- "--api.dashboard=true"
- "--log.level=INFO"
- "--providers.docker"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=pro@noahcode.dev"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
- "--entryPoints.web.address=:80"
- "--entryPoints.web.http.redirections.entrypoint.to=websecure"
- "--entryPoints.web.http.redirections.entrypoint.scheme=https"
- "--providers.file.directory=/traefik/dynamic/"
- "--providers.file.watch=true"
deploy:
update_config:
order: start-first
ports:
- mode: host
protocol: tcp
published: 80
target: 80
- mode: host
protocol: tcp
published: 443
target: 443
volumes:
- letsencrypt:/letsencrypt
- dynamic:/traefik/dynamic
- /var/run/docker.sock:/var/run/docker.sock
networks:
- traefik
Is there something obvious I'm missing ?
Check Traefik debug log if the dynamic config file is loaded:
--log.level=DEBUG
It looks like there's no problem to me
> add watcher on: /traefik/dynamic/harbor.yaml
> Configuration received config={"http":{"routers":{"harbor":{"entryPoints":["websecure"],"rule":"Host(`harbor.example.com`)","service":"harbor","tls":{"certResolver":"myresolver"}}},"services":{"harbor":{"loadBalancer":{"passHostHeader":true,"responseForwarding":{"flushInterval":"100ms"},"servers":[{"url":"http://<ip>:8081"}]}}}},"tcp":{},"tls":{},"udp":{}} providerName=file
> Adding certificate for domain(s) harbor.example.com,open.example.com
> Configuration received config=[REDACTED] providerName=docker
> Creating load-balancer entryPointName=websecure routerName=harbor@file serviceName=harbor@file
> Creating server entryPointName=websecure routerName=harbor@file serverName=f17204525141416a serviceName=harbor@file target=http://<ip>:8081
> Adding route for harbor.example.com with TLS options default entryPointName=websecure
> Adding certificate for domain(s) harbor.example.com,open.example.com
> Trying to challenge certificate for domain [harbor.example.com] found in HostSNI rule ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=harbor@file rule=Host(`harbor.example.com`)
> Looking for provided certificate(s) to validate ["harbor.example.com"]... ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=harbor@file rule=Host(`harbor.example.com`)
> Creating load-balancer entryPointName=websecure routerName=harbor@docker serviceName=harbor@docker
> Creating server entryPointName=websecure routerName=harbor@docker serverName=aa6bf9240a2af4a3 serviceName=harbor@docker target=http://10.0.2.13:8081
> Creating load-balancer entryPointName=websecure routerName=harbor@file serviceName=harbor@file
> Creating server entryPointName=websecure routerName=harbor@file serverName=f17204525141416a serviceName=harbor@file target=http://<ip>:8081
> Adding route for harbor.example.com with TLS options default entryPointName=websecure
> Trying to challenge certificate for domain [harbor.example.com] found in HostSNI rule ACME
CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=harbor@docker rule=Host(`harbor.example.com`)
> Trying to challenge certificate for domain [harbor.example.com] found in HostSNI rule ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=harbor@file rule=Host(`harbor.example.com`)
> No ACME certificate generation required for domains ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory domains=["harbor.example.com"] providerName=myresolver.acme routerName=harbor@file rule=Host(`harbor.example.com`)
> Looking for provided certificate(s) to validate ["harbor.example.com"]... ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=harbor@docker rule=Host(`harbor.example.com`)
> No ACME certificate generation required for domains ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory domains=["harbor.example.com"] providerName=myresolver.acme routerName=harbor@docker rule=Host(`harbor.example.com`)
> Looking for provided certificate(s) to validate ["harbor.example.com"]... ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory providerName=myresolver.acme routerName=harbor@file rule=Host(`harbor.example.com`)
> No ACME certificate generation required for domains ACME CA=https://acme-v02.api.letsencrypt.org/directory acmeCA=https://acme-v02.api.letsencrypt.org/directory domains=["harbor.example.com"] providerName=myresolver.acme routerName=harbor@file rule=Host(`harbor.example.com`)
Check Traefik access log in JSON format during requests (doc ):
--accesslog.format=json
Ok I got it work. This really helped me debug. My final configuration is the following if someone needs it
services:
reverse-proxy:
image: traefik:v3.3
command:
- "--api.dashboard=true"
- "--log.level=DEBUG"
- "--accesslog.format=json"
- "--providers.docker"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=pro@example.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
- "--entryPoints.web.address=:80"
- "--entryPoints.web.http.redirections.entrypoint.to=websecure"
- "--entryPoints.web.http.redirections.entrypoint.scheme=https"
- "--providers.file.directory=/traefik/dynamic/"
- "--providers.file.watch=true"
deploy:
update_config:
order: start-first
ports:
- mode: host
protocol: tcp
published: 80
target: 80
- mode: host
protocol: tcp
published: 443
target: 443
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- letsencrypt:/letsencrypt
- dynamic:/traefik/dynamic
- /var/run/docker.sock:/var/run/docker.sock
networks:
- traefik
http:
routers:
harbor:
rule: "Host(`harbor.example.com`)"
entryPoints:
- websecure
tls:
certresolver: myresolver
service: harbor
services:
harbor:
loadBalancer:
servers:
- url: "http://host.docker.internal:8081"
Thank you for your help !
system
Closed
February 24, 2025, 1:05pm
10
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.