Savvy Docs

Kubernetes

Deploy Savvy on Kubernetes as a single-replica Deployment with a PersistentVolumeClaim and liveness/readiness probes wired to the health endpoints.

Savvy runs on Kubernetes as a single-replica Deployment backed by a PersistentVolumeClaim mounted at /data.

SQLite is single-writer

Do not scale beyond one replica, and use strategy: { type: Recreate } so the old pod releases the database before the new one starts. Two pods writing the same SQLite file will corrupt it.

Key requirements

  • Storage: one PersistentVolumeClaim mounted at /data (the SQLite database and uploads). Use a real block/file volume, not a shared network mount.
  • Update strategy: strategy: { type: Recreate } — never RollingUpdate.
  • Security context: the container runs as non-root (www-data, uid 82). Grant the NET_BIND_SERVICE capability so it can bind port 80.

Probes

Wire the Kubernetes probes to the health endpoints. The startup probe gives the app time to run migrations before liveness kicks in:

        startupProbe:
          httpGet: { path: /livez, port: 80 }
          periodSeconds: 3
          failureThreshold: 30
        livenessProbe:
          httpGet: { path: /livez, port: 80 }
          periodSeconds: 10
        readinessProbe:
          httpGet: { path: /readyz, port: 80 }
          periodSeconds: 10

Remember to set APP_URL (and TZ) in the pod's env, matching the public URL your Ingress/Gateway serves Savvy on — see Installation.

Helm

An official Helm chart is planned. Until then, deploy with the Deployment + PVC

  • Service manifests described above.

On this page