# Cloud platforms (/platform/self-hosting/platforms)





Use [Docker](/platform/self-hosting/docker) for a single node or [Kubernetes](/platform/self-hosting/kubernetes) for a cluster. This page covers provider-specific prerequisites and configuration differences.

## Railway [#railway]

The [Sim deployment template](https://railway.com/new/template/sim-studio) provides a starting installation. Review its current services and variables before using it for production:

1. Confirm PostgreSQL has pgvector and that migrations complete.
2. Confirm the app and realtime services share `BETTER_AUTH_SECRET` and `INTERNAL_API_SECRET`.
3. Retain generated secrets, set `API_ENCRYPTION_KEY`, and configure durable storage.
4. Configure your domain under **Settings → Networking**. Set `NEXT_PUBLIC_APP_URL` and `BETTER_AUTH_URL` to that app origin; match `NEXT_PUBLIC_SOCKET_URL` to the realtime endpoint.
5. Add a model provider key such as `OPENAI_API_KEY` and configure email if needed.
6. Check Redis and the scheduler rather than assuming the template includes them.

<Callout type="warn">
  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](/platform/self-hosting/background-jobs). See [Railway's cron requirements](https://docs.railway.com/cron-jobs).
</Callout>

## VPS [#vps]

Run Compose on a Linux server such as DigitalOcean, EC2, Azure VM, or Hetzner. Use the [resource examples](/platform/self-hosting#requirements) as a starting point, then size for your workload.

Install Docker Engine and the Compose plugin using [Docker's instructions for your operating system](https://docs.docker.com/engine/install/). 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](/platform/self-hosting/docker) for secrets, durable uploads, service startup, and TLS.

## Managed Kubernetes [#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](/platform/self-hosting/kubernetes), then follow [Networking](/platform/self-hosting/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 [#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](https://docs.cloud.google.com/sql/docs/postgres/extensions), [Azure extension allowlisting](https://learn.microsoft.com/en-us/azure/postgresql/extensions/how-to-allow-extensions), and [Neon pgvector setup](https://neon.com/docs/extensions/pgvector) for provider requirements.

An app or source checkout can use a connection string such as:

```bash
DATABASE_URL="postgresql://<user>:<password>@<host>:5432/simstudio?sslmode=require"
```

For Helm, disable bundled PostgreSQL and configure [`externalDatabase`](/platform/self-hosting/kubernetes#external-database). 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](/platform/self-hosting/docker#production-setup).

## Related docs [#related-docs]

* [Reference architectures](/platform/self-hosting/reference-architectures)
* [Verify your install](/platform/self-hosting/verify)
* [Database upgrades and backups](/platform/self-hosting/upgrades)
