Skip to main content

Which service type to use?

Choose between web services, private services, workers, cron jobs, static sites, and managed datastores.

Share
Last updated on September 23, 2026
On this page

Choose a service type based on whether your code receives requests, runs continuously, or exits after completing a task. Choose the runtime separately: it determines how Bex builds or obtains the artifact to deploy.

Choose a workload

WorkloadUse it forIncoming connectionsBlueprint configuration
Web servicePublic APIs and server-rendered websitesHTTP through configured public routingtype: web
Private serviceAn internal API or network serverInternal service address; no public ingresstype: pserv
Background workerQueue consumers and continuous processingNo service endpointtype: worker
Cron jobScheduled commands that exitNo service endpointtype: cron, plus schedule
Static siteBuilt HTML, CSS, JavaScript, and other filesShared static server with configured public routingtype: web, runtime: static

A static site cannot run server-side request handlers. If your framework needs a server for rendering or API routes, deploy it as a web service instead. A worker can make outbound connections to a database, queue, or API without exposing an inbound endpoint.

Choose a runtime

For web/private services, workers, and cron jobs:

  • Dockerfile in Git: use runtime: docker and a repository URL.
  • Prebuilt container: use runtime: image and image.url.
  • Native build: select node, python, go, ruby, rust, or elixir, and supply build and start commands appropriate to your application.

See Docker deploys and How deploys work. Build and runtime settings are independent of whether a service is public.

Store application data

Use PostgreSQL for relational data and Key Value for a Redis-compatible cache or queue. PostgreSQL declarations live under databases: in a Blueprint. Key Value uses type: keyvalue under services:. These managed datastores have their own lifecycle and connection settings.

Configure and deploy

Use the dashboard creation flow or declare one or more resources in a render.yaml Blueprint. That guide covers the required API credentials, validation, and deployment commands.

For example, this selects a private HTTP service built from a Dockerfile:

yaml
services:
  - name: internal-api
    type: pserv
    runtime: docker
    repo: https://github.com/your-org/internal-api
    branch: main
    autoDeployTrigger: off

Replace the repository URL with your own application. Its server should listen on 0.0.0.0:$PORT. The service has an internal address, with no public ingress; use the private network guide to connect callers.

Blueprint names differ from Kubernetes App type names:

BlueprintKubernetes App spec.type
webweb_service
pservprivate_service
workerbackground_worker
croncron_job
web with runtime: staticstatic_site

Do not use type: private or type: static in a Blueprint. A service's type is fixed after creation. To change the workload type, create a replacement, verify its behavior, move callers or traffic, and retire the old service when it is no longer needed.

Scale the right resource

For long-running services, the instance count controls concurrent processes; scaling explains manual and automatic policies. A cron schedule controls when work starts, not how many replicas run. Static sites publish files to shared serving infrastructure rather than running a dedicated application process for each site.

Render has additional product surfaces, including Workflows. Their presence in Render's service catalog does not imply Bex support; consult compatibility before migrating.

Was this page helpful?

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex