Provision a Kubernetes cluster, durable database storage, object storage, networking, and secrets before installing Sim. The Helm chart installs application workloads on that infrastructure; it does not provision cloud resources.
There is no official Terraform module or CloudFormation template. Call the chart from your infrastructure as code (IaC), for example with Terraform's helm_release or a Helm pipeline task.
The boundary
The chart bundles PostgreSQL and Redis for evaluation. For production, decide how each stateful dependency is backed up, restored, and made available.
The bundled Postgres uses a 10 Gi ReadWriteOnce volume and is intended for evaluation. Moving to managed Postgres is the single most important production change.
Per-cloud requirements
Use helm/sim/examples/values-aws.yaml as a starting point. It configures EBS GP3 storage, ALB ingress with AWS Certificate Manager, IRSA-style ServiceAccount annotations, and GPU tolerations for Ollama. Ollama itself ships disabled, and its node selectors are present but commented out.
You provision
Identity. Bind an IAM role to the ServiceAccount with IRSA rather than issuing static keys. The role needs S3 access to the buckets you configured; grant nothing else unless you have enabled a feature that needs it.
Timeouts. ALB's default idle timeout will cut long-running executions and websockets. See Networking before you go live.
The Azure example provides managed-csi / managed-csi-premium storage, node targeting, and GPU tolerations. Its ingress-nginx configuration is legacy: that community controller retired in March 2026. For a new deployment, configure a maintained ingress controller supported by your AKS environment; Networking describes the required behavior.
You provision
Identity. Azure Blob authenticates with a storage account key or connection string — Sim has no Azure workload-identity path for Blob. Keep the key out of app.env by supplying AZURE_ACCOUNT_KEY or AZURE_CONNECTION_STRING through app.secrets.existingSecret or External Secrets.
Use helm/sim/examples/values-gcp.yaml as a starting point. It configures Persistent Disk storage, Google Cloud Load Balancer with managed certificates, Workload Identity annotations, and GPU tolerations for Ollama. Ollama itself ships disabled, and the T4 node selectors are present but commented out.
You provision
Identity. Workload Identity binds the ServiceAccount to a Google service account. Grant it object access to your buckets — and, because there is no private key in that mode, roles/iam.serviceAccountTokenCreator on itself, or signed upload and download URLs cannot be generated. Setting GCS_CREDENTIALS_JSON instead signs locally and needs no extra role. See Object storage.
Timeouts. GCLB's default backend timeout closes websockets every 30 seconds. See Networking for the BackendConfig fix.
Secrets
The chart offers three strategies. Pick one before you write any IaC, because it decides what your pipeline has to create.
Non-inline modes handle missing keys differently:
existingSecretfails quietly. The chart renders no Secret of its own, so a key absent from yours and fromapp.envis simply empty at runtime. A key you also set inapp.envis inlined onto the pod spec, where it shadows the Secret — so the Secret is not always the source of truth.- External Secrets fails loudly. The chart refuses to render when a key is set in
app.envbut not mapped, on the grounds that a silently empty secret is worse than a failed install.
See Security for the full secret inventory, which keys are unrecoverable if lost, and what to back up.
Sizing
These are chart defaults, not capacity benchmarks. Measure memory, CPU, execution concurrency, and database connections with representative workloads. See Scaling for pool budgets and sizing estimates. A node must fit an app pod plus system overhead.
Calling the chart from Terraform
If you already run Terraform, the chart is the resource to wrap — not something to reimplement. Point repository at the OCI registry and pin version; there is no need to vendor the repo.
Pin version above. Empty image tags use the selected chart's appVersion, so a pinned chart also selects that default app version. Explicit image tags or digests override it; pin them separately when you need that control, and keep app, realtime, and migrations aligned. Chart 1.11.8 was published with app version v0.9.17; local checkout metadata can differ. See Upgrades.