Tailscale (Gateway dashboard)
Equabot can auto-configure Tailscale Serve (tailnet) or Funnel (public) for the Gateway dashboard and WebSocket port. This keeps the Gateway bound to loopback while Tailscale provides HTTPS, routing, and (for Serve) identity headers.Modes
serve: Tailnet-only Serve viatailscale serve. The gateway stays on127.0.0.1.funnel: Public HTTPS viatailscale funnel. Equabot requires a shared password.off: Default (no Tailscale automation).
Auth
Setgateway.auth.mode to control the handshake:
token(default whenEQUABOT_GATEWAY_TOKENis set)password(shared secret viaEQUABOT_GATEWAY_PASSWORDor config)
tailscale.mode = "serve" and gateway.auth.allowTailscale is true,
valid Serve proxy requests can authenticate via Tailscale identity headers
(tailscale-user-login) without supplying a token/password. Equabot only
treats a request as Serve when it arrives from loopback with Tailscale’s
x-forwarded-for, x-forwarded-proto, and x-forwarded-host headers.
To require explicit credentials, set gateway.auth.allowTailscale: false or
force gateway.auth.mode: "password".
Device pairing (Serve)
Remote devices connecting via Tailscale Serve still require device pairing, the same as any non-local device. Tailscale identity headers handle authentication, but the device itself must be paired before it can establish a session. On the first connection from a new browser or device:- The gateway creates a pairing request and closes the connection.
- Approve the request from the local Control UI (or any already-paired session).
- The remote device reconnects and succeeds.
127.0.0.1 / ::1) auto-approve pairing silently.
Serve connections do not, because the real client IP is the remote tailnet peer.
Config examples
Tailnet-only (Serve)
127.0.0.1, injecting
X-Forwarded-For headers. Adding trustedProxies: ["127.0.0.1"] tells the
gateway to trust those headers for client IP detection. Without it, connections
log “Proxy headers detected from untrusted address” warnings and proxy headers
are ignored.
Serve setup checklist:
- Set
gateway.tailscale.mode: "serve"andgateway.trustedProxies: ["127.0.0.1"]. - Restart the gateway.
- Open the Control UI from the remote device via
https://<magicdns>/. - Approve the device pairing prompt from the local Control UI.
- Verify: look for
[tailscale] serve enabledin the gateway log and confirm notoken_mismatchorpairing requirederrors.
https://<magicdns>/ (or your configured gateway.controlUi.basePath)
Tailnet-only (bind to Tailnet IP)
Use this when you want the Gateway to listen directly on the Tailnet IP (no Serve/Funnel).- Control UI:
http://<tailscale-ip>:18789/ - WebSocket:
ws://<tailscale-ip>:18789
http://127.0.0.1:18789) will not work in this mode.
Public internet (Funnel + shared password)
EQUABOT_GATEWAY_PASSWORD over committing a password to disk.
CLI examples
Notes
- Tailscale Serve/Funnel requires the
tailscaleCLI to be installed and logged in. tailscale.mode: "funnel"refuses to start unless auth mode ispasswordto avoid public exposure.- Set
gateway.tailscale.resetOnExitif you want Equabot to undotailscale serveortailscale funnelconfiguration on shutdown. gateway.bind: "tailnet"is a direct Tailnet bind (no HTTPS, no Serve/Funnel).gateway.bind: "auto"prefers loopback; usetailnetif you want Tailnet-only.- Serve/Funnel only expose the Gateway control UI + WS. Nodes connect over the same Gateway WS endpoint, so Serve can work for node access.
Browser control server (remote Gateway + local browser)
If you run the Gateway on one machine but want to drive a browser on another machine, use a separate browser control server and publish it through Tailscale Serve (tailnet-only):Tailscale prerequisites + limits
- Serve requires HTTPS enabled for your tailnet; the CLI prompts if it is missing.
- Serve injects Tailscale identity headers; Funnel does not.
- Funnel requires Tailscale v1.38.3+, MagicDNS, HTTPS enabled, and a funnel node attribute.
- Funnel only supports ports
443,8443, and10000over TLS. - Funnel on macOS requires the open-source Tailscale app variant.
Learn more
- Tailscale Serve overview: https://tailscale.com/kb/1312/serve
tailscale servecommand: https://tailscale.com/kb/1242/tailscale-serve- Tailscale Funnel overview: https://tailscale.com/kb/1223/tailscale-funnel
tailscale funnelcommand: https://tailscale.com/kb/1311/tailscale-funnel