Use Docker for a single node or Kubernetes for a cluster. This page covers provider-specific prerequisites and configuration differences.
Railway
The Sim deployment template provides a starting installation. Review its current services and variables before using it for production:
- Confirm PostgreSQL has pgvector and that migrations complete.
- Confirm the app and realtime services share
BETTER_AUTH_SECRETandINTERNAL_API_SECRET. - Retain generated secrets, set
API_ENCRYPTION_KEY, and configure durable storage. - Configure your domain under Settings → Networking. Set
NEXT_PUBLIC_APP_URLandBETTER_AUTH_URLto that app origin; matchNEXT_PUBLIC_SOCKET_URLto the realtime endpoint. - Add a model provider key such as
OPENAI_API_KEYand configure email if needed. - Check Redis and the scheduler rather than assuming the template includes them.
Railway Cron Jobs run no more often than every five minutes. They cannot reproduce Sim's bundled minute-level scheduler cadence. Use a continuously running Sim scheduler service or another scheduler supporting the schedules in Background jobs. See Railway's cron requirements.
VPS
Run Compose on a Linux server such as DigitalOcean, EC2, Azure VM, or Hetzner. Use the resource examples as a starting point, then size for your workload.
Install Docker Engine and the Compose plugin using Docker's instructions for your operating system. The shipped file requires Compose 2.24.0 or later. Docker's get.docker.com convenience script is intended for development; use its package installation instructions for production.
Follow Docker for secrets, durable uploads, service startup, and TLS.
Managed Kubernetes
EKS, AKS, and GKE have example values files in the chart's source repository. They contain provider resources and placeholders you must review: storage classes, bucket names, workload identities, certificates, static addresses, and network policy.
Use the pinned example in Kubernetes, then follow Networking for the provider's load balancer. GKE requires the referenced ManagedCertificate and an appropriate backend timeout for WebSockets. The AKS example retains legacy ingress-nginx settings; that controller retired in March 2026. Use a maintained controller already supported by your cluster and its own configuration.
Managed PostgreSQL
An external database must support the vector extension and the migration permissions Sim needs. Availability does not mean the extension is enabled in your database.
| Service | Setup |
|---|---|
| AWS RDS / Aurora PostgreSQL | Choose an engine version with pgvector support and enable vector. |
| GCP Cloud SQL for PostgreSQL | Enable the supported vector extension. |
| Azure Database for PostgreSQL Flexible Server | Allow vector in azure.extensions, then enable it in the database. |
| Supabase / Neon | Enable vector in the database you use for Sim. |
See Cloud SQL extensions, Azure extension allowlisting, and Neon pgvector setup for provider requirements.
An app or source checkout can use a connection string such as:
DATABASE_URL="postgresql://<user>:<password>@<host>:5432/simstudio?sslmode=require"For Helm, disable bundled PostgreSQL and configure externalDatabase. Production Compose overrides DATABASE_URL with its bundled database connection; changing .env alone does not switch it. An operator-owned Compose configuration must give the same external DSN to the app, realtime, and migrations and adjust their bundled-database dependencies. See Docker configuration.