Every Traefik service you expose already has a Host() rule that declares its public hostname. That information exists exactly once β in a Docker label β and propagates nowhere useful.
So you end up maintaining three or four systems by hand: Cloudflare for public DNS, NetBird for internal VPN-only hostnames, Uptime Kuma for monitoring β with groups, tags, and status pages configured per service. Add a container and you need to update everything manually. Remove it 4 months later and those records stay unless you remember to clean them up.
traefik-mesh-companion makes the container definition the single source of truth and syncs the rest automatically.
What It Does
A Go sidecar that watches the Docker socket and syncs your Traefik routing labels to:
NetBird β internal mesh VPN DNS records
Cloudflare β A records or CNAMEs to a CF Tunnel endpoint
Uptime Kuma β monitors, status page groups, tags, domain bindings
Gatus (via Gatus Bridge) β endpoints and groups
A single Docker Compose sidecar.β¦