Docker Compose Sanity Checker?

Does anyone know of a "sanity checker" for traefik docker compose yamls? I have been struggling with the dashboard and a single service for two days now:

version: '3.8'
services:
  traefik:
    image: "docker.io/library/traefik:v2.10.5"
    container_name: "traefik2"
    restart: "always"
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/etc/letsencrypt/archive/dev.acumenus.net/:/etc/certs:ro"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/portainer/Files/AppData/Config/traefik/config.yml:/etc/traefik/config.yml:ro"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.acumenus.net`)"
      - "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"
      # Basic Auth for Traefik Dashboard
      - "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth"
      # Use htpasswd to create a user/pass pair
      - "traefik.http.middlewares.dashboard-auth.basicauth.users=*******:********"  
    networks:
      - traefik-proxy
  heimdall:
    image: "linuxserver/heimdall:latest"
    container_name: "heimdall"
    restart: "always"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York # Replace with your timezone
      - APP_NAME=Parthenon
    volumes:
      - "/portainer/Files/AppData/Config/Heimdall:/config"
      - "/portainer/Files/AppData/Config/Heimdall/favicons/favicon-16x16.png:/var/www/localhost/heimdall/public/favicon-16x16.png"
      - "/portainer/Files/AppData/Config/Heimdall/favicons/favicon-32x32.png:/var/www/localhost/heimdall/public/favicon-32x32.png"
      - "/portainer/Files/AppData/Config/Heimdall/favicons/favicon.ico:/var/www/localhost/heimdall/public/favicon.ico"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.heimdall.rule=Host(`dev.acumenus.net`)"
      - "traefik.http.services.heimdall.loadbalancer.server.port=80"
    networks:
      - traefik-proxy
networks:
  traefik-proxy:
    external: true

404 on the Traefik dashboard.

Something worked briefly and then it didn't.
Any help/guidance would be greatly appreciated.

Start by formatting your code with 3 backticks in front and after or select it and use the </> button. It improves readability and in yaml every space matters.

Roger that. Thanks for the tip.

version: '3.8'

services:
  traefik:
    image: "docker.io/library/traefik:v2.10.5"
    container_name: "traefik2"
    restart: "always"
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.email=me@mac.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/portainer/Files/AppData/Config/traefik/config.yml:/etc/traefik/config.yml:ro"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.acumenus.net`)"
      - "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"
      - "traefik.http.routers.traefik-dashboard.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik-dashboard.middlewares=dashboard-auth"
      - "traefik.http.middlewares.dashboard-auth.basicauth.users=*******:*******"

    networks:
      - traefik-proxy

  heimdall:
    image: "linuxserver/heimdall:latest"
    container_name: "heimdall"
    restart: "always"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York # Replace with your timezone
      - APP_NAME=Parthenon
    volumes:
      - "/portainer/Files/AppData/Config/Heimdall:/config"
      - "/portainer/Files/AppData/Config/Heimdall/favicons/favicon-16x16.png:/var/www/localhost/heimdall/public/favicon-16x16.png"
      - "/portainer/Files/AppData/Config/Heimdall/favicons/favicon-32x32.png:/var/www/localhost/heimdall/public/favicon-32x32.png"
      - "/portainer/Files/AppData/Config/Heimdall/favicons/favicon.ico:/var/www/localhost/heimdall/public/favicon.ico"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.heimdall.rule=Host(`dev.acumenus.net`)"
      - "traefik.http.routers.heimdall.entrypoints=websecure"
      - "traefik.http.routers.heimdall.tls.certresolver=myresolver"
      - "traefik.http.routers.heimdall.middlewares=redirect-to-https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"

      - "traefik.http.services.heimdall.loadbalancer.server.port=80"
    networks:
      - traefik-proxy

networks:
  traefik-proxy:

    external: true
    driver: overlay
    attachable: true

This solved my problem after much tinkering. Posted for others who wish to integrate Heimdall, though I am sure that many have already accomplished this. Please note that SSL is through Hostinger who are not on the TLS challenge list for Let's Encrypt as a DNS provider.

For simplicity, you can place the http->https redirect and the certresolver globally on the entrypoint, see simple Traefik example.