Upgrade & backup

Upgrade, roll back, and back up a NocoDB Helm deployment on Kubernetes.

Before you upgrade

  1. Read the release notes for the target version.
  2. Back up PostgreSQL (snapshot or pg_dump). This is your rollback safety net.

Always back up the database before a major upgrade. Schema migrations run automatically on pod startup and are not reversed by helm rollback.

Upgrade

helm upgrade nocodb oci://ghcr.io/nocodb/charts/nocodb --version <new-version> \
  -n nocodb -f values.yaml --wait

The app uses an ordered rollout (maxSurge: 1, maxUnavailable: 0): the first new pod runs any schema migrations (serialized by a migration lock), and the rest start once they complete. The generous startup probe prevents pods from being killed mid-migration.

For a major upgrade you can be extra cautious by temporarily scaling the app to one replica first:

helm upgrade nocodb oci://ghcr.io/nocodb/charts/nocodb --version <new-version> \
  -n nocodb -f values.yaml --set replicaCount=1 --wait
# once healthy, restore your normal replica count

Roll back

helm history nocodb -n nocodb
helm rollback nocodb <revision> -n nocodb --wait

The auto-generated JWT secret and datasource encryption key are never rotated by upgrades (they carry helm.sh/resource-policy: keep), so rollbacks do not invalidate sessions or stored credentials. If a migration changed the schema, restore your database backup to fully revert.

Backup & restore

  • PostgreSQL: use your provider's snapshots or pg_dump/pg_restore. This holds all NocoDB metadata.
  • S3: enable bucket versioning; attachments live here.
  • See Backups for the general approach.

Troubleshooting

SymptomLikely cause
Pod stuck 0/1 for minutes on first installFirst-boot migrations running; the startup probe allows this
NocoDB requires Redis... at installreplicaCount>1 or worker.enabled, and externalRedis not configured
Attachments missing on some requestsObject storage not configured; set up an S3-compatible Storage plugin in the App Store
New pods not picking up env changesValues delivered via extraEnvVars or an external Secret are not tracked by the config checksum; restart the rollout with kubectl rollout restart or re-run helm upgrade