Hi, I am back.
Given a swarm with traefik service and another 2 apps, one at port 3000 and another at 3001, how can we we redirect requests with route /app1
to route 3000 /app2
to route 3001, and therefore the paths as well after /app1
or /app2
? Is it even possible?
Best regards,
Bruno Peixoto
You can use Traefik middlewares to handle that, RedirectRegexp to redirect the client/browser to use a different URL (doc) and ReplacePathRegex to change the path internally (doc).
Thanks once again, @bluepuma77. On previous episodes, we redirected incoming traffic from https://customer.example.com:port
to respective service defined with such internal port and entrypoints as websecure
AND custom-port-entrypoint
. GREAT!
For the sake of usability, it would be nice to have https://customer.example.com/customer_name
instead of https://customer.example.com:port
, do you agree? Will the below definitions on static configuration do the trick (I just redirected to working incoming port-defined routes, without path replacement)
labels:
- "traefik.http.middlewares.app1-redirect.redirectregex.regex=^https://customer.example.com/app1/(.*)"
- "traefik.http.middlewares.app1-redirect.redirectregex.replacement=https://customer.example.com:port_1/$${1}"
- "traefik.http.middlewares.app2-redirect.redirectregex.regex=^https://customer.example.com/app2/(.*)"
- "traefik.http.middlewares.app2-redirect.redirectregex.replacement=https://customer.example.com:port_2/$${1}"
http
is always Traefik dynamic config 
Not sure if using ports is a good idea, many corporate firewalls block strange ports, so business customers might not be able to access your service.
I would probably rather use a subdomain like customer.app2.example.com, then you can use a single wildcard TLS cert again.
Or use a dedicated path, but your app needs to support that, like setting a "base path". Simply using stripPrefix
middleware will not work with GUI web apps.
Well, ok. I am trying this stretching approach because, you know, demands are oftentimes weird. The goal here is not to create multiple subdomains, because requires manual actions (Or even web crawling, very ugly).
I thought, Traefik could modify the the incoming URL before requesting from service.
You can modify path of request with ReplacePath and ReplacePathRegex middleware (doc).
1 Like
To make sure:
If I define the middleware with tags below on traefik compose file, we add on service compose file as - "traefik.http.routers.test_service.middlewares=test_redirect"
. However, there is a caveat of having to restart traefik service everytime a new redirect middleware is defined. Therefore, it seems more reasonable to define and assign on the service compose file.
- "traefik.http.middlewares.test_redirect.redirectregex.regex=^https://customer.example.com/test/(.*)"
- "traefik.http.middlewares.test_redirect.redirectregex.replacement=https://customer.example.com:3000/${1}"
Dynamic config files and labels can be reloaded, no need for restart.
For providers.fil
e you need to enable watch
and touch
(or edit) the config file itself. providers.swarm
can set an update interval.
You mention on providers.swarm
, we can set property refreshSeconds
to some custom value, which is 15 seconds by default [1]. Does it mean, it will refresh configurations every setUp interval?
[1] Traefik Docker Swarm Documentation - Traefik
The Traefik providers.docker
will listen to events from the Docker socket AFAIK, so container changes are pushed to Traefik.
providers.swarm
needs to pull the data, you can set the interval in seconds.
Make sure you set a faster refresh interval for Traefik than for a Docker stack update, to always have the latest info for a running service.
1 Like