Control plane domains and SSL
TLS certificates and hostnames for the self-hosted dashboard and Traefik (control plane).
Written By Zoro
Last updated 3 days ago
This page is about the dashboard and Traefik stack you run for self-hosted dFlow.
It is not about custom domains for individual Services your teams deploy; for that, read Domains and SSL under Deployments and Operations in the sidebar in Deployments and Operations.
1. Decide hostnames
Pick a stable hostname (or wildcard) for the UI, for example dflow.company.internal or control.company.com. Set NEXT_PUBLIC_WEBSITE_URL to the full origin users will open (including https: when TLS is enabled).
Align WILD_CARD_DOMAIN and NEXT_PUBLIC_PROXY_DOMAIN_URL with the same DNS plan so generated proxy config and UI links stay consistent.
2. DNS records
- A or AAAA records pointing to the load balancer or VM that runs Traefik, or
- CNAME to an elastic hostname if your cloud provides one.
For Let's Encrypt DNS-01 via Cloudflare, create the API token referenced as CF_DNS_API_TOKEN in docker-compose.yml with only the zones you need.
3. Traefik static and dynamic config
The reference Compose file mounts:
./traefik.yamlas the static config./acme.jsonfor ACME account and certificates./dynamicfor generated routes
Operators must supply files appropriate to their environment. Common tasks:
- Create an empty
acme.jsonon the host andchmod 600 acme.jsonbefore the first Traefik start. - Point certificate resolvers at your DNS provider (for example Cloudflare).
- Route the dashboard router to the
payload-appservice port Traefik expects (follow yourtraefik.yaml).
If your checkout does not include a committed traefik.yaml, copy or create one from your deployment playbook; the exact contents are site-specific.
4. First certificate issuance
- Bring
traefikup with valid env and config. - Confirm DNS has propagated to the challenge names (HTTP-01 or DNS-01).
- Watch
traefiklogs for ACME success before sending users to HTTPS.
5. Renewal and rotation
Traefik renews certificates automatically when acme.json is writable and DNS credentials remain valid. Put acme.json on persistent storage if the VM is ephemeral. After rotating CF_DNS_API_TOKEN, restart Traefik.
6. Split horizon and internal CA
Some teams terminate TLS on a corporate proxy and run HTTP internally. If you do that, still set NEXT_PUBLIC_WEBSITE_URL to what browsers use externally, and ensure the proxy forwards WebSockets if the dashboard requires them.
Related
- Environment configuration
- Tailscale and networking
- Domain and SSL issues (workload-focused, still useful for DNS debugging habits)
- Self-hosting troubleshooting