services: cloudflared: image: cloudflare/cloudflared:latest restart: always command: tunnel --no-autoupdate --protocol ${CLOUDFLARED_PROTOCOL:-auto} run --token-file /etc/cloudflared/token volumes: - cf_token_data:/etc/cloudflared networks: - cf-tunnel-net extra_hosts: - "host.docker.internal:host-gateway" cf-tunnel-sync: image: hapheus/cf-tunnel-sync:latest build: context: . dockerfile: cf-tunnel-sync/Dockerfile restart: always environment: - CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN} - DOMAIN_NAME=${DOMAIN_NAME} - CLOUDFLARE_TUNNEL_NAME=${CLOUDFLARE_TUNNEL_NAME:-cf-docker-tunnel-sync} - CLOUDFLARE_ACCOUNT_ID=${CLOUDFLARE_ACCOUNT_ID:-} - CLOUDFLARED_CONTAINER_NAME=${CLOUDFLARED_CONTAINER_NAME:-} - DASHBOARD_AUTH_ENABLED=${DASHBOARD_AUTH_ENABLED:-true} - DASHBOARD_USERNAME=${DASHBOARD_USERNAME:-${BASIC_AUTH_USERNAME:-}} - DASHBOARD_PASSWORD=${DASHBOARD_PASSWORD:-${BASIC_AUTH_PASSWORD:-}} - BASIC_AUTH_USERNAME=${BASIC_AUTH_USERNAME:-} - BASIC_AUTH_PASSWORD=${BASIC_AUTH_PASSWORD:-} - SYNC_FALLBACK_INTERVAL=${SYNC_FALLBACK_INTERVAL:-900} volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - cf_token_data:/etc/cloudflared ports: - "${DASHBOARD_BIND_ADDRESS:-0.0.0.0}:${DASHBOARD_PORT:-8080}:8090" networks: - cf-tunnel-net healthcheck: test: ["CMD", "python", "healthcheck.py"] interval: 10s timeout: 5s retries: 3 start_period: 5s # Optional companion Nginx dashboard UI (uncomment if companion frontend container is desired) # cf-tunnel-dashboard: # image: hapheus/cf-tunnel-dashboard:latest # build: # context: ./cf-tunnel-dashboard # dockerfile: Dockerfile # restart: always # environment: # - BASIC_AUTH_USERNAME=${BASIC_AUTH_USERNAME:-admin} # - BASIC_AUTH_PASSWORD=${BASIC_AUTH_PASSWORD:-changeme} # - SYNC_BACKEND_HOST=cf-tunnel-sync # - SYNC_BACKEND_PORT=8090 # ports: # - "${DASHBOARD_BIND_ADDRESS:-0.0.0.0}:${DASHBOARD_PORT:-8080}:80" # networks: # - cf-tunnel-net # healthcheck: # test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:80/health || exit 1"] # interval: 10s # timeout: 5s # retries: 3 # start_period: 2s # Example Service (uncomment to test) # web-example: # image: nginx:alpine # labels: # - "cf.tunnel.hostname=hello.${DOMAIN_NAME}" # - "cf.tunnel.port=80" # networks: # - cf-tunnel-net networks: cf-tunnel-net: name: ${CF_NETWORK_NAME:-cf-tunnel-net} driver: bridge volumes: cf_token_data: