Skip to content

Helm Values Reference

This page is the reference for the values the TruePPM Helm chart (packages/helm/values.yaml) exposes: what each knob does and the value it ships with. For how many of each resource to run at a given team size, see Deployment Sizing; for the application environment variables passed under env, see Configuration.

KeyDefaultWhat it does
replicaCount1API tier replica count. Raise to 2+ for production (the prod overlay sets 2). Request throughput scales with this because uvicorn runs one worker per pod by default.
image.repositoryregistry.gitlab.com/trueppm/trueppm/apiAPI container image.
image.webRepositoryregistry.gitlab.com/trueppm/trueppm/webWeb (nginx SPA) image; shares tag/pullPolicy with the API so a release deploys a matching pair.
image.tag""Empty pins the chart to its own appVersion for reproducible rollbacks. Override per-deploy with a concrete tag.
image.pullPolicyIfNotPresentStandard Kubernetes pull policy.
KeyDefaultWhat it does
service.type / service.portClusterIP / 8000API Service. Stays ClusterIP; the Ingress is the sole external object.
web.enabledtrueServe the compiled React SPA from an in-chart nginx tier. Disable if you front the SPA from your own CDN and want only the API + workers.
web.replicaCount1Web-tier replicas; falls back to replicaCount when unset.
web.containerPort8080Port the unprivileged nginx image listens on (satisfies runAsNonRoot).
web.service.type / web.service.portClusterIP / 80Web Service.

Off by default — the ingress class, hostnames, and certificate source are cluster-specific, so a default-on ingress would render a broken object.

KeyDefaultWhat it does
ingress.enabledfalseRender a chart-managed Ingress + edge TLS.
ingress.className""IngressClass to bind (nginx, traefik, …). Empty uses the cluster default.
ingress.annotations{}Controller / cert-manager annotations.
ingress.hostsone example hostVirtual hosts; each path routes to web or api. List /api and /ws before / so they win longest-prefix matching.
ingress.tls[]TLS Secrets per host. Empty renders HTTP-only — dev/demo only, never production.
KeyDefaultWhat it does
postgresql.enabledtrueDeploy the bundled PostgreSQL.
postgresql.auth.username / .databasetrueppm / trueppmBundled DB credentials.
postgresql.auth.password""Empty ⇒ chart generates a strong random password and persists it in the connection Secret (never churned on re-render). Set explicitly only to control the credential.
valkey.enabledtrueDeploy the bundled Valkey. Load-bearing for Channels, the Celery broker, and the cache at once.
valkey.auth.enabledtrueValkey auth on by default.
valkey.auth.password""Same generate-and-persist pattern as PostgreSQL.
global.trueppm.connectionSecretName""Override only if you renamed the chart-owned connection Secret.
KeyDefaultWhat it does
networkPolicy.enabledtrueRestrict datastore ingress to the API/worker pods and default-deny datastore egress. Requires a policy-enforcing CNI (Calico, Cilium, Antrea, …) — silently unenforced without one.
podSecurityContextrunAsNonRoot: true, runAsUser: 1000Pod-level restricted defaults.
containerSecurityContextno-priv-escalation, read-only rootfs, drop ALL caps, RuntimeDefault seccompContainer-level restricted defaults.

Per-tier requests/limits under resources.<tier> for api, worker, beat, and web. Defaults are conservative single-team values (API/worker request 250m / 512Mi, limit 1 / 2Gi; beat and web are light). Each includes an ephemeral-storage request/limit for /tmp scratch (MS Project parse, export, large request buffering). Tune per the sizing profiles.

KeyDefaultWhat it does
probes.api.readinessPath/api/v1/readyzDeep readiness: DB + cache reachable and no unapplied/in-flight migrations, so a rolling upgrade never routes traffic to a pod whose schema and code disagree.
probes.api.livenessPath/api/v1/health/Shallow liveness so a transient dependency blip can’t restart-loop the pod.
probes.api.readiness*/liveness*Seconds10/10, 30/30Initial-delay and period tuning.
probes.worker.*ping every 60s, failureThreshold: 3celery inspect ping exec probe — catches a wedged event loop a process-alive check would miss.
probes.beat.*ping every 60s, failureThreshold: 5Beat ping targets broker reachability; generous threshold avoids restarts on a brief worker blip.
KeyDefaultWhat it does
podDisruptionBudget.enabledfalsePDBs for API/worker (maxUnavailable: 1). Only meaningful at replicaCount >= 2; beat is excluded (pinned singleton).
autoscaling.enabledfalseHorizontalPodAutoscaler for the API (and optionally worker). Overrides the static replica count and requires metrics-server. Defaults: API 2–6 replicas at 75% CPU.
logging.level""Fleet-wide DJANGO_LOG_LEVEL (DEBUG/INFO/WARNING/ERROR). Empty keeps the app default.

The env block passes application settings into the API/worker/beat containers. The full catalog lives in Configuration; the knobs operators reach for first:

KeyDefaultWhat it does
env.DJANGO_SETTINGS_MODULEtrueppm_api.settings.prodSettings module.
env.DATABASE_URL / env.REDIS_URLunsetRequired when the bundled datastores are disabled — the chart fails the render if either is missing. Supply via an external Secret.
env.TRUEPPM_FRONTEND_BASE_URL""Public origin for absolute deep-links in notification emails.
env.TRUEPPM_THROTTLE_ANON_RATE / _USER_RATE60/min / 1000/minAPI rate limits; probe endpoints are always exempt.
env.TRUEPPM_NUM_PROXIES"1"Trusted reverse-proxy depth for real-client-IP extraction. A wrong value lets clients spoof X-Forwarded-For.
env.TRUEPPM_RATE_LIMIT_ENABLED"true"Global API rate-limiting kill switch. Leave "true" in production. Disabling also requires TRUEPPM_RATE_LIMIT_DISABLE_ACK; for load testing only (details).
env.TRUEPPM_PROJECT_SOFT_DELETE_RETENTION_DAYS"30"Trashed-project hard-delete window.
KeyDefaultWhat it does
observability.otlp.endpoint""OTLP collector endpoint. Empty ⇒ telemetry off.
observability.otlp.protocolgrpcgrpc (4317) or http/protobuf (4318).
observability.otlp.enabledtrueMaster export switch (only exports when an endpoint is also set).
observability.otlp.tracesSampler / Arg""Trace sampling for busy instances, e.g. parentbased_traceidratio + 0.1.
observability.otlp.headersSecretunsetPrefer this over inline headers so auth tokens never render into a plaintext manifest.
dashboards.enabledfalseShip the starter Grafana dashboard as a labeled ConfigMap (needs a Grafana sidecar).
alerts.enabledfalseShip starter PrometheusRule alerts (requires the Prometheus Operator CRDs). Thresholds tunable under alerts.thresholds.
otelCollector.enabledfalseDocumentation-only reminder — the chart bundles no Collector; deploy one as a sibling release.

Off by default — a backup CronJob needs a durable destination, so you turn it on deliberately. This is logical backup only (pg_dump); see Backup & Restore for the full runbook.

KeyDefaultWhat it does
backup.enabledfalseEnable the backup CronJob.
backup.schedule"0 2 * * *"Cron schedule (cluster timezone).
backup.imagepostgres:16-alpineClient-capable image carrying pg_dump/psql (the lean app image has no client binaries).
backup.outputDir/backupsIn-container artifact path (the mounted volume when persistence is on).
backup.mediaDir""Include a local media/attachment PVC in the artifact. Leave empty when attachments live in object storage.
backup.keepDaily / keepWeekly7 / 4keepDaily is enforced in-job; keepWeekly is advisory for an external lifecycle policy.
backup.persistence.*disabled, 10Gi RWOChart-managed PVC destination.
backup.s3.*disabledS3-compatible off-cluster destination; the secret must come from a Kubernetes Secret via existingSecret.
backup.extraVolumes / extraVolumeMounts[]Mount your media PVC read-only when mediaDir is set.
backup.resources100m/256Mi1/512MiBackup job container resources.
KeyDefaultWhat it does
admin.passwordFile/run/trueppm/admin_passwordWhere the one-time bootstrap password is written. Retrieve with kubectl exec <api-pod> -- cat /run/trueppm/admin_password.
admin.email""Bootstrap admin email (defaults to admin@trueppm.com).