1. Docs
  2. Self-Hosted
  3. Upgrading Tines

Upgrading Helm from charts before v39.0.0

Summary

Tines Helm charts before v39.0.0 created the Kubernetes namespace as part of the chart. In those installs, Helm may own the namespace.

When upgrading to v39.0.0 or later, the chart no longer includes the namespace. If Helm owns your namespace, helm upgrade can delete the namespace and the resources inside it, including PostgreSQL resources and persistent volumes. If you self-host Tines with Helm and installed a chart before v39.0.0, complete the checks below before running helm upgrade.

Check whether you’re impacted

You may be impacted if Helm created your namespace and you have not yet upgraded to v39.0.0 or later.
Replace <ns> with your Tines namespace:

kubectl get namespace <ns> -o jsonpath='managed-by={.metadata.labels.app\.kubernetes\.io/managed-by}{"  "}release={.metadata.annotations.meta\.helm\.sh/release-name}{"\n"}'

If this prints managed-by=Helm with your release name, you may be impacted. You’re likely not impacted if you created the namespace yourself, for example with --create-namespace or kubectl create namespace.

Choose the right upgrade path

Next, check whether your Helm release namespace matches the namespace where Tines is running:

helm list -A | grep -i tines          # NAMESPACE column = your release namespace
kubectl get pods -A | grep tines-app  # first column = where Tines is running
  • If they match (for example, helm install tines <chart> -n tines --create-namespace), use Path A — in-place upgrade.

  • If they differ, use Path B — migration required. The namespace annotation alone will not protect your data in this layout.

Path A — in-place upgrade

1. Annotate the namespace so Helm does not delete it during the upgrade:

kubectl annotate namespace <ns> helm.sh/resource-policy=keep --overwrite

2. Confirm the destination storage is available and points to the data you expect. For bundled PostgreSQL (db.create: true, the default), confirm the database PVC exists:

kubectl get pvc -n <ns>

Then check free space on the PostgreSQL data volume:

kubectl exec -n <ns> deploy/db -c postgres -- \df -h /var/lib/postgresql/data

If you use an external or managed PostgreSQL database (db.create: false), confirm available storage using your database provider’s tools before upgrading.

3. Back up PostgreSQL off-cluster before upgrading:

kubectl exec -n <ns> deploy/db -- pg_dump -U <DATABASE_USERNAME> -d tines_production > tines-backup-$(date +%F).sql

4. Upgrade using helm upgrade with your existing values and flags.
5. Verify the namespace is still active and is no longer included in the Helm manifest:

kubectl get namespace <ns>
helm get manifest <release> -n <ns> | grep -c "kind: Namespace"

The second command should print 0.

Path B — migration required

If your Helm release namespace and Tines runtime namespace differ, v39.0.0 or later may deploy workloads into a different namespace and create a new, empty database. In this case:

  1. Back up PostgreSQL off-cluster.

  2. Install v39.0.0 or later into the intended namespace.

  3. Restore the PostgreSQL backup into the new database.

  4. Verify Tines starts with the restored data before removing the old namespace.

Was this helpful?