You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 96310d4
Browse filesBrowse the repository at this point in the historyBrowse files
fix: correct the env-var and runtime-behavior claims the audit found
- White-labeling, session policies, and the inbox are already on wherever
billing is disabled, which is every self-hosted deployment. The docs told
operators to enable white-labeling with a flag it does not need, and listed
all thirteen features as symmetric opt-ins.
- `NEXT_PUBLIC_CUSTOM_CSS_URL` must be same-origin. The CSP's `style-src` is a
hardcoded literal that takes no configured hosts, so both the
"point them at absolute URLs" advice and my own earlier "or a host you have
added to style-src" were wrong — there is no such remedy short of editing
source.
- Client variables are read at boot from the container environment, not baked
at build. The troubleshooting note invited a pointless image rebuild.
- Script migrations run with `lock_timeout = 0` and `statement_timeout = 0`, so
one blocked on an app-held lock hangs forever rather than failing with
`55P03`. The table described only the SQL phase.
- With no mail provider the mailer logs recipient, subject, and sender at
`info` and reports success — never the body, and nothing at all at the
production default of `ERROR`.
- A malformed storage backend stops startup; it does not fall through to a
later fully configured one.
- `EMAIL_PASSWORD_SIGNUP_ENABLED=false` disables sign-in and OTP too, and
`SIGNUP_MX_VALIDATION_ENABLED` covers only email signup.
- The Pi template accepts an immutable ref; the page forbade one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015BwsJTEQRzWJaY4BRCkPZt
The individual flags also work on their own if you would rather opt in one at a time and leave the master switch unset.
42
42
43
+
Three features do not need a flag at all: **custom branding**, **session policies**, and the **Sim Mailer inbox** are already on wherever billing is disabled, which is every self-hosted deployment. They preserve behavior that predates these flags. Set the corresponding variable to `false` to turn one off.
Sandboxes also need a remote execution provider and a dedicated Function base image before they can run anything. `SANDBOXES_ENABLED` grants the server-side entitlement; `NEXT_PUBLIC_SANDBOXES_ENABLED` projects provider readiness to the browser and exposes Shell plus custom Sandbox management. Set the public flag only after the selected provider has credentials and a valid immutable Function base configured.
If a feature is enabled but nothing appears, check these in order.
249
251
250
-
**The settings section is missing.** The `NEXT_PUBLIC_` twin is not set, or the app was not restarted after adding it. Client variables are read at build and boot.
252
+
**The settings section is missing.** The `NEXT_PUBLIC_` twin is not set, or the app was not restarted after adding it. Client variables are read at boot from the container environment, so a restart is enough — no rebuild.
251
253
252
254
**The section appears but the API returns 403.** The server-side variable is missing while its client twin is set. Set both.
Copy file name to clipboardExpand all lines: apps/docs/content/docs/platform/enterprise/whitelabeling.mdx
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -91,17 +91,17 @@ Organization white-labeling applies only to members of your organization. Public
91
91
92
92
## Self-hosted setup
93
93
94
-
Self-hosted deployments use environment variables instead of the billing/plan check.
94
+
Self-hosted deployments use environment variables instead of the billing/plan check, and white-labeling is **already enabled** on one: it defaults on wherever billing is disabled. Configure branding through **Settings → Organization → White-labeling** the same way.
95
95
96
96
### Environment variables
97
97
98
+
To turn it off:
99
+
98
100
```bash
99
-
WHITELABELING_ENABLED=true
100
-
NEXT_PUBLIC_WHITELABELING_ENABLED=true
101
+
WHITELABELING_ENABLED=false
102
+
NEXT_PUBLIC_WHITELABELING_ENABLED=false
101
103
```
102
104
103
-
Once enabled, configure branding through **Settings → Organization → White-labeling** the same way.
#Same-origin, or a host you have added to the CSP's style-src — a stylesheet
121
-
# on another origin is blocked.
120
+
#Must be same-origin — the CSP's style-src allows only 'self' and Google
121
+
#Fonts, so a stylesheet on another origin is blocked.
122
122
NEXT_PUBLIC_CUSTOM_CSS_URL=/branding/custom.css
123
123
```
124
124
@@ -173,4 +173,4 @@ branding:
173
173
favicon.ico: "AAABAAEAEBAAAAEAIABoBAAA..."
174
174
```
175
175
176
-
With the default `mountPath`, a file named `logo.png` is served at `/branding/logo.png` — the value to give `NEXT_PUBLIC_BRAND_LOGO_URL`. Outside Helm, host the files anywhere the browser can reach and point the variables at absolute URLs.
176
+
With the default `mountPath`, a file named `logo.png` is served at `/branding/logo.png` — the value to give `NEXT_PUBLIC_BRAND_LOGO_URL`. Outside Helm, host the logo, wordmark, and favicon anywhere the browser can reach and point those variables at absolute URLs. `NEXT_PUBLIC_CUSTOM_CSS_URL` is the exception — it must be same-origin, since the CSP's `style-src` takes no configured hosts.
Copy file name to clipboardExpand all lines: apps/docs/content/docs/platform/self-hosting/authentication.mdx
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -85,6 +85,7 @@ See the [SSO guide](/platform/enterprise/sso) for identity-provider setup and th
85
85
|---|---|
86
86
|`DISABLE_REGISTRATION=true`| Blocks all new accounts — email/password, email OTP, and social sign-in. Only existing accounts can sign in, including to accept a workspace invitation. SSO is unaffected |
87
87
|`DISABLE_EMAIL_SIGNUP=true`| Blocks new email/password registrations; existing email login keeps working |
88
+
|`EMAIL_PASSWORD_SIGNUP_ENABLED=false`| Disables the whole email path — sign-in, signup, and email OTP — for existing users too. Use `DISABLE_EMAIL_SIGNUP` to block only new accounts |
88
89
|`ALLOWED_LOGIN_DOMAINS`| Comma-separated domain allowlist, e.g. `acme.com,acme.co.uk`. Gates email sign-**in** as well as signup |
89
90
|`ALLOWED_LOGIN_EMAILS`| Comma-separated address allowlist, applied the same way |
@@ -93,7 +94,7 @@ See the [SSO guide](/platform/enterprise/sso) for identity-provider setup and th
93
94
|`BLOCKED_EMAIL_MX_HOSTS`| MX-host substrings to block; used only with the above |
94
95
95
96
<Callouttype="warn">
96
-
`ALLOWED_LOGIN_DOMAINS`, `ALLOWED_LOGIN_EMAILS`, and `SIGNUP_MX_VALIDATION_ENABLED` gate the **email/password** path only. A first-time sign-in through Google, GitHub, or Microsoft creates an account through the social provider and is not filtered by them. To restrict who may sign in through a social provider, disable the ones you have not vetted (`DISABLE_GOOGLE_AUTH`, `DISABLE_GITHUB_AUTH`, `DISABLE_MICROSOFT_AUTH`) or restrict membership at the identity provider and use SSO.
97
+
`ALLOWED_LOGIN_DOMAINS`, `ALLOWED_LOGIN_EMAILS`, and `SIGNUP_MX_VALIDATION_ENABLED` gate the **email/password** path only — and `SIGNUP_MX_VALIDATION_ENABLED` narrower still, running on email signup alone, not on email sign-in or email OTP. A first-time sign-in through Google, GitHub, or Microsoft creates an account through the social provider and is not filtered by them. To restrict who may sign in through a social provider, disable the ones you have not vetted (`DISABLE_GOOGLE_AUTH`, `DISABLE_GITHUB_AUTH`, `DISABLE_MICROSOFT_AUTH`) or restrict membership at the identity provider and use SSO.
97
98
98
99
`DISABLE_REGISTRATION` and `BLOCKED_SIGNUP_DOMAINS` apply to every path, social included.
Copy file name to clipboardExpand all lines: apps/docs/content/docs/platform/self-hosting/object-storage.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,7 @@ Set `STORAGE_PROVIDER` to `local`, `s3`, `azure`, or `gcs` to select a backend e
31
31
32
32
If `STORAGE_PROVIDER` is unset, Sim uses the first backend whose configuration is complete, in that order. An explicit `STORAGE_PROVIDER` takes precedence and must be valid and complete.
33
33
34
-
A partially configured backend is skipped, so a fully configured one later in the order still wins. What it never does is fall back to local disk: if no other backend is complete, startup fails with `File storage is partially or incorrectly configured`. `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are checked as a pair — set both or neither.
34
+
A partially configured backend is skipped, so a fully configured one later in the order still wins. A backend whose values are present but malformed is different: it stops startup immediately, and a later fully configured one does not take over. What it never does is fall back to local disk: if no other backend is complete, startup fails with `File storage is partially or incorrectly configured`. `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are checked as a pair — set both or neither.
Copy file name to clipboardExpand all lines: apps/docs/content/docs/platform/self-hosting/reference-architectures.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,7 +26,7 @@ Everything the chart can run itself, it runs by default. That is convenient for
26
26
| Ingress | Off | You install the controller; the chart renders the Ingress |
27
27
| TLS certificates | Off | You provision them |
28
28
| Remote sandbox | Off | Required for Python, Shell, and imported JavaScript — a provider **and** an immutable Function image. See [Security](/platform/self-hosting/security)|
29
-
| Pi execution | Off | A separate image from the Function one, set with `E2B_PI_TEMPLATE_ID` (the template **name**, not an immutable `<template>:<build-id>` ref) or `DAYTONA_PI_SNAPSHOT_ID`. Unlike the Function base these are not format-validated, but execution still fails closed when unset |
29
+
| Pi execution | Off | A separate image from the Function one, set with `E2B_PI_TEMPLATE_ID` (a template name, an alias, or an immutable `<template>:<build-id>` ref) or `DAYTONA_PI_SNAPSHOT_ID`. Unlike the Function base these are not format-validated, but execution still fails closed when unset |
30
30
| PII redaction, Ollama, telemetry collector | Off | Optional, off unless you enable them |
31
31
32
32
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.
| `lock_timeout` on the migration session | 5 seconds for ordinary DDL — a statement that waits longer fails with SQLSTATE `55P03`. An individual migration can set it to `0` for statements that must not be interrupted, such as `CREATE INDEX CONCURRENTLY`. `statement_timeout` is `0` on the same session by default, so a long migration is not cut off once it holds its locks — though a migration can narrow it for its own statements, as `0076_damp_vector.sql` does with a 180-second local setting |
107
-
| SQL migration retry attempts | 8, with exponential backoff and jitter, and only for a lock timeout (`55P03`). Script (data) migrations run once — a failure there exits immediately |
107
+
| SQL migration retry attempts | 8, with exponential backoff and jitter, and only for a lock timeout (`55P03`). Script (data) migrations run once — a failure there exits immediately. They also run with `lock_timeout = 0` and `statement_timeout = 0`, so one blocked on an app-held lock waits indefinitely: a stuck script migration looks like a hung migration container, not a `55P03` |
108
108
| Connection attempts at startup | 10, for transient failures — `53300` (`too_many_connections`), `53400`, the `08xxx` connection-exception class, and socket-level errors such as `ECONNREFUSED`, `ECONNRESET`, `ETIMEDOUT`, `EHOSTUNREACH`, and `ENOTFOUND`. A database that is simply down is retried with backoff, not failed immediately |
109
109
110
110
The `lock_timeout` deliberately trades a table-wide stall for a failed migration: without it, DDL waiting on an `AccessExclusiveLock` queues every other query on that table behind it for the whole wait.
Copy file name to clipboardExpand all lines: apps/docs/content/docs/platform/self-hosting/verify.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -104,7 +104,7 @@ All six should be present on Compose: `simstudio`, `realtime`, `db`, `redis`, `c
104
104
105
105
**Step 8 fails — knowledge base upload errors.** Knowledge bases need a hosted embedding provider — OpenAI, Azure OpenAI, or Gemini. There is no local embedding backend. If a key is set, check pgvector is installed on the database.
106
106
107
-
**Step 9 fails — no email arrives.** With no provider configured, emails are written to the app logs instead of sent — check there first to confirm the message was generated, then debug the provider.
107
+
**Step 9 fails — no email arrives.** With no provider configured the mailer no-ops: it records the recipient, subject, and sender at `info` and reports success, never the message body. Raise `LOG_LEVEL` to `info` to see that line — at the production default of `ERROR` nothing is logged at all.
108
108
109
109
**Step 11 fails — schedule never fires.** Read the scheduler's logs (`docker compose -f docker-compose.prod.yml logs cron`, or `kubectl get cronjobs -n simstudio`). A `401` there means the app and the scheduler disagree on `CRON_SECRET`.
0 commit comments