OrkStageOrkStage

Providers

The clouds and platforms OrkStage deploys to, what each one offers for every resource type, how credentials work and where OpenTofu state lives.

A template names resource types such as database.postgresql or web.frontend, never a provider. When you create an instance, each placement slot is bound to a cloud target (one account, project, team or workspace of a provider) and a region. The provider adapter behind that target turns each resource into real infrastructure.

Status

AWS is tested against MiniStack and runs on real accounts. The other adapters on this page are in Preview: they are covered by unit tests, and the OpenTofu modules of the infrastructure clouds pass tofu validate, but none of them has been verified against a live account yet. Expect changes. Preview providers are disabled by default; see enabling a provider.

Two kinds of provider

Infrastructure clouds (AWS, Microsoft Azure, Google Cloud, Oracle Cloud Infrastructure, DigitalOcean, Vultr, CoreWeave and Magalu Cloud) are deployed with OpenTofu. For each resource, the worker runs an OpenTofu module in a throwaway runner container. Every resource has its own state file, kept in a bucket or container in your own account. OrkStage keeps outputs and references, not the state.

Application platforms (Vercel, Render and Supabase) are driven through their REST APIs. There is no OpenTofu, no module and no state store: the platform itself holds the state, and the adapter finds its resources again by name, so repeating a deployment converges the existing resource instead of creating a second one.

Both kinds can be mixed in one instance. See mixing providers.

Support matrix

Each cell is the capability id you can set in a resource's implementation field. When a type has more than one capability, the first one is the default. "Not offered" means the provider has no capability for that type: place that resource on another provider.

ProviderNetworkContainer servicePostgreSQLRedis or ValkeyObject storageIngressWeb frontend
AWSvpcecs-fargate, ecs-ec2rds-postgreselasticache-valkeys3albnot offered
Microsoft Azurevnetcontainer-appsflexible-servermanaged-redisblob-storagecontainer-apps-ingress, front-doornot offered
Google Cloudvpccloud-runcloud-sql-postgresmemorystore-redisgcscloud-run-ingressnot offered
Oracle Cloud Infrastructurevcncontainer-instancesoci-postgresqloci-cacheobject-storageflexible-load-balancernot offered
DigitalOceanvpcapp-platformmanaged-postgresmanaged-valkeyspacesapp-platform-ingressnot offered
Vultrvpcinstance-dockermanaged-postgresmanaged-valkeyobject-storageload-balancernot offered
CoreWeavevpccks-deploymentnot offerednot offeredai-object-storagecks-ingressnot offered
Magalu Cloudvpcvm-dockerdbaas-postgresnot offeredobject-storagenot offerednot offered
Vercelnot offerednot offerednot offerednot offerednot offerednot offeredvercel-project
Rendernot offeredrender-web-service, render-private-servicerender-postgresrender-key-valuenot offerednot offeredrender-static-site
Supabasenot offerednot offeredsupabase-postgresnot offeredsupabase-storagenot offerednot offered

AWS also covers container-registry (ecr), queue (sqs) and dns (route53). No other provider offers those three types yet.

Each provider page lists what every capability creates, the settings it ignores and its known limits. The plan shows the capability chosen for each resource before anything is deployed.

Enabling a provider

Each provider has a feature flag, PROVIDER_<NAME> (for example PROVIDER_AZURE or PROVIDER_VERCEL). Only PROVIDER_AWS and PROVIDER_MOCK (simulation) are on by default. While a provider's flag is off:

  • registering a target for it fails with PROVIDER_DISABLED;
  • an instance whose placement slot is bound to one of its targets does not compile (create, update, preview and deploy are refused), and the worker checks again before applying;
  • destroying an instance always works, so turning a provider off never strands resources;
  • simulation targets can still imitate it, which is the way to try a template without an account.

For one tenant, the value comes from the first of these that is set: the tenant's own value, the platform value, the default. A tenant value therefore wins over the platform value for that tenant. The same flags also decide what templates may use: MULTI_CLOUD, MULTI_REGION, AUTOSCALING and CUSTOM_DOMAINS, all on by default.

A platform owner changes flags in the console under Settings > Feature flags, for the whole platform or for one tenant, or through the API:

# Enable Azure for one tenant only
curl -X PUT "$ORKSTAGE_API/feature-flags/PROVIDER_AZURE" \
  -H "Content-Type: application/json" -H "x-orkstage-csrf: 1" -b "$SESSION_COOKIE" \
  -d '{"enabled": true, "tenantId": "<tenant id>"}'

# Remove that override again
curl -X DELETE "$ORKSTAGE_API/feature-flags/PROVIDER_AZURE?tenantId=<tenant id>" \
  -H "x-orkstage-csrf: 1" -b "$SESSION_COOKIE"

Flag changes need a session with the platform owner role (API keys cannot change them) and are recorded in the audit log. GET /cloud/providers reports whether each provider is enabled.

Registering a cloud target

Platform owners and admins connect accounts in the console with Cloud targets > Connect a cloud: a wizard that turns the provider on if needed, gives the commands that prepare the account, registers the target and validates it. ork targets add does the same from a terminal, and Register target is the short form. The API call underneath is POST /api/v1/cloud/targets, with the fields each provider page lists.

POST /api/v1/cloud/targets
Content-Type: application/json

{
  "provider": "gcp",
  "name": "gcp-prod",
  "environment": "production",
  "config": { "projectId": "acme-prod-123", "stateBucket": "acme-orkstage-state" },
  "credentialRef": "aws-sm://orkstage/gcp/prod",
  "allowedRegions": ["us-central1", "southamerica-east1"],
  "defaultRegion": "us-central1"
}

config holds only identifiers that are not secret. The API rejects keys that look like secrets with 422 SECRET_IN_CONFIG. After registering, click Validate: each adapter checks the configuration, signs in and shows the identity it found. Infrastructure clouds also check that the state storage answers.

How credentials work

OrkStage never stores provider credentials. A target carries a credentialRef, a reference to a secret that the control plane resolves when it needs it:

env://ORKSTAGE_AZURE_PROD             # environment variable of the API and worker
aws-sm://orkstage/azure/prod          # AWS Secrets Manager secret (name or ARN)

The secret holds a JSON object with the fields the provider page lists, for example { "clientSecret": "<client secret>" } for Azure. When a provider needs a single field (an API token or key), the secret can also be the bare value.

Credentials stay in memory. For infrastructure clouds they reach OpenTofu only as environment variables of one runner command; for application platforms they are sent only to the provider's API. They are not written to the configuration, the state keys, the database or the logs. See secret references for the schemes and how they resolve.

Where state lives

ProviderOpenTofu stateCreated by
AWSS3 bucket orkstage-tfstate-<account>-<region> or stateBucketYou
Microsoft AzureBlob container in a storage account of your subscriptionYou
Google CloudGCS bucket in your projectYou
Oracle Cloud InfrastructureObject Storage bucket, through the S3 compatibility APIYou
DigitalOceanSpaces bucket of your teamYou
VultrObject Storage bucket of your accountYou
CoreWeaveAI Object Storage bucketYou
Magalu CloudObject Storage bucket in your tenantYou
Vercel, Render, SupabaseNo state store: the platform is the state

OrkStage never creates the state bucket or container. Validation reports it as missing until it exists. Turn on versioning so you can recover an older state. Where the storage does not confirm conditional writes (OCI, Vultr, CoreWeave, Magalu Cloud), OpenTofu runs without a lock file; OrkStage already runs one operation per resource at a time.

Triggers

The actions a trigger can run depend on the capability of its resource:

CapabilityActions
container-apps (Azure)restart
cloud-run (Google Cloud)redeploy
container-instances (OCI)restart
app-platform (DigitalOcean)redeploy, restart
instance-docker (Vultr)restart
cks-deployment (CoreWeave)restart
vm-docker (Magalu Cloud)restart
vercel-projectredeploy, promote, rollback, purge-cache
render-web-service, render-private-serviceredeploy, restart, rollback, scale, suspend, resume
render-static-siteredeploy, rollback, suspend, resume
render-postgresrestart
supabase-postgresrestart, pause, restore, backup

Each provider page lists the parameters of its actions.

On this page