Skip to main content
On-prem deployment is an Enterprise offering under a commercial license. The Helm chart, signed images, and source are provisioned as part of an Enterprise agreement — this is not a free or open download. Contact sales to license an on-prem deployment.

Why on-prem

Regulated industries — banking, healthcare, insurance, defense — often require decisioning data to stay inside an owned VPC or physical data center. On the Enterprise plan, KaireonAI ships as a first-class Helm chart that runs entirely inside your infrastructure, with no data egress. The same platform that powers the hosted service runs in your cluster. This page is the production runbook for:
  • Private VPC deployments (AWS / GCP / Azure) with no public ingress from the platform’s side
  • Air-gapped clusters (no outbound egress at all)
  • BYOK (bring-your-own-key) encryption and secrets

Prerequisites

Architecture options

Option A — Private VPC, managed add-ons

  • Platform (API / worker / ml-worker): Helm chart → your K8s cluster
  • Database: managed Postgres (RDS / Cloud SQL / Neon VPC)
  • Cache / queue: managed Redis (ElastiCache / Memorystore / Upstash VPC)
  • Secrets: AWS Secrets Manager / GCP Secret Manager / Azure Key Vault, mounted via External Secrets Operator
  • Outbound traffic: optionally allowed to your LLM provider of choice; otherwise disabled

Option B — Fully air-gapped

  • All three images mirrored to an internal registry
  • Internal Postgres StatefulSet + internal Redis StatefulSet (the chart ships both)
  • LLM explanations feature either disabled or pointed at an in-VPC LLM endpoint (vLLM, Ollama, self-hosted Claude via Bedrock PrivateLink, on-prem GPU box, etc.)
  • All ML training happens in-cluster via the bundled kaireon-ml-worker pod
  • Zero outbound egress required

Step-by-step (Option A)

1. Mirror images to your registry

Every image is published with provenance. If you require signed images:

3. Create a values override

values-prod.yaml:

4. Apply the chart

5. Schema sync

The API container runs prisma db push --skip-generate on startup, so a fresh install applies its schema automatically — you normally don’t run anything by hand here.
Do not run prisma db push by hand against a populated database. Customer-schema tables (ds_*) and pipeline staging tables (_flow_*) are created at runtime and are not modeled in schema.prisma; a db push can drop them and lose data. It is safe only on a fresh database.

Hardening checklist

Before going live, confirm each item:
  • readOnlyRootFilesystem: true where workload permits (requires adding an emptyDir volume for /app/.next/cache on the API pod)
  • runAsNonRoot: true on every pod (enabled by default in the chart)
  • allowPrivilegeEscalation: false + all capabilities dropped (enabled by default)
  • topologySpreadConstraints with whenUnsatisfiable: DoNotSchedule across 3+ zones
  • A pod-disruption-budget preserves N-1 availability during drains (shipped in templates/pdb.yaml)
  • A network policy blocks all pod-to-pod traffic except allow-listed flows (shipped in templates/networkpolicy.yaml; review for your CNI)
  • Secrets sourced from AWS Secrets Manager via the External Secrets Operator, not plain kubernetes.io/Secret objects (set secrets.provider: aws-secrets-manager in values.yaml)
  • Database SSL mode require or higher
  • Redis TLS enabled with rediss:// and password
  • Admission controller enforcing signed images (cosign + Kyverno / OPA Gatekeeper)
  • Log sink configured (Fluent Bit → CloudWatch / Loki / Splunk)
  • Metrics scrape configured (Prometheus ServiceMonitor — the chart ships Grafana dashboards in helm/dashboards/)
  • Backup policy on the Postgres instance (PITR ≥ 7 days)
  • CONNECTOR_ENCRYPTION_KEY is a 32-byte random, rotated every 90 days, and stored in your secrets backend

Air-gapped (Option B) additions

  • Set database.mode: internal and redis.mode: internal — the chart provisions StatefulSets with local storage
  • Set config.EVENT_PUBLISHER: redis and config.INTERACTION_STORE: pg (no cloud-backed stores)
  • Disable llmExplanationsEnabled at the tenant level, OR deploy an in-VPC LLM and configure its endpoint via the AI provider settings (Ollama / vLLM / Bedrock PrivateLink)
  • Mirror the ml-worker Python dependencies to an internal PyPI proxy (the Dockerfile bakes them into the image, so this is only needed if you rebuild)

Upgrades

The API container applies its schema on startup (prisma db push --skip-generate), so a rolling upgrade picks up Prisma-modeled schema changes automatically. Do not run prisma db push by hand against your populated database (see the schema-sync warning above). A rolling upgrade drains one replica at a time (thanks to PDB). The API pod’s preStop lifecycle hook sleeps 15s so the load balancer has time to stop routing before SIGTERM.

Observability

The chart ships Grafana dashboards in helm/dashboards/. They cover:
  • API overview — request rate, p50/p95/p99 latency, 4xx/5xx split
  • Decision engine — recommend latency breakdown by stage (enrich / compute / filter / score / rank)
  • Decision performance — offer CTR, ranking weight drift, experiment uplift
  • Model health — AUC trend per model, drift PSI, training sample count
  • Worker queues — BullMQ depth per queue, retry count, DLQ depth
  • Infrastructure — CPU / memory / disk / network per pod
Load these into Grafana via the bundled templates/grafana.yaml (enabled by default) or by importing the JSON files directly.

Support

  • Docs: docs.kaireonai.com
  • Enterprise licensees get a dedicated support channel and access to the release repository as part of their agreement.
  • For Enterprise support contracts and on-prem licensing, email sales@kaireonai.com.