Skip to main content

Overview

z3rno-helm is the Helm chart that runs Z3rno on Kubernetes. The base chart renders four workload kinds:
WorkloadDefaultNotes
Deployment/z3rno-server2 replicasThe FastAPI application.
Deployment/z3rno-worker1 replicaCelery worker.
Deployment/z3rno-beat1 replicaCelery beat scheduler. Singleton — do not scale beyond 1.
StatefulSet/z3rno-valkey1 replicaBundled Valkey (Celery broker + rate-limit store).
Five opt-in blocks layer additional capability on top of the base. Each is enabled: false by default and back-compat — pre-flag deploys stay byte-identical.
Opt-inFlagAddsShipped
Bundled Postgres (CNPG subchart)z3rno-postgres.enabledA postgresql.cnpg.io/v1 Cluster CR running the z3rno-postgres:17 image (Postgres 17 + pgvector + AGE + pg_cron + pgaudit + pgcrypto).v0.19.7
Observability (Prometheus + Grafana)observability.prometheusRules.enabled / observability.grafanaDashboard.enabled4 SLO recording rules + 4 alerts + a stat/timeseries dashboard.v0.18.0
Multi-region topologymultiRegion.enabledz3rno.region label, zonal topologySpreadConstraints, optional DATABASE_READ_URL in the secret.v0.17.0
Inline image-pull secretimagePullSecret.createRenders a dockerconfigjson Secret for private GHCR.v0.19.10
NOTIFY/LISTEN audit drainauditListener.enabledA dedicated singleton Deployment/z3rno-audit-listener that opens LISTEN z3rno_audit_pending and fires z3rno.audit_drain on every notification.v0.20.2
Current chart version: 0.6.0 (appVersion 0.20.0).

Install

The chart currently ships from source; an OCI / repo publish lands in a future release.
git clone https://github.com/the-ai-project-co/z3rno-helm
cd z3rno-helm
helm install z3rno ./charts/z3rno \
  --namespace z3rno --create-namespace \
  --set externalDatabase.enabled=true \
  --set externalDatabase.host=YOUR_DB_HOST \
  --set secrets.databaseUrl='postgresql+asyncpg://z3rno:PASSWORD@YOUR_DB_HOST:5432/z3rno' \
  --set secrets.openaiApiKey=sk-your-openai-key
For a one-command local-cluster smoke (e.g. kind) with bundled Postgres, see the Self-hosting / Kubernetes guide.

Quick start (production shape)

helm install z3rno ./charts/z3rno -n z3rno --create-namespace -f values-production.yaml
A minimal values-production.yaml:
server:
  image:
    repository: ghcr.io/safayavatsal/z3rno-server      # public mirror; OK for prod
    tag: "0.20.0"
  replicas: 3

externalDatabase:
  enabled: true
  host: "z3rno-db.abc123.us-east-1.rds.amazonaws.com"
  existingSecret: "z3rno-db-credentials"  # must have key 'password'

secrets:
  databaseUrl: "postgresql+asyncpg://z3rno:PASSWORD@z3rno-db.abc123...:5432/z3rno"
  openaiApiKey: "sk-..."
  z3rnoApiKey: "z3rno_sk_prod_..."        # rotate from the dev default

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: api.example.com
      paths:
        - path: /
          pathType: Prefix

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

# Recommended pairing: live audit drain via NOTIFY/LISTEN
auditListener:
  enabled: true
beat:
  audit:
    drainIntervalSeconds: "60.0"          # bump up; listener handles wake-up

values.yaml reference

The full reference shape, organized by block:
# Server
server:
  image:
    repository: ghcr.io/safayavatsal/z3rno-server   # public mirror default
    tag: latest
    pullPolicy: IfNotPresent
  replicas: 2
  port: 8000
  resources:
    requests: { memory: 256Mi, cpu: 250m }
    limits:   { memory: 512Mi, cpu: 500m }

# Celery worker
worker:
  enabled: true
  replicas: 1
  command: "celery -A z3rno_server.workers.celery_app worker --loglevel=info"

# Celery beat (singleton)
beat:
  enabled: true
  replicas: 1
  command: "celery -A z3rno_server.workers.celery_app beat --loglevel=info"
  audit:
    drainIntervalSeconds: "1.0"           # bump to 60.0 when auditListener.enabled
    drainBatchSize: "500"
    maxOrgsPerTick: "100"

# Bundled Valkey
valkey:
  enabled: true                            # set false + use externalRedis for prod
  image: { repository: valkey/valkey, tag: "8" }
  port: 6379
  persistence:
    enabled: true
    size: 1Gi
    storageClass: ""

# External Postgres (recommended for prod)
externalDatabase:
  enabled: false
  host: ""
  port: 5432
  name: "z3rno"
  user: "z3rno"
  existingSecret: ""
  secretKey: "password"

# External Redis (replaces bundled Valkey)
externalRedis:
  enabled: false
  host: ""
  port: 6379
  existingSecret: ""
  secretKey: "redis-password"

# Secrets — set existingSecret to source from your secret manager
secrets:
  databaseUrl: ""
  redisUrl: ""
  openaiApiKey: ""
  z3rnoApiKey: "z3rno_sk_test_localdev"   # rotate for non-localhost deploys
  existingSecret: ""

# Ingress
ingress:
  enabled: false
  className: ""
  annotations: {}
  hosts:
    - host: z3rno.local
      paths: [{ path: /, pathType: Prefix }]
  tls: []

# Horizontal Pod Autoscaler (targets server)
autoscaling:
  enabled: false
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70
  targetMemoryUtilizationPercentage: 80

# Pod Disruption Budget (targets server)
podDisruptionBudget:
  enabled: false
  minAvailable: 1

# Free-form env injected into server / worker / beat pods
env: {}

Opt-in blocks

# v0.19.7 — bundled Postgres via CloudNativePG subchart.
# When true, renders a postgresql.cnpg.io/v1 Cluster CR running
# z3rno-postgres:17 (Postgres 17 + pgvector + AGE + pg_cron +
# pgaudit + pgcrypto). Auto-emits <release>-z3rno-rw / -ro services.
# Requires the CNPG operator pre-installed in the cluster.
z3rno-postgres:
  enabled: false

# v0.18.0 — Prometheus rules + Grafana dashboard.
observability:
  prometheusRules:
    enabled: false                        # needs prometheus-operator CR
    extraLabels: {}
  grafanaDashboard:
    enabled: false                        # needs Grafana sidecar
    extraLabels: {}

# v0.17.0 — multi-region topology.
multiRegion:
  enabled: false
  region: ""                              # e.g. "us-east-1"
  zones: []                               # zonal topology spread
  readDatabaseUrl: ""                     # populates DATABASE_READ_URL
  secondaryRegions: []                    # documentation field

# v0.19.10 — inline ghcr.io pull secret (alt: pre-create + use imagePullSecrets).
imagePullSecret:
  create: false
  registry: "ghcr.io"
  username: ""
  password: ""                            # GH PAT with read:packages
  dockerconfigjson: ""                    # OR pre-built base64 dockerconfigjson

# v0.20.2 — NOTIFY/LISTEN audit drain listener.
# When true, deploys a singleton z3rno-audit-listener pod that opens
# LISTEN z3rno_audit_pending and fires z3rno.audit_drain on every
# notification (~50 ms wake instead of waiting for beat). The beat-
# driven poll stays as a fallback; bump beat.audit.drainIntervalSeconds
# to 60.0 when listener is enabled.
auditListener:
  enabled: false

Using an external database

For production, point at a managed PostgreSQL (RDS, Cloud SQL, Neon, or self-managed):
externalDatabase:
  enabled: true
  host: "z3rno-db.abc123.us-east-1.rds.amazonaws.com"
  port: 5432
  name: "z3rno"
  user: "z3rno"
  existingSecret: "z3rno-db-credentials"   # must contain key 'password'
Your external PostgreSQL must have pgvector, Apache AGE, pg_cron, pgaudit, and pgcrypto installed. The reference image ghcr.io/the-ai-project-co/z3rno-postgres:17 ships all five pre-compiled — use it directly if you can, or replicate the extension set on your managed instance. The z3rno-postgres subchart (set z3rno-postgres.enabled=true) renders a CNPG-managed cluster of this image for you.

Upgrading

git pull              # in the z3rno-helm checkout
helm upgrade z3rno ./charts/z3rno -n z3rno -f values.yaml
Database migrations run automatically via an init container on the server pods. The chart applies them with alembic upgrade head against the configured DATABASE_URL. Pre-flight check:
kubectl get pods -n z3rno
kubectl logs -n z3rno -l app.kubernetes.io/component=server -c migrate

Uninstalling

helm uninstall z3rno --namespace z3rno
# PVCs are retained — manually delete to wipe Valkey + (if bundled) Postgres data
kubectl delete pvc -l app.kubernetes.io/instance=z3rno -n z3rno

Resource recommendations

ScaleServer CPU/memWorker CPU/memPostgres CPU/memPostgres storage
Dev / test250m / 512Mi250m / 256Mi500m / 1Gi10Gi
Small (< 100K memories)500m / 1Gi500m / 512Mi1 / 2Gi50Gi
Medium (< 1M memories)1 / 2Gi1 / 1Gi2 / 8Gi200Gi
Large (> 1M memories)2 / 4Gi2 / 2Gi4 / 16Gi+500Gi+
For Phase 3 cloud-cluster validation targets (10K concurrent users across 200 orgs) see status/PHASE-3-DEFERRED-TESTS.md in z3rno-process-docs.

Reference