Upgrade and migrate
How to upgrade a self-hosted Helix deployment to a new version, and how to migrate data between environments.
Kubernetes upgrade
Helix uses rolling updates via Helm. The general procedure:
helm repo update
# Check the new chart version before applying
helm search repo helix/helix-controlplane --versions | head -5
# Upgrade the control plane
helm upgrade my-helix-controlplane helix/helix-controlplane \
-f values.yaml
# Upgrade the sandbox
helm upgrade my-helix-sandbox helix/helix-sandbox \
--namespace helix \
--set sandbox.apiUrl="http://my-helix-controlplane.helix.svc.cluster.local" \
--set sandbox.runnerTokenExistingSecret=helix-runner-secrets \
--set sandbox.runnerTokenExistingSecretKey=api-tokenThe control plane runs database migrations automatically on startup (GORM AutoMigrate). If you prefer to run migrations out-of-band, set HELIX_SKIP_AUTOMIGRATE=1 and apply the schema changes before upgrading the pod.
Before upgrading
- Check the release notes for breaking changes. Find them in the GitHub releases.
- Back up Postgres before any major version upgrade (see Backup & restore below).
- Check active sessions: active spec task sessions will be interrupted when the sandbox pod restarts. Schedule upgrades during low-activity periods.
Pinning a specific version
The chart's appVersion is pinned to a tested release. To pin to a specific Helix version:
helm upgrade my-helix-controlplane helix/helix-controlplane \
-f values.yaml \
--set image.tag="2.9.31"Do not use image.tag=latest — no :latest tag is published.
Single-server upgrade
For installations using the install script (install.sh), pull the latest images and restart:
docker compose pull
docker compose up -dThe control plane runs database migrations automatically on startup.
Backup & restore
What to back up
| Data | Where it lives | How to back up |
|---|---|---|
| Main database | Postgres (postgresql PVC or external) | pg_dump helix > helix_backup.sql |
| Vector database | pgvector pod (pgvector PVC) | Can be rebuilt from repos; backup optional |
| File store | controlplane data PVC | kubectl cp or volume snapshot |
The main Postgres database contains everything critical: users, organizations, projects, spec tasks, secrets, and repository connections. The vector database and file store can be rebuilt if lost.
Postgres backup
# Port-forward to the Postgres pod
kubectl port-forward svc/my-helix-controlplane-postgresql 5432:5432 &
# Dump
pg_dump -h localhost -U helix helix > helix_$(date +%Y%m%d).sql
# Restore (on a new cluster)
psql -h localhost -U helix helix < helix_20260610.sqlFor production, use scheduled pg_dump to an S3 bucket or equivalent, or use your cloud provider's managed backup feature.
Restoring after disaster
- Provision a new Kubernetes cluster
- Create the same secrets (same encryption key — if you lose this, secrets at rest are unrecoverable)
- Restore the Postgres dump
- Run the Helm install
- The control plane migrates the schema on startup; existing data is preserved
Migrating between environments
To move from one cluster to another (e.g., dev → prod):
pg_dumpthe source Postgres- Provision the target cluster with the same encryption key (it's needed to decrypt stored secrets)
- Install Helix on the target with
HELIX_SKIP_AUTOMIGRATE=1 - Restore the dump to the target Postgres
- Re-enable migrations (remove
HELIX_SKIP_AUTOMIGRATE) and restart
Source control OAuth tokens and API keys were encrypted with the encryption key — they travel with the dump and work on the target as long as the encryption key matches.
Observability
See your platform logs:
docker compose logs -f # single-server
kubectl logs -f deploy/my-helix-controlplane # Kubernetes
kubectl logs -f deploy/my-helix-sandbox # sandboxKey log patterns to watch:
schema migrated— database migration completedbootstrapping org— first-request org setup ransession started— agent session provisionederror starting session— sandbox session failed to start (check GPU resources)