Skip to content

Ports Detail (Swappable Per Region)

Ports define what Starbase needs from cloud infrastructure. Each region maps to one implementation of each port. Swapping clouds means writing new adapters, not changing core logic.

Port Interface What It Abstracts MVP Adapter Future Adapters
ClusterProvider Cluster lifecycle: create, delete, scale node pools, get status DigitalOcean DOKS (godo) AWS EKS, GCP GKE
DatabaseProvider Managed DB: create, resize, backups, PITR, connection strings DO Managed Postgres AWS RDS, GCP Cloud SQL
CacheProvider Managed cache: create, resize, connection strings DO Managed Valkey AWS ElastiCache, GCP Memorystore
RegistryProvider Container images: create repo, push/pull credentials, list tags DO Container Registry AWS ECR, GCP Artifact Registry
StorageProvider Object storage: create isolated tenant org, provision bucket, generate per-customer credentials, revoke on offboarding Tigris (Partner Integration API) AWS S3, GCP GCS, Cloudflare R2
DNSProvider DNS records: create, update, delete A/CNAME records Cloudflare Cloudflare (unchanged across clouds)
PaymentProvider Billing: create customer, create subscription, usage reporting, invoices Stripe Stripe (unchanged)
BuildService Build execution: framework detection, submit build, poll status, get image reference, stream logs Depot SaaS + Railpack (primary) + Dockerfile (fallback) Self-hosted BuildKit, AWS CodeBuild
JobQueue Async jobs: enqueue, dequeue, ack, retry Postgres table (MVP) RabbitMQ (scale)

Wiring example in cmd/api/main.go:

Region wiring · cmd/api/main.go
regions := region.NewRegistry()
regions.Register("nyc3", region.Config{
    Cloud:    "digitalocean",
    Cluster:  digitalocean.NewClusterAdapter(doClient),
    Database: digitalocean.NewDatabaseAdapter(doClient),
    Cache:    digitalocean.NewCacheAdapter(doClient),
    Registry: digitalocean.NewRegistryAdapter(doClient),
    Storage:  tigris.NewStorageAdapter(tigrisClient),  // Partner Integration API
})

// Core uses ports — doesn't know about DO
deploySvc := deploy.NewService(regions, store, queue)

Adding AWS later means writing adapter/aws/*.go and registering a new region. Zero changes to core.


Cross-references

Where adapters live in the tree → §9 · integrations (the other pattern — all active at once) → §11 · the Region struct that binds a port set → §12 · the BuildService port's full contract → Starforge §16.3.