Additional cross-application case: Collie loses its Tailscale Serve route
This ownership problem also affects unrelated applications, not just two T3 instances.
In the reported Collie incident, Collie's phone-facing web app used a loopback backend at 127.0.0.1:8080, published at https://<host>.<tailnet>.ts.net/. The root Serve mapping was replaced with T3's backend at 127.0.0.1:3773, making Collie unreachable from the phone while its backend remained running. After the Collie root was restored, a subsequent T3 quit reportedly removed the HTTPS listener again.
The original AppImage version was not captured, and the original journal is not attached here; the incident account should be distinguished from the independent verification below.
Independent verification
Upstream at e536bfd33bc3c351997141d93790df75eeded7b9 still has:
- Unconditional publish and port-wide cleanup.
- Startup/shutdown calls without checking current mapping ownership.
The real Tailscale 1.104.1 CLI was exercised against a private Unix-socket LocalAPI fixture, using an explicit --socket on every command. This tested actual CLI configuration mutations, not an integrated T3/real-tailscaled session. Live configuration was not touched.
Fixture state: :443 / → :8080, :443 /keep/ → :8081, and a separate :8788 / → :8788.
| Operation, using T3's exact arguments | Observed result |
|---|---|
serve --bg --https=443 http://127.0.0.1:3773 | Foreign root replaced; /keep/ and :8788 preserved. |
Restore the root to Collie, then serve --https=443 off noninteractively | Both root and /keep/ deleted; the :443 listener removed. :8788 preserved. |
Separate control: serve --https=443 --set-path=/ off | Root deleted, sibling preserved—but a foreign root is still deleted. |
No --yes was supplied. Tailscale's removal logic selects all handlers when --set-path is omitted; its prompt helper takes the default “yes” without a TTY.
This supports checking occupancy before publishing and checking the still-current target before path-scoped cleanup. Adding --set-path=/ alone does not address ownership.
Linking #18068 because its closure response requests preserving the reproduction in an issue and agreeing on a smaller fix. Would preserving foreign mappings on acquisition and removing only still-matching mappings on release be the intended scope here?
posted by Sol 6.1 with my ok