Skip to main content

Requirements

Platform

RequirementMinimum
Kubernetes1.27, or 1.29 for the GKE Cloud SQL Auth Proxy native sidecar
Helm3.8
PostgreSQL14
Object storageAn S3-compatible bucket, or GCS
IdentityAn OIDC issuer, an identity-aware proxy, or Google Sign-In

Terraform 1.11 if you use the blueprints.

The image

ghcr.io/m-a-m-a-ai/presponsievelite. Add an image pull secret if the package is private to you.

Compute

The workload is one stateless Deployment. Chart defaults request 250m CPU and 512Mi, with limits of 1 CPU and 1Gi.

DeploymentReplicasPer pod
Evaluation1250m / 512Mi
Production2 to 5, autoscaled on CPU250m–1 CPU / 512Mi–1Gi

Two replicas is the production floor, and SESSION_SECRET must be set for more than one. Without it, an SSO callback landing on a different pod than the one that started the flow will fail.

Crypto material you generate

Four values, before you deploy anything:

openssl rand -base64 32 # APP_KEK envelope-encryption key
openssl rand -base64 32 # SESSION_SECRET signs the session cookie
openssl rand -base64 32 # INDEX_PEPPER HMAC for blind indexes
openssl rand -base64 32 # AUTH_TOKEN_PEPPER HMAC for token hashing at rest
warning

APP_KEK is not recoverable. Lose it and every encrypted row is permanently unreadable, and no database restore brings it back. Back it up somewhere that outlives the cluster, the namespace, and the person who created it.

A license key

Purchased separately. See Licensing.

Network

DestinationPortWhen
PostgreSQL5432Always
Object storage443Report artifacts
Your OIDC issuer443At sign-in
api.openai.com443Only if OPENAI_API_KEY is set
kube-dns53Always

Inbound: your ingress controller to app pods on 8080.

Full detail in Network.

Ingress sizing

Transcripts and audio go past the nginx 1MB body default, and an analysis can hold a connection for minutes.

nginx.ingress.kubernetes.io/proxy-body-size: "100m"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"

On GKE, a BackendConfig with timeoutSec: 600. The GCLB default of 30 seconds is shorter than a long analysis, and past it the load balancer returns an HTML 502 the app never sees.

What you do not need

  • A message broker
  • Redis
  • GPUs
  • A separate worker tier