404 on Dashboard


Not able to understand why I get 404 when trying to reach Traefik v2 on 443 80 or even 8080
Even locally I get the 404 Page not found.
Let me know if this is the correct way. I followed a guide, since its the first time I use Traefik.

Let me know if anything else is needed.


I attached my traefik docker-compose

version: "3.7"

########################### NETWORKS
      name: t2_proxy
    driver: bridge

########################### SERVICES
# All services / apps go below this line

# Traefik 2 - Reverse Proxy
    container_name: traefik
    image: traefik:chevrotin # the chevrotin tag refers to v2.2.x
    restart: unless-stopped
    command: # CLI arguments
      - --global.checkNewVersion=true
      - --global.sendAnonymousUsage=true
      - --entryPoints.http.address=:80
      - --entryPoints.https.address=:443
        # Allow these IPs to set the X-Forwarded-* headers - Cloudflare IPs: https://www.cloudflare.com/ips/
      - --entrypoints.https.forwardedHeaders.trustedIPs=,,,,,,,,,,,,,
      - --entryPoints.traefik.address=:8080
      - --api=true
#      - --api.insecure=true
#      - --serversTransport.insecureSkipVerify=true
      - --log=true
      - --log.level=DEBUG # (Default: error) DEBUG, INFO, WARN, ERROR, FATAL, PANIC
      - --accessLog=true
      - --accessLog.filePath=/traefik.log
      - --accessLog.bufferingSize=100 # Configuring a buffer of 100 lines
      - --accessLog.filters.statusCodes=400-499
      - --providers.docker=true
      - --providers.docker.endpoint=unix:///var/run/docker.sock
      - --providers.docker.defaultrule=Host(`{{ index .Labels "com.docker.compose.service" }}.$DOMAINNAME`)
      - --providers.docker.exposedByDefault=false
      - --providers.docker.network=t2_proxy
      - --providers.docker.swarmMode=false
      - --providers.file.directory=/rules # Load dynamic configuration from one or more .toml or .yml files in a directory.
#      - --providers.file.filename=/path/to/file # Load dynamic configuration from a file.
      - --providers.file.watch=true # Only works on top level files in the rules folder
      - --certificatesResolvers.dns-cloudflare.acme.caServer=https://acme-staging-v02.api.letsencrypt.org/directory # LetsEncrypt Staging Server - uncomment when testing
      - --certificatesResolvers.dns-cloudflare.acme.email=$CLOUDFLARE_EMAIL
      - --certificatesResolvers.dns-cloudflare.acme.storage=/acme.json
      - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.provider=cloudflare
      - --certificatesResolvers.dns-cloudflare.acme.dnsChallenge.resolvers=,
        ipv4_address: # You can specify a static IP
#    networks:
#      - t2_proxy
      - no-new-privileges:true
      - target: 80
        published: 80
        protocol: tcp
        mode: host
      - target: 443
        published: 443
        protocol: tcp
        mode: host
      - target: 8080
        published: 8080
        protocol: tcp
        mode: host
      - $USERDIR/docker/traefik2/rules:/rules 
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - $USERDIR/docker/traefik2/acme/acme.json:/acme.json 
      - $USERDIR/docker/traefik2/traefik.log:/traefik.log 
      - $USERDIR/docker/shared:/shared
      - "traefik.enable=true"
      # HTTP-to-HTTPS Redirect
      - "traefik.http.routers.http-catchall.entrypoints=http"
      - "traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)"
      - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      # HTTP Routers
      - "traefik.http.routers.traefik-rtr.entrypoints=https"
      - "traefik.http.routers.traefik-rtr.rule=Host(`traefik.$DOMAINNAME`)"
      - "traefik.http.routers.traefik-rtr.tls=true"
      - "traefik.http.routers.traefik-rtr.tls.certresolver=dns-cloudflare" # Comment out this line after first run of traefik to force the use of wildcard certs
      - "traefik.http.routers.traefik-rtr.tls.domains[0].main=$DOMAINNAME"
      - "traefik.http.routers.traefik-rtr.tls.domains[0].sans=*.$DOMAINNAME"
#      - "traefik.http.routers.traefik-rtr.tls.domains[1].main=$SECONDDOMAINNAME" # Pulls main cert for second domain
#      - "traefik.http.routers.traefik-rtr.tls.domains[1].sans=*.$SECONDDOMAINNAME" # Pulls wildcard cert for second domain
      ## Services - API
      - "traefik.http.routers.traefik-rtr.service=api@internal"
      ## Middlewares
      - "traefik.http.routers.traefik-rtr.middlewares=middlewares-basic-auth@file" 

and the middlewares.toml

#      username=user, password=mystrongpassword (listed below after hashing)
#      users = [
#        "user:$apr1$bvj3f2o0$/01DGlduxK4AqRsTwHnvc1",
#      ]
      realm = "Traefik2 Basic Auth"
      usersFile = "/shared/.htpasswd" #be sure to mount the volume through docker-compose.yml

How are you testing ?

I would docker inspect your container and check the labels. Incorrectly setting/exporting DOMAINNAME could result in the route not being matched.

Check the logs for errors also.

1 Like

Thanks Ill start with that.
In regards of the logs... They not always show data...
Is there specific logs other than the access ones?


Yes. docker logs your_container_name unless you are doing something special with your container logs.

Like any well behaved container it logs to stdout.

Thanks... I'm in the learning curve and a bit lost with all the different things to learn while I set everything.
I read and tried different things before I posted mine. Thanks for the tips. Ill look around and report!

I did some validation and even reviewed all the labes and config.
Also tried to simplify the *.yml using the ones from this blog:


Same issue receiving an 404 page not found simply using the following yml

version: "3.3"

    image: "traefik:v2.0.1"
      - --entrypoints.web.address=:80
      - --providers.docker
      - --api.insecure
      - "80:80"
      - "8080:8080"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

    image: containous/whoami:v1.3.0

# Dashboard (https://localhost:8080)

And logs don't show anything.

so back to square one

The uri to access the dashboard requires the path and a trailing slash.


Yes, with or without the slash I get a 404 or a Problem loading page.

I'm planning on building a scratch image just to restart from blank and see if I did something wrong.
Any guide I could follow to be sure I don't miss anything? Thanks

I ran the simple compose file verbatim:

 curl -i
HTTP/1.1 302 Found
Content-Type: text/html; charset=utf-8
Location: /dashboard/
Date: Wed, 20 May 2020 11:20:52 GMT
Content-Length: 34

<a href="/dashboard/">Found</a>.

I forgot that in insecure more that localhost:8080/ will redirect to the dashboard.also.

I ran the command and yes I get the following
HTTP/1.1 302 Found
Content-Type: text/html; charset=utf-8
Location: /dashboard/
Date: Wed, 20 May 2020 15:49:51 GMT
Content-Length: 34

You should be able to hit that with a browser too and see the Traefik Dashboard.

It works locally... but not remotely

I was reviewing different documents and I have a question.
Could it be related to the way my Domain is setup?
My domain is pointing to cloudflare and cloudflare pointing to my server.
Is this right?

I was able to confirm my domain pointing to my server. All good.
When I reach Traefik dashboard on 8080 all working
But when reaching 81 I get the 404.

This is my traefik file

version: "3.3"

    image: "traefik:v2.0.1"
      - --entrypoints.web.address=:81
      - --providers.docker
      - --api.insecure
      - "81:81"
      - "8080:8080"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

    image: containous/whoami:v1.3.0

# Dashboard (https://localhost:8080)

The results from the curl command:

HTTP/1.1 404 Not Found
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Fri, 22 May 2020 03:33:45 GMT
Content-Length: 19

404 page not found

I'm I missing something?


my-app does not have a routing rule. At the moment it will be bound to all entrypoints (web port 81) and have the default routing rule Host(`{{ normalize .Name }}`) ( this is still magic to me)

You should add a rule to my-app that will match. Either Host or PathPrefix would work.