Skip to content

Cloud Personal Server plan#86

Closed
tnunamak wants to merge 4 commits intomainfrom
plan/cloud-personal-server
Closed

Cloud Personal Server plan#86
tnunamak wants to merge 4 commits intomainfrom
plan/cloud-personal-server

Conversation

@tnunamak
Copy link
Member

Summary

Plan for provisioning Personal Servers on account.vana.org when users log in — no desktop app required.

  • Dockerize personal-server-ts for cloud deployment (GCE micro VMs initially, Sprites.dev later)
  • Provider abstraction so infra backend is swappable via env var
  • Stripe-style API routes in vana-connect (POST /api/servers, GET /api/servers/:id, etc.)
  • Neon Postgres for user→server mapping
  • Provision on login — after Privy auth, auto-provision or reconnect to existing server
  • UI — server status, MCP endpoint copy, in account.vana.org dashboard

Phasing

  1. Containerize personal-server-ts
  2. GCP provider + API routes in vana-connect
  3. Login integration + UI
  4. Sprites.dev provider (swap)

Key decisions made

  • GCE VMs (not Cloud Run) — PS is stateful/long-lived
  • Stripe-style API semantics (resource-oriented, idempotent creation, srv_ prefixed IDs)
  • No "full handover" token model for now — Vana manages servers
  • Connectors via CLI for now, not in scope

See docs/260319-cloud-personal-server-plan.md for full details.

Review

This is a plan doc for discussion — no code changes.

tnunamak and others added 2 commits March 19, 2026 18:45
Plan for provisioning Personal Servers on account.vana.org (vana-connect)
when users log in. Covers Dockerizing personal-server-ts, GCP provider
abstraction (swappable to Sprites.dev), Stripe-style API routes, Neon
Postgres state, and login-triggered provisioning flow.
…xecution detail

Resolve all open questions (unified URL scheme, disk retention, auto-registration,
wallet-derived keys, env var security for MVP). Add Cloudflare Worker routing layer
as new Phase 2, detailed validation criteria per phase, and rollback plan.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
tnunamak and others added 2 commits March 20, 2026 16:48
Replace Worker-proxy approach (blocked by CF Workers can't fetch IPs) with
Cloudflare Tunnels: each VM runs cloudflared sidecar, provisioning API creates
tunnel + DNS CNAME via CF API. No proxy fleet, no per-user DNS management.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
tnunamak added a commit to vana-com/vana-connect that referenced this pull request Mar 21, 2026
## Summary

- Stripe-style API routes (`POST /api/servers`, `GET /api/servers/:id`,
`DELETE /api/servers/:id`)
- GCP Compute Engine provider (e2-micro VMs on Container-Optimized OS
with persistent data disks)
- Neon Postgres DB layer for user→server mapping
- Cloudflare Worker for `*.myvana.app` subdomain routing with KV cache
- Wallet-based auth (same pattern as existing `/api/sign`)

## Context

Part of the Cloud Personal Server plan ([data-connect PR
#86](vana-com/data-connect#86)). When users log
into account.vana.org, a Personal Server is auto-provisioned in the
cloud at `{userId}.myvana.app`.

## Infrastructure set up

- [x] GCP service account (`cloud-ps-provisioner@corsali-development`)
with Compute Engine admin
- [x] Vercel env vars: `DATABASE_URL`, `GCP_SERVICE_ACCOUNT_KEY`,
`GCP_PROJECT`
- [x] Neon `personal_servers` table created
- [x] Cloudflare `*.myvana.app` wildcard DNS
- [ ] Cloudflare Worker deployed with `DATABASE_URL` secret and
`SERVER_CACHE` KV binding
- [ ] Docker image built and pushed for personal-server-ts ([PR
#58](vana-com/personal-server-ts#58))

## Test plan

- [ ] `POST /api/servers` with valid masterKeySignature → creates GCE
VM, returns `{ status: "provisioning" }`
- [ ] `POST /api/servers` again → returns existing server (idempotent)
- [ ] `GET /api/servers/:id` → transitions to "running" once VM healthy,
writes `vm_ip` to DB
- [ ] `https://{userId}.myvana.app/health` returns 200 (Worker routes to
VM)
- [ ] `https://{userId}.myvana.app/mcp` responds (MCP endpoint
reachable)
- [ ] `DELETE /api/servers/:id` → stops VM, retains disk for 30 days
- [ ] Auth: missing/invalid signature → 401
- [ ] Auth: user A cannot access user B's server → 404

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>
@tnunamak
Copy link
Member Author

Superseded by the repo-specific implementation PRs and the new cross-repo launch/QA plan.

Live implementation PRs:

  • personal-server-ts#61
  • vana-connect#94

Shareable plan PR:

  • vana-product-interrogator#16

Closing this because it is a plan-only PR in the wrong repo.

@tnunamak tnunamak closed this Mar 23, 2026
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