Traefik migrated to v2
Date
Tags
#selfhosting
#100DaysToOffload >> 2020-05-09 >> 015/100
Last september, traefik received its big version 2 update. I was very excited about TCP routers and the newly implemented middlewares. Can't have been more than a few days later that I tried to migrate my homelab to the new version. I remember being annoyed by the lack of a proper migration guide. Sure, it's possible that I didn't look good enough, but I searched for it for a few days without results. I tried using the new documentation and failed, everything crashed and could not get it working. As I did not have the time to do much more extensive research and also, I needed the selfhosted services on a daily basis, so I left it.
Until today. The whole migration took me a little over three hours and I learned quite a bit on the way. Also, the migration guide has helped quite a bit. If this was updated since September, great article. If not, still a great article and I really did not take the appropriate amount of time to prepare my migration.
Easy steps
The first thing I did was a general search-and-replace for the docker labels (both routers and services). What was traefik.frontend.rule=Host:xyz
now is traefik.http.routers.router0.rule=Host(``xyz``)
. What was traefik.port=80
now is traefik.http.services.service0.loadbalancer.server.port=80
. Quite a bit longer and more cumbersome, but in the end, more extensible.
The traefik.docker.network=xyz
is now unnecessary in most cases as you can define a default network in the traefik.toml
file. Speaking of which, you can now work with a YAML file. It's not to everyone's taste, but I will switch to it in the future when I have some more time.
The traefik.toml
still needed quite the makeover, but everything is will explained in the migration guide and the reference page. Content-wise, I changed little, it's just that the syntax is different. Notable changes are the domains for which certificates are needed now are declared in the entrypoints
section instead of the acme
section and the file
section can no longer include the "router/service declarations", they belong in a separate file.
Pitfalls
Doing this resulted in a non-functional state. Two different possibilities: either the container could not be redirected to the correct service resulting in a 404, or the redirect was correct but without correct certificate. That first possibility was mostly on me: containers are now no longer exposed by default and I forgot to add traefik.enable=true
. Mind you, I always set traefik.enable=false
when I didn't want a container exposed and still do.
However this did not solve the issue for all the containers. I suspect there's still some trickery I need to do in case of using multiple routers. I tried explicitly specifying the service
for the different routers but that wasn't the solution.
As for the other issue, the solution was simple but finding the source was quite hard: as it turns out, I renamed the certificateResolver
to something other than default
. If such is the case, then containers will NOT automatically use it for their certificates. Adding traefik.http.routers.router0.tls=true
and traefik.http.routers.router0.tls.certresolver=mycertresolver
to each container solves this issue.
Todo
One thing I haven't got working yet is using the providers.file
provider. I tried to mimic the container labels but to no avail. Yet.
Update 2020-05-12: I fixed the providers.file
issue. Remember kids, always read the documentation well. It turns out, I missed the line that starts with *
in the code below.
[http.services]
[http.services.Service01]
[http.services.Service01.loadBalancer]
* [[http.services.Service01.loadBalancer.servers]]
url = "foobar"