Requirements
- Kubernetes 1.33 or later
- A full Onyx Helm deployment with the vector database enabled
- Nodes with enough CPU, memory, and ephemeral storage for active sandboxes
- A URL that sandbox pods can use to reach the Onyx API
kubernetes, when ONYX_SERVER_URL is empty,
or when sandbox push authentication is not configured.
Prepare sandbox nodes
By default, sandbox pods select nodes with this label:sandboxPod.nodeSelector with a selector that matches your cluster.
Create the sandbox push Secret
Craft uses an Ed25519 key to authenticate file and history pushes into sandbox pods. Generate a key and store it in the Onyx namespace:Configure Helm
Add the following settings to the values file used by your existing Onyx deployment. IfconfigMap or auth is already present,
merge these entries under the existing keys rather than adding a second block.
values.yaml
ONYX_SERVER_URL is the full API base URL, path prefix included.
It can be the public Onyx URL through your proxy (https://onyx.example.com/api)
or the cluster-internal API Service (http://<release>-api-service.<namespace>.svc.cluster.local:8080, no prefix).
Use a scheme and hostname that resolve from the sandbox proxy and route to the Onyx API.
A public URL without its /api prefix fails at sandbox provisioning with a corrected value.
Before
v4.5.0 this setting was named SANDBOX_API_SERVER_URL. Rename it in your values file when upgrading.onyx-values.yaml with the path to the values file used by your deployment.
Alternatively, save only the Craft settings in a separate craft-values.yaml overlay.
Pass your existing deployment values first and the Craft overlay second so Helm combines them:
Plan sandbox capacity
Each active user receives a sandbox pod. The main sandbox container has these defaults:
The pod also includes initialization and sidecar containers for network setup, file transfer, snapshots, and restore.
To change the main container resources, merge these
configMap entries into your deployment values or Craft overlay:
sandboxPod.nodeSelector, sandboxPod.tolerations, and sandboxPod.affinity to control placement.
The proxy and Scheduled Task worker have separate resource settings under sandboxProxy.resources and
celery_worker_scheduled_tasks.resources.
Pre-pull the sandbox image
When Craft is enabled, the chart runs a DaemonSet (sandboxImagePrepull)
that pulls the sandbox image onto every sandbox node ahead of time,
so the first sandbox on a node does not wait for the image pull.
It is on by default and uses about 3.3 GB of disk per sandbox node.
enabled: false on nodes without that disk headroom. Pin global.version to an immutable tag when pre-pulling;
a mutable tag such as latest stays at whichever digest the node pulled first.
Verify the deployment
Confirm the proxy, sandbox template, and Scheduled Task worker exist:Network configuration
Sandbox pods can send traffic only to DNS and the sandbox proxy. The proxy handles external requests, App policies, and credential injection. Most clusters work with the chart defaults. Two cluster layouts require additional values:Troubleshooting
Helm rejects the Craft configuration
Helm rejects the Craft configuration
Read the render error first. Confirm Kubernetes 1.33 or later,
SANDBOX_BACKEND: "kubernetes",
a non-empty ONYX_SERVER_URL, and auth.sandboxPushSecret.enabled: true with a populated Secret.Sandbox pods remain Pending
Sandbox pods remain Pending
Run
kubectl -n onyx-sandboxes describe pod <pod-name>.
Confirm at least one node matches sandboxPod.nodeSelector, accepts the configured taints and tolerations,
and has enough CPU, memory, and ephemeral storage.A sandbox fails during initialization
A sandbox fails during initialization
Inspect the
sandbox-init container logs and the proxy pods.
DNS must resolve the proxy before the sandbox firewall is installed.
Clusters using NodeLocal DNS usually need its listener CIDR under craft.dnsExtraCIDRs.Craft cannot reach the Onyx API
Craft cannot reach the Onyx API
Verify
ONYX_SERVER_URL (including the /api prefix on public URLs), DNS, TLS trust, and routing from the proxy.
Do not point it at a Service name from another cluster or an address the proxy cannot resolve.The sandbox proxy is not Ready
The sandbox proxy is not Ready
Run
kubectl -n onyx logs -l app.kubernetes.io/component=sandbox-proxy --tail=200 and check its access to
PostgreSQL, Redis, the Onyx API, and external destinations. On dual-stack clusters,
enable sandboxProxy.egressAllowIPv6.Craft deployment overview
Compare the Kubernetes and Docker Compose paths.
Managing Craft
Configure models and user access after deployment.