Render
Deploy static sites, image based services, Postgres and Key Value on Render through its REST API. API key, workspace id, plans, triggers and limits.
Preview
The Render adapter is covered by unit tests. It has not been verified against a live workspace yet.
The Render adapter drives the Render REST API (https://api.render.com/v1) directly: no
OpenTofu, no modules and no state store. Resources are found by name in the target workspace, so
repeating a deployment converges the existing resource instead of creating a second one.
What OrkStage creates
| Template resource | Capability | Render resource | Notes |
|---|---|---|---|
web.frontend | render-static-site (default) | Static site | Built from a Git repository, custom domains, pull request previews |
compute.container-service | render-web-service (default) | Web service, image runtime | Used when public: true. Plan from cpu and memoryMiB. |
compute.container-service | render-private-service | Private service, image runtime | Used when public is false. Reachable only inside the workspace and region. |
database.postgresql | render-postgres (default) | Render Postgres | Plan by size. High availability on plans with a full CPU. |
cache.redis | render-key-value (default) | Render Key Value, Valkey compatible | Plan by size. Single node. |
Plans used for each size:
| Size | Postgres | Key Value |
|---|---|---|
micro | 0.1c-256mb | 256mb |
small | 0.5c-1g | 1g |
medium | 1c-4g | 5g |
large | 2c-8g | 10g |
xlarge | 4c-16g | not offered |
Services get the smallest plan that has at least the requested vCPU and memory (0.5c-512mb,
1c-2g, 2c-4g and so on). Prices in the catalog are approximate list prices, not an invoice.
Environment variables and secrets
Services and static sites receive their dependencies as environment variables with the shared
names such as <ID>_HOST, <ID>_PORT and <ID>_URL. Credentials come from the dependency's
secret_ref:
- A Render Postgres or Key Value in the same workspace and region is wired with its internal connection string and internal host name. This applies to services only: static sites are built outside the private network.
- Credentials from any other provider are read through OrkStage at deploy time and stored as Render environment variables, which Render keeps encrypted.
Values never appear in outputs, logs or error messages. The adapter owns the environment of the services it manages: variables added by hand in the dashboard are replaced on the next apply. Changes to settings or variables start one deploy so they take effect.
Postgres and Key Value publish secret_ref as render-postgres://<id> and render-kv://<id>.
readSecret returns url (external connection string), internalUrl, username, password,
host, port and, for Postgres, database, so a frontend on another provider can connect.
Target configuration
config field | Required | Meaning |
|---|---|---|
ownerId | yes | Workspace id, tea-<id> for a team workspace or usr-<id> for a personal one. Find it in the workspace settings or with GET /v1/owners. |
registryCredentialId | no | Registry credential (rgc-<id>) Render uses to pull private images. Create it under Workspace settings, Registry credentials. |
Credential secret
Create an API key in the Render dashboard under Account settings, API keys. A key acts as its user on every workspace that user belongs to, so use a dedicated user where you can.
The secret behind credentialRef is the bare key or a JSON object:
{ "apiKey": "<render api key>" }Validation checks the configuration offline, then reads GET /v1/owners/{ownerId}. The workspace
name becomes the target identity. A rejected key, or a workspace the key's user cannot see, fails
validation with a message that never contains the key.
Connect the Git repository
Render builds static sites from a repository it can read. Before the first deploy, connect the Git
provider (GitHub, GitLab or Bitbucket) to the workspace in the Render dashboard and grant the
Render app access to the repository named in source.repository. Without that access the create
call fails with a validation error from Render.
Custom domains in domains are added to the site. Point their DNS at Render to verify them. The
url output switches to the first verified custom domain; otherwise it is the onrender.com URL.
Regions
Allowed regions are oregon, ohio, virginia, frankfurt and singapore. Static sites are
served from the Render CDN and ignore the region.
Actions for triggers
| Capability | Action | Parameters |
|---|---|---|
render-web-service, render-private-service | redeploy | clearCache (boolean), commitId (string), imageUrl (string) |
render-web-service, render-private-service | restart, suspend, resume | none |
render-web-service, render-private-service | rollback | deployId (string, required) |
render-web-service, render-private-service | scale | numInstances (number, required, 1 to 100) |
render-static-site | redeploy, rollback, suspend, resume | as above, without imageUrl |
render-postgres | restart | none |
redeploy and rollback return the Render deploy id as the action reference.
Health combines suspension, the latest deploy (live is healthy, failed is unhealthy, in progress is degraded) and an HTTP probe of the public URL and health check path. Postgres and Key Value health follow the status Render reports. Deploy history and logs are available for every resource; log lines are redacted before they are returned.
Example
spec:
placements:
- name: primary
providers: [render]
resources:
- id: database
type: database.postgresql
size: small
storageGiB: 10
- id: api
type: compute.container-service
image: ghcr.io/acme/api:1.4.2
cpu: 0.5
memoryMiB: 512
port: 8080
public: true
healthCheckPath: /health
dependsOn: [database]
- id: web
type: web.frontend
source: { repository: acme/web, branch: main }
buildCommand: npm ci && npm run build
outputDirectory: dist
domains: [www.acme.example]
dependsOn: [api]
triggers:
- name: redeploy-api
description: Nightly redeploy, and on demand from CI with a new image.
resource: api
action: redeploy
params: { clearCache: false }
overridable: [imageUrl, commitId]
on: { manual: true, schedule: '0 3 * * *', webhook: true }The API receives DATABASE_URL (internal connection string), DATABASE_HOST, DATABASE_PORT,
DATABASE_USERNAME, DATABASE_PASSWORD and DATABASE_DATABASE. The site receives API_URL.
Known limits
- Container services deploy a prebuilt image. Building from source is offered only for static sites, and static site environment variables are available at build time only.
- A service cannot change type in place (web to private or back). Delete it or rename the resource.
- Render cannot move a resource to another region, shrink Postgres storage or change the Postgres major version in place. The adapter logs a warning and leaves those settings as they are.
- Postgres high availability needs a plan with at least 1 CPU (size
mediumor larger) and version 13 or later. On smaller plans the database runs without a standby and a warning is logged. - Autoscaling needs a Professional workspace or higher. When Render refuses it, the service runs
the fixed
replicascount. Render services run at least one instance; usesuspendto stop one. - Key Value is a single node, so
replicasis not supported, and external access stays closed. - Render has no resource tags, so template tags are not applied. Render has no deletion protection either: production resources are protected only by OrkStage approvals.
- Custom domains removed from the template are not removed from Render.
- The adapter does not wait for deploys or database creation to finish. Health reports them as degraded until they are live.
Vercel
Deploy web frontends as Vercel projects built from Git. Access token, team id, regions, environment variables from dependencies, triggers and limits.
Supabase
Run PostgreSQL as Supabase projects and keep files in Supabase Storage. Access token, organization, regions, how the password is derived, triggers and limits.