4.8 KiB
Cloudflare Tunnel
Cloudflare Tunnel is used in two DorkNet workflows:
- Local standalone testing, where cloudflared forwards
*.localhosttraffic to a locally runningDorkNet.Server. The default origin ishttp://localhost:8080; use local HTTPS only when you intentionally run the standalone server with a wildcard dev certificate. - Dokploy production microservices, where the compose sidecar forwards
the apex and wildcard hostnames to
http://gateway:8080.
Both avoid opening ports directly on the host and let Cloudflare serve a public TLS certificate at the edge.
Local Standalone Tunnel
Use this when you are running the standalone server locally and want friends to reach it through Cloudflare.
- You want a friend to play the patched 2020 Rec Room client against your server, but they're not on your LAN and don't want to install your local CA.
- You want
https://admin.localhost/https://feed.localhostreachable from any browser, not just yours.
Prerequisites
localhostis on a Cloudflare account you control. The DNS nameservers for the domain need to be Cloudflare's. Check at https://dash.cloudflare.com/ — the zone should be Active.- Local standalone server running. The current quickstart listens
on
http://localhost:8080. Older local TLS setups can still run on0.0.0.0:443with a wildcard certificate that covers*.localhost. - Patched client with
tools/patch-domain.ps1so the in-game URLs resolve to*.localhost. (Players using the public deployment need to run this on their own client too.)
One-shot setup
PS C:\…\Recnet> .\tools\setup-cloudflared.ps1
The script:
- Installs
cloudflaredvia winget if missing. - Runs
cloudflared tunnel login— opens a browser, you pick thelocalhostzone, Cloudflare dropscert.peminto%USERPROFILE%\.cloudflared\. - Creates a named tunnel called
dorknet(or reuses one if it already exists). - Generates
%USERPROFILE%\.cloudflared\config.ymlfrom thetools/cloudflared-config.yml.templatetemplate, filling in the tunnel id and credentials path. - Adds DNS CNAMEs for every localhost subdomain DorkNet uses (api, auth, accounts, match, notify, ns, admin, feed, …).
Run the tunnel
Foreground (for testing — Ctrl+C to stop):
cloudflared tunnel run dorknet
Or install as a Windows service so it survives reboots:
cloudflared service install
Dokploy Microservices Sidecar
For Dokploy microservices, use
docker-compose.microservices.dokploy.yml. It starts cloudflared in
the same Compose network as gateway, so the tunnel origin is:
http://gateway:8080
Set CLOUDFLARE_TUNNEL_TOKEN in Dokploy from the Cloudflare Zero Trust
tunnel token. In the Cloudflare tunnel's public hostnames, add:
yourdomain.com -> http://gateway:8080
*.yourdomain.com -> http://gateway:8080
Do not add these domains in Dokploy's domain modal for this compose stack; Cloudflare owns the public hostname routing.
What Happens At Request Time
Local standalone tunnel:
visitor -> https://api.localhost/api/versioncheck/v4
-> Cloudflare edge
-> cloudflared tunnel
-> cloudflared running on your machine
-> http://localhost:8080 (Host preserved)
-> DorkNet.Server
Dokploy microservices tunnel:
visitor -> https://api.yourdomain.com/api/versioncheck/v4
-> Cloudflare edge
-> cloudflared sidecar
-> http://gateway:8080 (Host preserved)
-> DorkNet.Gateway reverse proxy
-> dedicated service slice or monolith fallback
For default local testing, point the local cloudflared origin at
http://localhost:8080. If you intentionally test a local HTTPS origin,
the leg from cloudflared to localhost can use noTLSVerify: true
because that certificate is usually from a private dev CA. The
Cloudflare-edge to cloudflared leg is still TLS-encrypted with
Cloudflare's cert. In the Dokploy microservices stack, the tunnel
sidecar uses plain HTTP on the private Compose network and sends
everything to the gateway.
Tearing down
cloudflared service uninstall # if you ran service install
cloudflared tunnel delete dorknet
DNS records left behind in the Cloudflare dashboard need to be deleted manually if you want them gone.
Limits / caveats
- Photon traffic is NOT proxied. Cloudflare Tunnel is HTTP-only;
the realtime Photon connection still hits the public Photon Cloud
directly, with the AppId from your
appsettings.json. That's fine — Photon doesn't go through your server. - WebSocket support is on by default in modern cloudflared, so the SignalR notify hub works through the tunnel.
- Free tier rate limits — Cloudflare Free is generous for a small private server but watch the dashboard if you scale up.