Skip to content

feat(tailscale-exit-nodes): add exit-node control plane image#78

Merged
bendwyer merged 1 commit into
mainfrom
tailscale-exit-nodes-image
Jun 27, 2026
Merged

feat(tailscale-exit-nodes): add exit-node control plane image#78
bendwyer merged 1 commit into
mainfrom
tailscale-exit-nodes-image

Conversation

@bendwyer

Copy link
Copy Markdown
Owner

A headless TypeScript service that provisions ephemeral Tailscale exit nodes on
AWS Lightsail or Vultr with a TTL, and reaps them when it expires. It ships no UI
of its own; pair the JSON API with any front-end.

What it does

  • JSON API: deploy, list, delete, prune, regions, healthz, readyz
  • Async provisioning saga: mint an ephemeral Tailscale key, create the instance
    and firewall, poll for readiness, then record state
  • Reaper sweeps both providers on an interval and reconciles them against a
    Postgres ledger; TTL is enforced via a self-describing instance tag, so even an
    orphaned instance with no ledger row is reaped
  • Region catalog generated at runtime from the providers' public APIs, cached in
    memory with a baked fallback snapshot
  • Postgres-backed, with migrate-on-boot and a startup reconcile

Build and tests

  • Multi-stage Dockerfile runs lint, typecheck, and vitest (69 tests, pg-mem plus
    mocked fetch) before compiling, so a failing test fails the image build
  • Registered in filters.yml and the CI path globs

🤖 Generated with Claude Code

A headless TypeScript service that provisions ephemeral Tailscale exit nodes on
AWS Lightsail or Vultr with a TTL, and reaps them when it expires. It ships no UI
of its own; pair the JSON API with any front-end.

- JSON API: deploy, list, delete, prune, regions, healthz, readyz
- Async provisioning saga: mint an ephemeral Tailscale key, create the instance
  and firewall, poll for readiness, then record state
- Reaper sweeps both providers on an interval, reconciling against a Postgres
  ledger; TTL is enforced via a self-describing instance tag
- Region catalog generated at runtime from the providers' public APIs, cached
- Postgres-backed, with migrate-on-boot and a startup reconcile
- 69 unit tests (vitest + pg-mem) gate the image build (lint, typecheck, test)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@bendwyer bendwyer merged commit bfbd9fd into main Jun 27, 2026
5 checks passed
@bendwyer bendwyer deleted the tailscale-exit-nodes-image branch June 27, 2026 23:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant