Planka docker behind traefik without docker

So I'm trying to setup traefik for the first time. I don't want to use docker for traefik (nope). It's on an archlinux host. The first service i'm trying to expose is planka. I have https setup with my own certs that i'm managing (Because I want to). Auto redirect to https works. Dashboard works. Discovery seems to work. It seems to be all setup. However, all I get are 404 errors. I know planka works. I can access it outside of traefik (Through direct ip-port). The server can curl it fine too (Again ip-port).

I'm at my wits end. Either traefik won't work at all... or I'm missing something simple.

Log and access log at the end.

e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/cmd/traefik/traefik.go:103e[0me[36m >e[0m Traefik version 3.2.0 built on I don't remember exactly e[36mversion=e[0m3.2.0
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/cmd/traefik/traefik.go:110e[0me[36m >e[0m Static configuration loaded [json] e[36mstaticConfiguration=e[0m{"accessLog":{"fields":{"defaultMode":"keep","headers":{"defaultMode":"drop"}},"filters":{},"format":"json"},"api":{"dashboard":true,"insecure":true},"entryPoints":{"traefik":{"address":":8080","forwardedHeaders":{},"http":{"maxHeaderBytes":1048576},"http2":{"maxConcurrentStreams":250},"transport":{"lifeCycle":{"graceTimeOut":"10s"},"respondingTimeouts":{"idleTimeout":"3m0s","readTimeout":"1m0s"}},"udp":{"timeout":"3s"}},"web":{"address":":80","forwardedHeaders":{},"http":{"maxHeaderBytes":1048576,"redirections":{"entryPoint":{"permanent":true,"priority":9223372036854775806,"scheme":"https","to":"websecure"}}},"http2":{"maxConcurrentStreams":250},"transport":{"lifeCycle":{"graceTimeOut":"10s"},"respondingTimeouts":{"idleTimeout":"3m0s","readTimeout":"1m0s"}},"udp":{"timeout":"3s"}},"websecure":{"address":":443","forwardedHeaders":{},"http":{"maxHeaderBytes":1048578},"http2":{"maxConcurrentStreams":250},"transport":{"lifeCycle":{"graceTimeOut":"10s"},"respondingTimeouts":{"idleTimeout":"3m0s","readTimeout":"1m0s"}},"udp":{"timeout":"3s"}}},"global":{"checkNewVersion":true},"log":{"format":"common","level":"DEBUG"},"providers":{"docker":{"defaultRule":"Host(`{{ normalize .Name }}`)","endpoint":"unix:///var/run/docker.sock","exposedByDefault":true,"watch":true},"file":{"filename":"/etc/traefik/conf.created/certificates.yml","watch":true},"providersThrottleDuration":"2s"},"serversTransport":{"maxIdleConnsPerHost":200},"tcpServersTransport":{"dialKeepAlive":"15s","dialTimeout":"30s"}}
e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/cmd/traefik/traefik.go:626e[0me[36m >e[0m
Stats collection is disabled.
Help us improve Traefik by turning this feature on :)
More details on: https://doc.traefik.io/traefik/contributing/data-collection/

e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/configurationwatcher.go:73e[0me[36m >e[0m Starting provider aggregator aggregator.ProviderAggregator
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/server_entrypoint_tcp.go:231e[0me[36m >e[0m Starting TCP Server e[36mentryPointName=e[0mwebsecure
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/server_entrypoint_tcp.go:231e[0me[36m >e[0m Starting TCP Server e[36mentryPointName=e[0mtraefik
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/server_entrypoint_tcp.go:231e[0me[36m >e[0m Starting TCP Server e[36mentryPointName=e[0mweb
e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:202e[0me[36m >e[0m Starting provider *file.Provider
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:203e[0me[36m >e[0m *file.Provider provider configuration e[36mconfig=e[0m{"filename":"/etc/traefik/conf.created/certificates.yml","watch":true}
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/file/file.go:122e[0me[36m >e[0m add watcher on: /etc/traefik/conf.created
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/file/file.go:122e[0me[36m >e[0m add watcher on: /etc/traefik/conf.created/certificates.yml
e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:202e[0me[36m >e[0m Starting provider *traefik.Provider
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:203e[0me[36m >e[0m *traefik.Provider provider configuration e[36mconfig=e[0m{}
e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:202e[0me[36m >e[0m Starting provider *docker.Provider
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:203e[0me[36m >e[0m *docker.Provider provider configuration e[36mconfig=e[0m{"defaultRule":"Host(`{{ normalize .Name }}`)","endpoint":"unix:///var/run/docker.sock","exposedByDefault":true,"watch":true}
e[90m2024-11-09T06:04:14+01:00e[0m e[32mINFe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:202e[0me[36m >e[0m Starting provider *acme.ChallengeTLSALPN
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/aggregator/aggregator.go:203e[0me[36m >e[0m *acme.ChallengeTLSALPN provider configuration e[36mconfig=e[0m{}
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/configurationwatcher.go:227e[0me[36m >e[0m Configuration received e[36mconfig=e[0m{"http":{},"tcp":{},"tls":{"stores":{"default":{}}},"udp":{}} e[36mproviderName=e[0mfile
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/configurationwatcher.go:227e[0me[36m >e[0m Configuration received e[36mconfig=e[0m{"http":{"middlewares":{"dashboard_redirect":{"redirectRegex":{"permanent":true,"regex":"^(http:\\/\\/(\\[[\\w:.]+\\]|[\\w\\._-]+)(:\\d+)?)\\/$","replacement":"${1}/dashboard/"}},"dashboard_stripprefix":{"stripPrefix":{"prefixes":["/dashboard/","/dashboard"]}},"redirect-web-to-websecure":{"redirectScheme":{"permanent":true,"port":"443","scheme":"https"}}},"routers":{"api":{"entryPoints":["traefik"],"priority":9223372036854775806,"rule":"PathPrefix(`/api`)","ruleSyntax":"v3","service":"api@internal"},"dashboard":{"entryPoints":["traefik"],"middlewares":["dashboard_redirect@internal","dashboard_stripprefix@internal"],"priority":9223372036854775805,"rule":"PathPrefix(`/`)","ruleSyntax":"v3","service":"dashboard@internal"},"web-to-websecure":{"entryPoints":["web"],"middlewares":["redirect-web-to-websecure"],"priority":9223372036854775806,"rule":"HostRegexp(`^.+$`)","ruleSyntax":"v3","service":"noop@internal"}},"serversTransports":{"default":{"maxIdleConnsPerHost":200}},"services":{"api":{},"dashboard":{},"noop":{}}},"tcp":{"serversTransports":{"default":{"dialKeepAlive":"15s","dialTimeout":"30s"}}},"tls":{},"udp":{}} e[36mproviderName=e[0minternal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/tls/tlsmanager.go:97e[0me[36m >e[0m No store is defined to add the certificate MIID, it will be added to the default store
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/tls/certificate.go:131e[0me[36m >e[0m Adding certificate for domain(s) *.example.com,example.com
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/stripprefix/strip_prefix.go:32e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_stripprefix@internal e[36mmiddlewareType=e[0mStripPrefix e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/observability/middleware.go:33e[0me[36m >e[0m Adding tracing to middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_stripprefix@internal e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_regex.go:17e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_redirect@internal e[36mmiddlewareType=e[0mRedirectRegex e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_regex.go:18e[0me[36m >e[0m Setting up redirection from ^(http:\/\/(\[[\w:.]+\]|[\w\._-]+)(:\d+)?)\/$ to ${1}/dashboard/ e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_redirect@internal e[36mmiddlewareType=e[0mRedirectRegex e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/observability/middleware.go:33e[0me[36m >e[0m Adding tracing to middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_redirect@internal e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/recovery/recovery.go:25e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mtraefik-internal-recovery e[36mmiddlewareType=e[0mRecovery
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_scheme.go:29e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mweb e[36mmiddlewareName=e[0mredirect-web-to-websecure@internal e[36mmiddlewareType=e[0mRedirectScheme e[36mrouterName=e[0mweb-to-websecure@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_scheme.go:30e[0me[36m >e[0m Setting up redirection to https 443 e[36mentryPointName=e[0mweb e[36mmiddlewareName=e[0mredirect-web-to-websecure@internal e[36mmiddlewareType=e[0mRedirectScheme e[36mrouterName=e[0mweb-to-websecure@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/recovery/recovery.go:25e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mweb e[36mmiddlewareName=e[0mtraefik-internal-recovery e[36mmiddlewareType=e[0mRecovery
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/provider/docker/pdocker.go:90e[0me[36m >e[0m Provider connection established with docker 27.3.1 (API 1.47) e[36mproviderName=e[0mdocker
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/configurationwatcher.go:227e[0me[36m >e[0m Configuration received e[36mconfig=e[0m{"http":{"routers":{"planka":{"entryPoints":["websecure"],"rule":"Host(`projects.example.com`)","service":"planka"},"postgres-planka":{"rule":"Host(`postgres-planka`)","service":"postgres-planka"}},"services":{"planka":{"loadBalancer":{"passHostHeader":true,"responseForwarding":{"flushInterval":"100ms"},"servers":[{"url":"http://172.18.0.3:1337"}]}},"postgres-planka":{"loadBalancer":{"passHostHeader":true,"responseForwarding":{"flushInterval":"100ms"},"servers":[{"url":"http://172.18.0.2:5432"}]}}}},"tcp":{},"tls":{},"udp":{}} e[36mproviderName=e[0mdocker
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/aggregator.go:51e[0me[36m >e[0m No entryPoint defined for this router, using the default one(s) instead e[36mentryPointName=e[0m["web","websecure"] e[36mrouterName=e[0mpostgres-planka
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/tls/tlsmanager.go:97e[0me[36m >e[0m No store is defined to add the certificate MIID, it will be added to the default store
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/tls/certificate.go:131e[0me[36m >e[0m Adding certificate for domain(s) *.example.com,example.com
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/service/service.go:299e[0me[36m >e[0m Creating load-balancer e[36mentryPointName=e[0mwebsecure e[36mrouterName=e[0mplanka@docker e[36mserviceName=e[0mplanka@docker
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/service/service.go:336e[0me[36m >e[0m Creating server e[36mentryPointName=e[0mwebsecure e[36mrouterName=e[0mplanka@docker e[36mserverName=e[0m71b197a0bb51c1d1 e[36mserviceName=e[0mplanka@docker e[36mtarget=e[0mhttp://172.18.0.3:1337
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/service/service.go:299e[0me[36m >e[0m Creating load-balancer e[36mentryPointName=e[0mwebsecure e[36mrouterName=e[0mpostgres-planka@docker e[36mserviceName=e[0mpostgres-planka@docker
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/server/service/service.go:336e[0me[36m >e[0m Creating server e[36mentryPointName=e[0mwebsecure e[36mrouterName=e[0mpostgres-planka@docker e[36mserverName=e[0m1c7aecb7841413d2 e[36mserviceName=e[0mpostgres-planka@docker e[36mtarget=e[0mhttp://172.18.0.2:5432
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/recovery/recovery.go:25e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mwebsecure e[36mmiddlewareName=e[0mtraefik-internal-recovery e[36mmiddlewareType=e[0mRecovery
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_scheme.go:29e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mweb e[36mmiddlewareName=e[0mredirect-web-to-websecure@internal e[36mmiddlewareType=e[0mRedirectScheme e[36mrouterName=e[0mweb-to-websecure@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_scheme.go:30e[0me[36m >e[0m Setting up redirection to https 443 e[36mentryPointName=e[0mweb e[36mmiddlewareName=e[0mredirect-web-to-websecure@internal e[36mmiddlewareType=e[0mRedirectScheme e[36mrouterName=e[0mweb-to-websecure@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/recovery/recovery.go:25e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mweb e[36mmiddlewareName=e[0mtraefik-internal-recovery e[36mmiddlewareType=e[0mRecovery
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/stripprefix/strip_prefix.go:32e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_stripprefix@internal e[36mmiddlewareType=e[0mStripPrefix e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/observability/middleware.go:33e[0me[36m >e[0m Adding tracing to middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_stripprefix@internal e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_regex.go:17e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_redirect@internal e[36mmiddlewareType=e[0mRedirectRegex e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/redirect/redirect_regex.go:18e[0me[36m >e[0m Setting up redirection from ^(http:\/\/(\[[\w:.]+\]|[\w\._-]+)(:\d+)?)\/$ to ${1}/dashboard/ e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_redirect@internal e[36mmiddlewareType=e[0mRedirectRegex e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/observability/middleware.go:33e[0me[36m >e[0m Adding tracing to middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mdashboard_redirect@internal e[36mrouterName=e[0mdashboard@internal
e[90m2024-11-09T06:04:14+01:00e[0m e[33mDBGe[0m e[1m../../../../build/traefik/src/traefik-3.2.0/pkg/middlewares/recovery/recovery.go:25e[0me[36m >e[0m Creating middleware e[36mentryPointName=e[0mtraefik e[36mmiddlewareName=e[0mtraefik-internal-recovery e[36mmiddlewareType=e[0mRecovery
{"ClientAddr":"84.239.7.19:38744","ClientHost":"84.239.7.19","ClientPort":"38744","ClientUsername":"-","DownstreamContentSize":19,"DownstreamStatus":404,"Duration":25178,"GzipRatio":0,"OriginContentSize":0,"OriginDuration":0,"OriginStatus":0,"Overhead":25178,"RequestAddr":"projects.example.com","RequestContentSize":0,"RequestCount":1,"RequestHost":"projects.example.com","RequestMethod":"GET","RequestPath":"/","RequestPort":"-","RequestProtocol":"HTTP/2.0","RequestScheme":"https","RetryAttempts":0,"StartLocal":"2024-11-09T06:04:36.036946073+01:00","StartUTC":"2024-11-09T05:04:36.036946073Z","TLSCipher":"TLS_AES_128_GCM_SHA256","TLSVersion":"1.3","entryPointName":"websecure","level":"info","msg":"","time":"2024-11-09T06:04:36+01:00"}

traefik config:

global:
  checkNewVersion: true
  sendAnonymousUsage: false

entryPoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: :443

log:
  level: DEBUG

api:
  insecure: true
  dashboard: true

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
#    defaultRule: Host(`{{ normalize .Name }}.docker.localhost`)
    exposedByDefault: true
  file:
    #directory: /etc/traefik/conf.active
    filename: /etc/traefik/conf.created/certificates.yml
    watch: true

accessLog: 
  format: json

planka docker yml:

version: "3"

services:
  planka:
    image: ghcr.io/plankanban/planka:latest
    restart: on-failure
    volumes:
      - user-avatars:/app/public/user-avatars
      - project-background-images:/app/public/project-background-images
      - attachments:/app/private/attachments
    ports:
      - 3173:1337
    labels:
      - traefik.enable=true
      - traefik.http.routers.planka.rule=Host(`projects.example.com`)
      - traefik.http.routers.planka.entrypoints=websecure
      - traefik.http.services.planka.loadbalancer.server.port=1337
    environment:
      - BASE_URL=http://projects.example.com
      - DATABASE_URL=postgresql://postgres@postgres/planka
      - SECRET_KEY=6fe

      # - TRUST_PROXY=0
      # - TOKEN_EXPIRES_IN=365 # In days

      # related: https://github.com/knex/knex/issues/2354
      # As knex does not pass query parameters from the connection string we
      # have to use environment variables in order to pass the desired values, e.g.
      # - PGSSLMODE=<value>

      # Configure knex to accept SSL certificates
      # - KNEX_REJECT_UNAUTHORIZED_SSL_CERTIFICATE=false

      - DEFAULT_ADMIN_EMAIL=***** # Do not remove if you want to prevent this user from being edited/deleted
      - DEFAULT_ADMIN_PASSWORD=******
      - DEFAULT_ADMIN_NAME=Luanta Yarcsi
      - DEFAULT_ADMIN_USERNAME=***

      # - SHOW_DETAILED_AUTH_ERRORS=false # Set to true to show more detailed authentication error messages. It should not be enabled without a rate limiter for security reasons.

      # - ALLOW_ALL_TO_CREATE_PROJECTS=true

      # - OIDC_ISSUER=
      # - OIDC_CLIENT_ID=
      # - OIDC_CLIENT_SECRET=
      # - OIDC_ID_TOKEN_SIGNED_RESPONSE_ALG=
      # - OIDC_USERINFO_SIGNED_RESPONSE_ALG=
      # - OIDC_SCOPES=openid email profile
      # - OIDC_RESPONSE_MODE=fragment
      # - OIDC_USE_DEFAULT_RESPONSE_MODE=true
      # - OIDC_ADMIN_ROLES=admin
      # - OIDC_CLAIMS_SOURCE=userinfo
      # - OIDC_EMAIL_ATTRIBUTE=email
      # - OIDC_NAME_ATTRIBUTE=name
      # - OIDC_USERNAME_ATTRIBUTE=preferred_username
      # - OIDC_ROLES_ATTRIBUTE=groups
      # - OIDC_IGNORE_USERNAME=true
      # - OIDC_IGNORE_ROLES=true
      # - OIDC_ENFORCED=true

      # Email Notifications (https://nodemailer.com/smtp/)
      # - SMTP_HOST=
      # - SMTP_PORT=587
      # - SMTP_NAME=
      # - SMTP_SECURE=true
      # - SMTP_USER=
      # - SMTP_PASSWORD=
      # - SMTP_FROM="Demo Demo" <demo@demo.demo>
      # - SMTP_TLS_REJECT_UNAUTHORIZED=false

      # Optional fields: accessToken, events, excludedEvents
      # - |
      #   WEBHOOKS=[{
      #     "url": "http://localhost:3001",
      #     "accessToken": "notaccesstoken",
      #     "events": ["cardCreate", "cardUpdate", "cardDelete"],
      #     "excludedEvents": ["notificationCreate", "notificationUpdate"]
      #   }]

      # - SLACK_BOT_TOKEN=
      # - SLACK_CHANNEL_ID=

      # - GOOGLE_CHAT_WEBHOOK_URL=

      # - TELEGRAM_BOT_TOKEN=
      # - TELEGRAM_CHAT_ID=
      # - TELEGRAM_THREAD_ID=
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:16-alpine
    restart: on-failure
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=planka
      - POSTGRES_HOST_AUTH_METHOD=trust
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d planka"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  user-avatars:
  project-background-images:
  attachments:
  db-data:

Any ideas? All i get is;

404 page not found

You can’t use providers.docker when Traefik is not in Docker, as it tries to use the IPs within the Docker Network, which it has no access to.

So you need to manually create a dynamic config file with routers and services and load it with providers.file in static config.

Are you certain? I had thought it might be a docker issue, but it correctly detected the bridge ip and port number.

http://172.18.0.3:1337

Which traefik can access. I can curl it on the machine and it works as intended.

I was certain, until you came along :sweat_smile:

Let’s start easy, what does Traefik dashboard tell you?

I'm not sure?

Everything is green across the board. It detects the docker and the bridge ip. It detects the router... There are no errors reported.

It's even serving https properly with my certs I provided. It just serves it with 404.

Is there a specific item in the dashboard I should look for?

It seems a bit strange, you access via https://projects.example.com. This matches Host() rule, but still no target service is found.

And you say the dashboard shows the service.

means the error is not from target service, but generated by Traefik directly.

You should set exposedByDefault: false as you probably don’t want your DB to be accessed externally.

This whole thing is strange. I may try traefik in a docker to see if that magically fixes it.

I did have expose by default turned off... I turned it on to see if it would fix it.

So I've spun up a docker with traefik. It's doing the exact same thing. No idea what's causing this. The request in traefik's access logs say the request host is projects.example.com. Debug log and dashboard both say traefik is looking for a host(projects.example.com). Yet it doesn't seem to be matching the two at all. I just get a 404.

Have you tried running simple Traefik example?