docker run -d\--name cf-tunnel-ui \--restart unless-stopped \-p 127.0.0.1:8080:8080 \-eCF_TUNNEL_UI_CLOUDFLARE_API_TOKEN="${CF_API_TOKEN}"\-eCF_TUNNEL_UI_CLOUDFLARE_ACCOUNT_ID="${CF_ACCOUNT_ID}"\-eCF_TUNNEL_UI_CLOUDFLARE_EMAIL="${CF_EMAIL}"\-eCF_TUNNEL_UI_AUTH_ACCESS_TEAM_DOMAIN="${CF_TEAM_DOMAIN}"\-eCF_TUNNEL_UI_AUTH_ACCESS_AUD="${CF_ACCESS_AUD}"\
ghcr.io/vikukumar/cf-tunnel-manager:latest
Docker Compose with Cloudflare Tunnel proxy
# docker-compose.ymlservices:cf-tunnel-ui:image:ghcr.io/vikukumar/cf-tunnel-manager:latestrestart:unless-stoppedenvironment:CF_TUNNEL_UI_CLOUDFLARE_API_TOKEN:"${CF_API_TOKEN}"CF_TUNNEL_UI_CLOUDFLARE_ACCOUNT_ID:"${CF_ACCOUNT_ID}"CF_TUNNEL_UI_CLOUDFLARE_EMAIL:"${CF_EMAIL}"CF_TUNNEL_UI_AUTH_ACCESS_TEAM_DOMAIN:"${CF_TEAM_DOMAIN}"CF_TUNNEL_UI_AUTH_ACCESS_AUD:"${CF_ACCESS_AUD}"# Do NOT expose port publicly — tunnel will handle ingressexpose:-"8080"cloudflared:image:cloudflare/cloudflared:latestrestart:unless-stoppedcommand:tunnel --no-autoupdate run --token ${CLOUDFLARED_TOKEN}depends_on:-cf-tunnel-ui
# Pull specific version
docker pull ghcr.io/vikukumar/cf-tunnel-manager:v1.0.0
# Check available tags
docker pull ghcr.io/vikukumar/cf-tunnel-manager:latest
Security Considerations
Never expose port 8080 directly to the internet without authentication
Use Cloudflare Access to protect the UI (see Getting Started)
Store API tokens in secrets management (Kubernetes Secrets, Vault, etc.)
Run as non-root user — the Docker image uses nonroot:nonroot
The binary has no setuid bits and drops all capabilities at startup