Skip to main content
Inbox Zero can run on Kubernetes as the same pieces used by Docker Compose:
  • A web Deployment for the Next.js app.
  • A migration Job that runs Prisma migrations before Helm installs or upgrades the app when managed Postgres is enabled.
  • An optional BullMQ worker Deployment for durable background jobs.
  • CronJobs for scheduled endpoints like watch renewal, meeting briefs, follow-up reminders, and retention.
  • Postgres and Redis, either managed externally or installed in-cluster for a simple self-hosted stack.
  • An Ingress in front of the web Service.

Chart Location

The chart lives in the repository at:
Install it with:

Values File

The Helm chart does not replace the normal app configuration. Use the Environment Variables reference, Google OAuth guide, Microsoft OAuth guide, and LLM setup guide for the full app configuration. Create values.prod.yaml with your public URL, ingress settings, and app configuration. Put app secrets in secretEnv or point the chart at an existing Kubernetes Secret.
inbox-zero-secrets should contain the required app environment variables from the Environment Variables reference. You can use secretEnv instead for simple installs. For a first install with bundled Postgres and Redis, also provide generated values for the bundled services:
The default chart includes Postgres, Redis, the Redis HTTP bridge, web, worker, and CronJobs. That is useful for a first Kubernetes install. For production, use managed Postgres and Redis with backups, failover, monitoring, and tested restores. Use managed Postgres and Redis through existing Kubernetes Secrets:
inbox-zero-database should contain DATABASE_URL and DIRECT_URL. inbox-zero-redis should contain REDIS_URL, UPSTASH_REDIS_URL, and UPSTASH_REDIS_TOKEN. You can use plain Kubernetes Secrets, External Secrets, Sealed Secrets, SOPS, or a cloud secret controller. Use existingSecret for app secrets too. See the Environment Variables reference for the full list, including OAuth, LLM, Redis, and QStash variables.

Background Jobs

BullMQ is the default Kubernetes queue mode:
The worker reads from Redis and forwards jobs to the internal web Service using INTERNAL_API_KEY. To use QStash instead, disable the worker:
Provide the QStash secrets using secretEnv or existingSecret; see the Environment Variables reference.

Smoke Test

After installing, check the rollout:
Test the health endpoint:
Test one scheduled job:

Operational Notes

  • Set NEXT_PUBLIC_BASE_URL to the external HTTPS URL used by users and OAuth providers.
  • With managed Postgres, Helm runs Prisma migrations in a pre-install/pre-upgrade Job.
  • Web pods set SKIP_DB_MIGRATIONS=true when the migration Job is enabled.
  • With bundled Postgres, the web container runs migrations during startup.
  • Bundled Postgres, Redis, and Redis HTTP require explicit secret values. Generate them before installing, for example with openssl rand -hex 32.
  • CronJobs call the internal Service, not the public Ingress.
  • Cron schedules are configured under cron.jobs. The defaults follow the Docker self-hosting setup, so some schedules differ from hosted deployment schedules.
  • The /api/health endpoint supports lightweight Kubernetes probes without an API key.