Requirements (read first)
- Ubuntu host with Docker Engine + Compose plugin.
- Cloudflare DNS records set to your host public IP (DNS-only mode for ACME issuance).
- A routable public IPv4, not CGNAT. This track exposes the host directly, so CGNAT breaks everything, not just voice. Step 2 shows how to check.
- Router/firewall forwards to the host's LAN IP:
80/tcp+443/tcp(Caddy TLS/HTTP) and44382/udp+44381/tcp(LiveKit media). All a manual router step.