docs(deploy): document Tailscale Funnel as an alternative HTTPS exposure#19
Closed
cmeans-claude-dev[bot] wants to merge 1 commit into
Closed
docs(deploy): document Tailscale Funnel as an alternative HTTPS exposure#19cmeans-claude-dev[bot] wants to merge 1 commit into
cmeans-claude-dev[bot] wants to merge 1 commit into
Conversation
Self-hosters behind CGNAT, on rotating residential IPs, or who'd rather not expose a home IP in public DNS have been left without a documented path in deploy/. Tailscale Funnel is a clean fit for the use case: routes inbound traffic from the public internet through Tailscale's relay to a localhost port, with HTTPS terminated by Tailscale, on the free Personal plan. Adds a new ## Alternative HTTPS exposure: Tailscale Funnel section positioned after the three runtime approaches (systemd / Docker / Compose) and before Required environment. The section is orthogonal to runtime — Funnel just swaps in for Caddy + Let's Encrypt + DDNS + the router port-forward, regardless of which runtime above you pick. A short cross-reference paragraph after the Pick-an-approach table points readers at it. Trade-offs documented: - URL is <device>.<tailnet>.ts.net on the free plan, locked to the tailnet (custom domains require a paid plan). - Funnel's public-facing HTTPS port must be 443, 8443, or 10000; local service can listen on any port. - Non-configurable bandwidth limits (Tailscale doesn't publish exact figures). Once-per-day JSON cached at shields.io's CDN is a non-issue. - One more daemon to keep updated; end-to-end encrypted relay so your home IP stays hidden. Five-command setup walks through tailscale install + up, systemd-run'd python3 -m http.server bound to 127.0.0.1:8443, a single tailscale funnel --bg invocation, URL discovery, and a curl smoke-check. Tear-down is two commands. Includes the URL-encoded shields.io endpoint snippet for the README badge update. CHANGELOG entry under [Unreleased] / Added describes the new section, the trade-offs documented, and the orthogonality to runtime choice. No code change; deploy/README.md + CHANGELOG.md only.
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Contributor
Author
|
Closing — CreateEvent leak under v1 bot-push design (first push of Replaced by #22 with the v2 bot-push design active (CreateEvent now attributes to Background: cmeans/claude-dev#4 deployed v2. |
6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Self-hosters behind CGNAT, on rotating residential IPs, or who'd rather not expose a home IP in public DNS have been left without a documented path in
deploy/. Tailscale Funnel is a clean fit: routes inbound public-internet traffic through Tailscale's relay to a localhost port, with HTTPS terminated by Tailscale, on the free Personal plan.Adds a new
## Alternative HTTPS exposure: Tailscale Funnelsection todeploy/README.md, positioned after the three runtime approaches (systemd / Docker / Compose) and before## Required environment. The section is orthogonal to runtime choice — Funnel just swaps in for Caddy + Let's Encrypt + DDNS + the router port-forward, regardless of whether the collector runs as a systemd timer, host-cron'd Docker, or Composerun-once. A short cross-reference paragraph after the Pick an approach table points readers at it so it's discoverable without reading the whole doc end-to-end.Trade-offs documented:
<device>.<tailnet>.ts.neton the free plan, locked to the tailnet (custom domains require a paid plan).Setup walked end-to-end:
Five-command path against the bare-systemd runtime —
tailscale up,systemd-run'dpython3 -m http.serverbound to127.0.0.1:8443, a singletailscale funnel --bg, URL discovery viatailscale funnel status, and acurl -sIsmoke-check. Tear-down is two commands. Includes the URL-encoded shields.io endpoint snippet for the README badge update.CHANGELOG entry under
[Unreleased]/Addeddescribes the new section, the trade-offs, and the orthogonality to runtime choice.No code change;
deploy/README.md+CHANGELOG.mdonly.Test plan
deploy/README.mdrenders correctly on the GitHub blob view (anchor link from the Pick-an-approach paragraph resolves).tailscale.com/kb/1223/funnel,tailscale.com/install.sh, the embedded shields.io endpoint URL, the embedded PyPI project URL.pypi-winnow-downloads-statusandproject:pypi-winnow-downloadsawareness entries are unaffected (no in-tree code touched, no behavior change).tailscale up,tailscale funnel --bg http://127.0.0.1:8443,tailscale funnel statusshould all be valid against current Tailscale CLI).#alternative-https-exposure-tailscale-funnelmatches the auto-generated GitHub anchor for the heading.deploy/caddy/Caddyfile.example,deploy/systemd/*.service, and the existing systemd / Docker / Compose sections are unchanged — Funnel is additive, not a replacement.