Skip to content

Commit cde982d

Browse files
committed
docs(helm): audit the chart documentation against the chart
Swept the remaining checkout-era references and audited the Helm docs by checking every values path they mention against values.yaml rather than reading them. That found a real error: the chart has no `copilot.env`. The map is `copilot.server.env`, so anyone following the env-validation note would have set a key that silently does nothing. Fixed. It also flagged `app.envDefaults.FREE_TABLES_LIMIT` and `app.secrets.existingSecret.keys`, which are NOT bugs -- both appear only in upgrade notes describing keys older releases shipped and this one removed. Left exactly as they are; "fixing" them would delete the history an upgrader needs. The chart README was the bigger problem. It led with registry install after the earlier commits, then used `./helm/sim` in eleven subsequent commands -- upgrade, dry-run, examples, parameters, secrets, troubleshooting. Someone following the documented install had no such path. They now use the OCI reference with a pinned version, with one note establishing that convention so the checkout form does not have to be repeated everywhere. Two related corrections while in there: the example values files are not part of the packaged chart, so the examples section now fetches one at a release tag instead of assuming it locally; and values.schema.json cannot be `cat`ed without a checkout, so it links to the repo or `helm pull --untar`. Left pointing at GitHub on purpose: the chart README deep links (that is where the README lives, and an extra hop through the repository root would be worse), the releases page, the issue tracker, the cosign identity regexp, and the Docker Compose quick start's git clone. Bumps to 1.9.4 per the chart's own gate.
1 parent 3df1903 commit cde982d

6 files changed

Lines changed: 46 additions & 34 deletions

File tree

apps/docs/content/docs/platform/self-hosting/environment-variables.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ Setting the variable to an empty string does **not** remove it: the chart reads
311311
Null the variable in every layer that sets it. If it appears in both `app.env` and `app.envDefaults`, nulling only the `app.env` entry lets the `envDefaults` value apply again and the limit stays in force. With External Secrets, also drop the key from `externalSecrets.remoteRefs.app`, which keeps syncing it independently. Confirm what the pod will actually receive before rolling out:
312312

313313
```bash
314-
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.3 -f values.yaml | grep -A1 FREE_TABLE # expect no output
314+
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 -f values.yaml | grep -A1 FREE_TABLE # expect no output
315315
```
316316

317317
`null` deletion has no effect under `helm upgrade --reuse-values` — pass your full values with `-f`, or use `--reset-then-reuse-values` (Helm 3.14+). If you deploy with Argo CD, put the `null` in `valueFiles` or the `values` string rather than `valuesObject`, which strips nulls. On Docker Compose, delete the line from your `.env` file.

apps/docs/content/docs/platform/self-hosting/kubernetes.mdx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ POSTGRES_PASSWORD=$(openssl rand -hex 24)
4040

4141
# Install
4242
helm install sim oci://ghcr.io/simstudioai/charts/sim \
43-
--version 1.9.3 \
43+
--version 1.9.4 \
4444
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
4545
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
4646
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
@@ -70,7 +70,7 @@ For clusters or GitOps configs that consume `helm repo add` rather than OCI:
7070
helm repo add sim https://charts.sim.ai
7171
helm repo update
7272

73-
helm install sim sim/sim --version 1.9.3 --namespace simstudio --create-namespace \
73+
helm install sim sim/sim --version 1.9.4 --namespace simstudio --create-namespace \
7474
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
7575
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
7676
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
@@ -87,11 +87,11 @@ apply to the OCI artifact only.
8787
Every published version is signed with Sigstore keyless signing and carries a SLSA build-provenance attestation. Both live in the registry alongside the chart, so they survive a mirror into an internal registry.
8888

8989
```bash
90-
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.3 \
90+
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 \
9191
--certificate-identity-regexp '^https://github.com/simstudioai/sim/' \
9292
--certificate-oidc-issuer https://token.actions.githubusercontent.com
9393

94-
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.3 --repo simstudioai/sim
94+
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 --repo simstudioai/sim
9595
```
9696

9797
Signing is Sigstore-only — there is no GPG `.prov` file, so `helm install --verify` does not apply.
@@ -112,7 +112,7 @@ SIM_RELEASE=v0.8.24
112112
curl -fsSLO "https://raw.githubusercontent.com/simstudioai/sim/$SIM_RELEASE/helm/sim/examples/values-aws.yaml"
113113

114114
helm upgrade --install sim oci://ghcr.io/simstudioai/charts/sim \
115-
--version 1.9.3 \
115+
--version 1.9.4 \
116116
--values values-aws.yaml \
117117
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
118118
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -233,7 +233,7 @@ kubectl port-forward deployment/sim-app 3000:3000 -n simstudio
233233
kubectl logs -l app.kubernetes.io/component=app -n simstudio --tail=100
234234
235235
# Upgrade (always pin the target chart version)
236-
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.3 --namespace simstudio
236+
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --namespace simstudio
237237
238238
# Uninstall
239239
helm uninstall sim --namespace simstudio

apps/docs/content/docs/platform/self-hosting/reference-architectures.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ resource "helm_release" "sim" {
152152
# release with new migrations.
153153
repository = "oci://ghcr.io/simstudioai/charts"
154154
chart = "sim"
155-
version = "1.9.3"
155+
version = "1.9.4"
156156
157157
# Or the classic repository, if your tooling does not speak OCI:
158158
# repository = "https://charts.sim.ai"

apps/docs/content/docs/platform/self-hosting/upgrades.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ Migration surprises are usually data-shaped rather than schema-shaped, so a stag
157157

158158
```bash
159159
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim \
160-
--version 1.9.3 \
160+
--version 1.9.4 \
161161
--namespace simstudio \
162162
--values my-values.yaml
163163
```
164164

165165
Preview first if the chart version changed:
166166

167167
```bash
168-
helm diff upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.3 -n simstudio --values my-values.yaml
168+
helm diff upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 -n simstudio --values my-values.yaml
169169
```
170170

171171
Then watch the rollout:

helm/sim/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: v2
22
name: sim
33
description: A Helm chart for Sim - the open-source AI workspace where teams build, deploy, and manage AI agents
44
type: application
5-
version: 1.9.3
5+
version: 1.9.4
66
appVersion: "v0.8.18"
77
kubeVersion: ">=1.25.0-0"
88
home: https://sim.ai

helm/sim/README.md

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -d '/+=')
2323

2424
# Install from the registry
2525
helm install sim oci://ghcr.io/simstudioai/charts/sim \
26-
--version 1.9.3 \
26+
--version 1.9.4 \
2727
--namespace sim --create-namespace \
2828
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
2929
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -107,10 +107,10 @@ immutable once published.
107107

108108
```bash
109109
# List the published versions
110-
helm show chart oci://ghcr.io/simstudioai/charts/sim --version 1.9.3
110+
helm show chart oci://ghcr.io/simstudioai/charts/sim --version 1.9.4
111111

112112
helm install sim oci://ghcr.io/simstudioai/charts/sim \
113-
--version 1.9.3 \
113+
--version 1.9.4 \
114114
--namespace sim --create-namespace \
115115
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
116116
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -127,8 +127,8 @@ To mirror the chart into an internal registry — the usual requirement for an
127127
air-gapped or internal-only cluster:
128128

129129
```bash
130-
helm pull oci://ghcr.io/simstudioai/charts/sim --version 1.9.3
131-
helm push sim-1.9.3.tgz oci://registry.internal.example.com/charts
130+
helm pull oci://ghcr.io/simstudioai/charts/sim --version 1.9.4
131+
helm push sim-1.9.4.tgz oci://registry.internal.example.com/charts
132132
```
133133

134134
The container images the chart references are listed in
@@ -144,7 +144,7 @@ helm repo add sim https://charts.sim.ai
144144
helm repo update
145145

146146
helm install sim sim/sim \
147-
--version 1.9.3 \
147+
--version 1.9.4 \
148148
--namespace sim --create-namespace \
149149
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
150150
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
@@ -169,20 +169,26 @@ helm install sim ./helm/sim \
169169
--set postgresql.auth.password="$POSTGRES_PASSWORD"
170170
```
171171

172+
The remaining examples in this README use the OCI reference. If you are working
173+
from a checkout, substitute `./helm/sim` and drop `--version` — the commands are
174+
otherwise identical.
175+
172176
### With a values file
173177

174178
```bash
175-
helm install sim ./helm/sim \
179+
helm install sim oci://ghcr.io/simstudioai/charts/sim \
180+
--version 1.9.4 \
176181
--namespace sim --create-namespace \
177182
--values my-values.yaml
178183
```
179184

180-
Run `helm template ./helm/sim --values my-values.yaml | less` first to see what will be applied.
185+
Run `helm template oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --values my-values.yaml | less` first to
186+
see what will be applied.
181187

182188
### Validate the install
183189

184190
```bash
185-
helm install sim ./helm/sim --dry-run --debug \
191+
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --dry-run --debug \
186192
--values my-values.yaml \
187193
--set app.env.BETTER_AUTH_SECRET=$(openssl rand -hex 16) \
188194
--set app.env.ENCRYPTION_KEY=$(openssl rand -hex 16) \
@@ -201,12 +207,12 @@ the registry next to the chart so they survive a mirror.
201207

202208
```bash
203209
# The signature: proves this chart was signed by a GitHub Actions run in this repo
204-
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.3 \
210+
cosign verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 \
205211
--certificate-identity-regexp '^https://github.com/simstudioai/sim/' \
206212
--certificate-oidc-issuer https://token.actions.githubusercontent.com
207213

208214
# The provenance: proves which workflow, commit, and runner produced it
209-
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.3 --repo simstudioai/sim
215+
gh attestation verify oci://ghcr.io/simstudioai/charts/sim:1.9.4 --repo simstudioai/sim
210216
```
211217

212218
There is no GPG `.prov` file — signing is Sigstore-only, so there is no
@@ -218,7 +224,7 @@ GPG provenance format and will not work; use `cosign verify` above.
218224
## Upgrading
219225

220226
```bash
221-
helm upgrade sim ./helm/sim --namespace sim --values my-values.yaml
227+
helm upgrade sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --namespace sim --values my-values.yaml
222228
```
223229

224230
---
@@ -248,7 +254,7 @@ kubectl delete namespace sim
248254

249255
## Examples
250256

251-
Pre-built values files for common scenarios live in `helm/sim/examples/`. Each file has a header explaining when to use it and any prerequisites.
257+
Pre-built values files for common scenarios live in [`helm/sim/examples/`](https://github.com/simstudioai/sim/tree/main/helm/sim/examples). Each file has a header explaining when to use it and any prerequisites. They are **not** part of the packaged chart, so fetch the one you want at a release tag rather than expecting it locally.
252258

253259
| File | When to use |
254260
|---|---|
@@ -266,9 +272,13 @@ Pre-built values files for common scenarios live in `helm/sim/examples/`. Each f
266272
Use one with:
267273

268274
```bash
269-
helm install sim ./helm/sim \
275+
SIM_RELEASE=v0.8.24
276+
curl -fsSLO "https://raw.githubusercontent.com/simstudioai/sim/$SIM_RELEASE/helm/sim/examples/values-production.yaml"
277+
278+
helm install sim oci://ghcr.io/simstudioai/charts/sim \
279+
--version 1.9.4 \
270280
--namespace sim --create-namespace \
271-
--values ./helm/sim/examples/values-production.yaml \
281+
--values values-production.yaml \
272282
--set app.env.BETTER_AUTH_SECRET="$BETTER_AUTH_SECRET" \
273283
--set app.env.ENCRYPTION_KEY="$ENCRYPTION_KEY" \
274284
--set app.env.INTERNAL_API_SECRET="$INTERNAL_API_SECRET" \
@@ -283,12 +293,14 @@ This chart is intentionally configurable. Rather than maintain a hand-curated pa
283293

284294
```bash
285295
# Print all values with comments and defaults
286-
helm show values ./helm/sim
287-
288-
# Print the JSON Schema (used by `helm install` to validate your values)
289-
cat ./helm/sim/values.schema.json
296+
helm show values oci://ghcr.io/simstudioai/charts/sim --version 1.9.4
290297
```
291298

299+
The JSON Schema that `helm install` validates your values against ships inside
300+
the chart as `values.schema.json`; read it in the
301+
[repository](https://github.com/simstudioai/sim/blob/main/helm/sim/values.schema.json)
302+
or extract it from a pulled chart with `helm pull --untar`.
303+
292304
`values.yaml` is heavily commented; each top-level section explains what it controls and which sub-keys are required vs optional. For per-cloud examples and idiomatic overrides, see `examples/`.
293305

294306
---
@@ -329,7 +341,7 @@ Before installing in production, confirm each of the following:
329341
kubernetes.io/metadata.name: ingress-nginx
330342
```
331343
* **Namespace hardening** — label the install namespace with Pod Security Standards `restricted` enforcement (`pod-security.kubernetes.io/enforce=restricted`). All workloads set `runAsNonRoot`, drop all Linux capabilities, disable privilege escalation, and set `seccompProfile: RuntimeDefault` — the four controls the Restricted profile requires. `readOnlyRootFilesystem` is intentionally **not** defaulted anywhere (Postgres/Ollama genuinely need a writable root; the stateless services — `realtime`, `pii`, `copilot` — could tolerate it but aren't pre-wired with a `/tmp` `emptyDir`). If your policy requires it, set `<component>.securityContext.readOnlyRootFilesystem: true` and mount an `emptyDir` at `/tmp` yourself via `extraVolumes`/`extraVolumeMounts`.
332-
* **Env validation** — keys under `app.env`, `realtime.env`, and `copilot.env` are passed through to the application and validated at startup. The JSON Schema intentionally does not enforce `additionalProperties: false` (would break custom user envs), so typos like `OPENA_API_KEY` (instead of `OPENAI_API_KEY`) surface as missing-key errors at runtime, not at `helm install` time. Review your env block carefully.
344+
* **Env validation** — keys under `app.env`, `realtime.env`, and `copilot.server.env` are passed through to the application and validated at startup. The JSON Schema intentionally does not enforce `additionalProperties: false` (would break custom user envs), so typos like `OPENA_API_KEY` (instead of `OPENAI_API_KEY`) surface as missing-key errors at runtime, not at `helm install` time. Review your env block carefully.
333345
* **Set public URLs** — `app.env.NEXT_PUBLIC_APP_URL` and `app.env.BETTER_AUTH_URL` must match your public origin (e.g. `https://sim.example.com`). Leaving them as `localhost` breaks sign-in.
334346

335347
---
@@ -341,7 +353,7 @@ The chart supports three ways to provide secrets, in increasing order of product
341353
### 1. Inline `--set` (dev / dry-run only)
342354

343355
```bash
344-
helm install sim ./helm/sim --set app.env.BETTER_AUTH_SECRET=...
356+
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 --set app.env.BETTER_AUTH_SECRET=...
345357
```
346358

347359
Discouraged for production — values land in `helm get values` output.
@@ -472,7 +484,7 @@ With the chart-managed Secret (the default), nulling a key the application canno
472484
The common case is a free-tier cap inherited from a chart release older than the one that stopped presetting them, which shipped `FREE_TABLES_LIMIT: "3"` and `FREE_TABLE_ROWS_LIMIT: "1000"` under `app.envDefaults`. With billing disabled, Sim reads an unset limit as unlimited, so nulling these lifts the cap. Verify before rolling out:
473485

474486
```bash
475-
helm template sim ./helm/sim -f values.yaml | grep -A1 FREE_TABLE # expect no output
487+
helm template sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 -f values.yaml | grep -A1 FREE_TABLE # expect no output
476488
```
477489

478490
---
@@ -540,7 +552,7 @@ Without a cluster-reachable `INTERNAL_API_BASE_URL` (it falls back to `NEXT_PUBL
540552
You ran `helm install` without setting required secrets. Generate them and pass with `--set`:
541553

542554
```bash
543-
helm install sim ./helm/sim \
555+
helm install sim oci://ghcr.io/simstudioai/charts/sim --version 1.9.4 \
544556
--set app.env.BETTER_AUTH_SECRET=$(openssl rand -hex 32) \
545557
--set app.env.ENCRYPTION_KEY=$(openssl rand -hex 32) \
546558
--set app.env.INTERNAL_API_SECRET=$(openssl rand -hex 32) \

0 commit comments

Comments
 (0)