Traefik Let’s Encrypt and Step-CA, 1 yaml file per subdomain

I’m trying to setup traefik, moving from nginx proxy manager.

This is /etc/traefik/traefik.yaml


# observability


api: {}

global:
  checkNewVersion: true
  sendAnonymousUsage: true    # send anonymous usage data

accesslog:
 addInternals: true
 filePath: "/var/log/traefik-access.log"
 bufferingSize: 128

log:
 filePath: "/var/log/traefik.log"
 level: INFO    # TRACE DEBUG INFO WARN ERROR FATAL PANIC
 maxAge: 48

metrics:
 addInternals: true



# environment


entryPoints:
 http:
   address: ":80"
   http:
     middlewares:
       - internal-hosts-endorsed
 https:
  address: ":443"
  http:
    middlewares:
       - internal-hosts-endorsed
    tls:
      certResolver: letsEncrypt
      domains:
        - main: "mydomain.com"
          sans:
            - "*.mydomain.com"
providers:
 file:
   directory: /etc/traefik/dynamic
   watch: true

certificatesResolvers:
  letsEncrypt:
    acme:
      email: david@mydomain.com
      storage: /etc/traefik/acme/letsencrypt-acme.json
      #caServer: https://acme-v02.api.letsencrypt.org/directory # production (default)
      caServer: https://acme-staging-v02.api.letsencrypt.org/directory # staging
      dnsChallenge:
        provider: cloudflare
        delayBeforeCheck: 10 #Optional to wait x second before checking with the DNS Server
  stepca:
    acme:
      email: david@mydomain.com
      storage: "/etc/traefik/acme/stepca-acme.json"
      caServer: "https://ca.mydomain.com:9000/acme/acme/directory"
      certificatesDuration: 2160
      dnsChallenge:
        provider: technitium
        disablePropagationCheck: true
        delayBeforeCheck: 5
        resolvers:
          - "192.168.2.113:53"

This is /etc/traefik/dynamic/core.yaml

http:

  routers:

   
    dashboard:
      rule: Host(`traefik.mydomain.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
      service: api@internal
      middlewares:
        - auth

   
   
    catchall:
      entryPoints:
        - http
        - https
      rule: PathPrefix(`/`)
      service: unavailable
      priority: 1

  services:
   
    unavailable:
      loadBalancer:
        servers: {}

  middlewares:

    auth:
      basicAuth:
        users:   
          - david:$1$bXGAceOu$1zRJMvh60HR5n6.q2B8io0

    internal-hosts-endorsed:
      ipAllowList:
        sourceRange:
          - 192.168.2.0/24
          - 10.0.0.0/24

    http-only:
      redirectScheme:
        scheme: http
        permanent: true

    internal-http-hosts:
      chain:
        middlewares:
          - internal-hosts-endorsed
          - http-only

    https-only:
      redirectScheme:
        scheme: https
        permanent: true

   
   
    internal-https-hosts:
      chain:
        middlewares:
          - internal-hosts-endorsed
          - https-only

tls:
  options:
    default:
      minVersion: VersionTLS13   
      curvePreferences:  
        - X25519    
        - CurveP256 
        - CurveP384 
        - CurveP521 
      sniStrict: true    

  stores:
    default:
      defaultGeneratedCert:
        resolver: letsEncrypt
        domain:
          main: mydomain.com
          sans:
            - '*.mydomain.com'

and I have subdomains like

/etc/traefik/dynamic/jellyseerr.yaml

# Traefik Configuration for jellyseerr_mydomain_com
#jellyseerr.mydomain.com
http:
  routers:
    jellyseerr:
      rule: "Host(`jellyseerr.mydomain.com`)"
      service: jellyseerr-service
      entryPoints:
      - http
      - https
      tls:
        certResolver: letsEncrypt

  services:
    jellyseerr-service:
      loadBalancer:
        servers:
          - url: "http://192.168.2.102:5055"

/etc/traefik/dynamic/jellyfin.yaml

# Traefik Configuration for jellyfin_mydomain_com
#jellyfin.mydomain.com
http:
  routers:
    jellyfin:
      rule: "Host(`jellyfin.mydomain.com`)"
      service: jellyfin-service
      entryPoints:
        - https
      tls:
        certResolver: letsEncrypt

  services:
    jellyfin-service:
      loadBalancer:
        servers:
          - url: "http://192.168.2.101:8096"

How can I make traefik request a single wildcard certificate?

root@traefik:~# cat /var/log/traefik.log

2024-12-17T21:52:16+01:00 INF Traefik version 3.2.3 built on 2024-12-16T10:31:50Z version=3.2.3
2024-12-17T21:52:16+01:00 INF Stats collection is enabled.
2024-12-17T21:52:16+01:00 INF Many thanks for contributing to Traefik's improvement by allowing us to receive anonymous information from your configuration.
2024-12-17T21:52:16+01:00 INF Help us improve Traefik by leaving this feature on :)
2024-12-17T21:52:16+01:00 INF More details on: https://doc.traefik.io/traefik/contributing/data-collection/
2024-12-17T21:52:16+01:00 INF Starting provider aggregator *aggregator.ProviderAggregator
2024-12-17T21:52:16+01:00 INF Starting provider *file.Provider
2024-12-17T21:52:16+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T21:52:16+01:00 INF Starting provider *traefik.Provider
2024-12-17T21:52:16+01:00 INF Starting provider *acme.ChallengeTLSALPN
2024-12-17T21:52:16+01:00 INF Starting provider *acme.Provider
2024-12-17T21:52:16+01:00 INF Testing certificate renew... acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory providerName=letsEncrypt.acme
2024-12-17T21:52:16+01:00 INF Starting provider *acme.Provider
2024-12-17T21:52:16+01:00 INF Testing certificate renew... acmeCA=https://ca.mydomain.com:9000/acme/acme/directory providerName=stepca.acme
2024-12-17T21:52:17+01:00 ERR Error while creating certificate store error="unable to find certificate for domains "*.mydomain.com,mydomain.com": falling back to the internal generated certificate" tlsStoreName=default
2024-12-17T21:52:17+01:00 WRN No domain found in rule PathPrefix(`/`), the TLS options applied for this router will depend on the SNI of each request entryPointName=https routerName=https-catchall@file
2024-12-17T21:52:22+01:00 INF Register... providerName=letsEncrypt.acme
2024-12-17T21:52:24+01:00 INF Register... providerName=stepca.acme
2024-12-17T21:52:37+01:00 ERR Error while creating certificate store error="unable to find certificate for domains "*.mydomain.com,mydomain.com": falling back to the internal generated certificate" tlsStoreName=default
2024-12-17T21:52:37+01:00 WRN No domain found in rule PathPrefix(`/`), the TLS options applied for this router will depend on the SNI of each request entryPointName=https routerName=https-catchall@file
2024-12-17T21:52:38+01:00 ERR Error while creating certificate store error="unable to find certificate for domains "*.mydomain.com,mydomain.com": falling back to the internal generated certificate" tlsStoreName=default
2024-12-17T21:52:38+01:00 WRN No domain found in rule PathPrefix(`/`), the TLS options applied for this router will depend on the SNI of each request entryPointName=https routerName=https-catchall@file
2024-12-17T21:56:32+01:00 ERR Unable to obtain ACME certificate for domain error="unable to generate a certificate for the domains [mydomain.com *.mydomain.com]: error: one or more domains had a problem:n[*.mydomain.com] propagation: time limit exceeded: last error: authoritative nameservers: DNS call error: dial udp: lookup technitiumdns. on 192.168.2.113:53: no such host [ns=technitiumdns.:53, question='_acme-challenge.mydomain.com. IN  TXT']n[mydomain.com] propagation: time limit exceeded: last error: authoritative nameservers: DNS call error: dial udp: lookup technitiumdns. on 192.168.2.113:53: no such host [ns=technitiumdns.:53, question='_acme-challenge.mydomain.com. IN  TXT']n" ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["mydomain.com","*.mydomain.com"] providerName=letsEncrypt.acme tlsStoreName=default
2024-12-17T22:10:03+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:03+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:12+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:12+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:12+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:19+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:19+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:19+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:19+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:22+01:00 WRN HTTP servers transport already configured, skipping filename=proxmox.yaml providerName=file serversTransport=insecureTransport
2024-12-17T22:10:23+01:00 ERR Error while creating certificate store error="unable to find certificate for domains "*.mydomain.com,mydomain.com": falling back to the internal generated certificate" tlsStoreName=default
2024-12-17T22:10:26+01:00 WRN No domain found in rule PathPrefix(`/`), the TLS options applied for this router will depend on the SNI of each request entryPointName=https routerName=https-catchall@file
2024-12-17T22:10:49+01:00 WRN No domain found in rule PathPrefix(`/`), the TLS options applied for this router will depend on the SNI of each request entryPointName=https routerName=https-catchall@file

Why does it looks like it’s mixing lets encrypt with technitium?