Skip to Content
DeploymentKubernetes

Kubernetes Deployment

The official Classifyre Helm chart deploys the API, web UI, database migrations, and CLI scan jobs to any Kubernetes cluster. It is the recommended path for production workloads.

Supports

  • k3s, K3d, kind, EKS, GKE, AKS, and any conformant cluster
  • External PostgreSQL, embedded single-pod PostgreSQL, or CloudNativePG
  • Horizontal autoscaling (HPA) for API and web deployments
  • OCI Helm registry, no helm repo add needed

Prerequisites

  • Kubernetes ≥ 1.26
  • Helm ≥ 3.8
  • An ingress controller (nginx is the default ingress.className)
  • A PostgreSQL 14+ database (or use the embedded option for demos)

Images

Release images and the Helm chart are published to Docker Hub.

ComponentImage
API (NestJS backend)classifyre/api
Web (Next.js frontend)classifyre/web
CLI (Python scan worker)classifyre/cli

Available tags

Every full release publishes the version tag and latest. CI also publishes branch-name tags (main, develop, etc.) for every push.

TagExampleMeaningRecommended for
{major}.{minor}.{patch}{softwareVersion}Exact releaseProduction
latest-Latest stable releaseDemos / quick evals
main-Latest commit on mainCI / development
develop-Latest commit on developCI / staging

All images are multi-arch: linux/amd64 + linux/arm64.

When you install the chart at a specific version and leave image tags empty, the chart defaults every image to its own appVersion automatically, no manual tag management needed.


Helm Chart

The chart is published as an OCI artifact:

oci://registry-1.docker.io/classifyre/classifyre-core

Helm 3.8+ supports OCI natively, so there is no helm repo add step.

# Inspect available versions
helm show chart oci://registry-1.docker.io/classifyre/classifyre-core

# Pull chart locally to inspect values before installing
helm pull oci://registry-1.docker.io/classifyre/classifyre-core --version 0.4.50 --untar

Quick start

Create a namespace

kubectl create namespace classifyre

Create a values file

ingress:
  enabled: false
 
frontend:
  service:
    type: NodePort
    nodePort: 30100
 
postgres:
  mode: embedded
  embedded:
    password: changeme

Install the chart

helm install classifyre \
oci://registry-1.docker.io/classifyre/classifyre-core \
--namespace classifyre \
--version 0.4.50 \
-f values-k3s.yaml

Helm uses the chart appVersion as the image tag automatically, no extra --set needed.

Verify rollout

kubectl -n classifyre rollout status deployment/classifyre-api
kubectl -n classifyre rollout status deployment/classifyre-web

Open the UI

Find the node IP and open http://<node-ip>:30100 in your browser.

kubectl get nodes -o wide

The embedded PostgreSQL option uses a single pod with a ReadWriteOnce PVC. It has no replication or automated backups. Use it for local dev and demos only.


Encryption key

Classifyre encrypts connector credentials (API tokens, passwords) at rest using CLASSIFYRE_MASKED_CONFIG_KEY.

By default the chart auto-generates a 32-character key on first install and stores it in a Kubernetes Secret. Subsequent helm upgrade runs look up the existing secret and reuse the same key, so credentials stay readable across upgrades.

Do not delete the secret. If the secret is deleted, the key is lost and all stored connector credentials become permanently unreadable. You must re-enter them.

To supply your own key (useful when migrating from Docker or another cluster):

api:
  maskedConfigEncryption:
    value: "your-exactly-32-character-key-here"
    autoGenerate: false

Or reference an existing Kubernetes Secret:

api:
  maskedConfigEncryption:
    existingSecret: "my-classifyre-secrets"
    secretKey: CLASSIFYRE_MASKED_CONFIG_KEY
    autoGenerate: false

Database migrations

Migrations run automatically as an init container in each API pod on every startup. You never need to run them manually. The init container uses the same image as the API and runs:

npx prisma migrate deploy

This is idempotent, if migrations are already applied, the init container exits immediately and the API starts normally.


Ingress

The chart creates four ingress rules on a single host using the nginx ingress controller:

PathTarget
/Web UI
/api/*REST API
/mcp and /api/mcpMCP protocol endpoint
/socket.io/*WebSocket

The default class is nginx. Change it with:

ingress:
  className: traefik   # or any other installed controller

TLS

Add cert-manager annotations to get automatic certificates:

ingress:
  host: classifyre.example.com
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  tls:
    - secretName: classifyre-tls
      hosts:
        - classifyre.example.com

Upgrading

# Pull the latest chart information
helm show chart oci://registry-1.docker.io/classifyre/classifyre-core --version 0.4.50

# Upgrade in place, migrations run automatically
helm upgrade classifyre \
oci://registry-1.docker.io/classifyre/classifyre-core \
--namespace classifyre \
--version 0.4.50 \
-f values-prod.yaml

The upgrade is rolling, pods are replaced one at a time. The API and web deployments each have a minAvailable: 1 PodDisruptionBudget so at least one pod stays up during the rollout.


Scaling

Horizontal autoscaling is enabled by default for both the API and web deployments:

api:
  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 10
    targetCPUUtilizationPercentage: 70
    targetMemoryUtilizationPercentage: 75
 
frontend:
  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 10
    targetCPUUtilizationPercentage: 70
    targetMemoryUtilizationPercentage: 75

CLI scan jobs are ephemeral Kubernetes Jobs — they scale naturally since each scan spawns its own job and the cluster schedules them as capacity allows. Tune their resources with api.cliJobs.resources.

Default resource requests for CLI jobs: 500m CPU, 1 Gi memory, 6 Gi ephemeral storage.


Storage

The chart provisions PVCs depending on configuration:

PVCPurposeDefault sizeAccess mode
uv-cachePython package cache shared across CLI job pods10 GiReadWriteOnce
postgres (embedded mode only)PostgreSQL data directory20 GiReadWriteOnce

Run logs are persisted to S3-compatible object storage (when configured) or streamed live, there is no filesystem PVC for runner logs.

The uv-cache PVC uses ReadWriteOnce by default, which works on single-node clusters. On multi-node clusters with concurrent CLI jobs, switch to ReadWriteMany (e.g. with an NFS or EFS-backed storage class):

api:
  cliJobs:
    uvCache:
      storageClassName: nfs-client

Uninstalling

helm uninstall classifyre --namespace classifyre

PVCs are not deleted automatically. To remove them:

kubectl -n classifyre delete pvc --all

Deleting PVCs removes the encryption key secret and all scan logs. Export anything you need first.


Helm Chart Values

KeyTypeDefaultDescription
api.affinityobject{}API scheduling: affinity rules. When empty, default soft anti-affinity is applied.
api.argslist[]Optional API container args override.
api.autoscaling.enabledbooltrueEnable HPA for API deployment.
api.autoscaling.maxReplicasint10Maximum API replicas under HPA.
api.autoscaling.minReplicasint2Minimum API replicas under HPA.
api.autoscaling.targetCPUUtilizationPercentageint70Target average CPU utilization for API HPA.
api.autoscaling.targetMemoryUtilizationPercentageint75Target average memory utilization for API HPA.
api.cliJobs.activeDeadlineSecondsint86400Max runtime per CLI job (seconds). Increase for large data sources.
api.cliJobs.affinityobject{}CLI job scheduling: affinity rules.
api.cliJobs.autoInstallOptionalDepsbooltruelock + cross-process group accumulation + self-heal in uv_sync.py.
api.cliJobs.automountServiceAccountTokenboolfalseMount service account token into CLI job pods.
api.cliJobs.backoffLimitint2Retry attempts for failed CLI jobs.
api.cliJobs.cleanupPolicystring"always"Cleanup policy for CLI jobs: none, failed, or always.
api.cliJobs.containerSecurityContextobject{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":false}Container security context for CLI job container.
api.cliJobs.detectorFlushBatchSizeint5Number of detector-processed assets to accumulate before pushing findings to the API.
api.cliJobs.enabledbooltrueEnable Kubernetes-backed CLI jobs.
api.cliJobs.extraEnvlist[]Additional environment variables for CLI jobs (list of EnvVar objects; supports secretKeyRef etc.).
api.cliJobs.extraVolumeMountslist[]Extra volume mounts for CLI job containers.
api.cliJobs.extraVolumeslist[]Extra volumes for CLI job pods.
api.cliJobs.huggingFace.existingKeystring"token"Key inside existingSecret that holds the HF_TOKEN value.
api.cliJobs.huggingFace.existingSecretstring""Name of an existing Kubernetes Secret containing the Hugging Face authentication token (HF_TOKEN). When set, the token is injected into every CLI job pod via a secretKeyRef env var. This authenticates requests to hf.co, which significantly increases download rate limits and avoids the “unauthenticated requests” warning from the huggingface-hub library. When this value is set, the Hugging Face token field in the web UI Settings page becomes read-only and disabled — the instance-level token always takes priority over any user-configured token. Create the Secret manually (or via your preferred tool — SealedSecrets, External Secrets, SOPS, etc.) in the same namespace as the CLI jobs: kubectl create secret generic hf-token \ —from-literal=token=hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx The chart does NOT create or manage this Secret — you must create it yourself. This keeps the token out of Helm state and lets you rotate it independently of Helm releases.
api.cliJobs.image.pullPolicystring"IfNotPresent"CLI job image pull policy.
api.cliJobs.image.repositorystring"classifyre/cli"CLI job image repository.
api.cliJobs.image.tagstring""CLI job image tag. Defaults to the chart appVersion when empty.
api.cliJobs.namespacestring""Namespace used for CLI jobs. Empty means release namespace.
api.cliJobs.nodeSelectorobject{}CLI job scheduling: node selector.
api.cliJobs.outputRestTimeoutSecint120HTTP read timeout (seconds) for CLI→API REST calls (bulk ingest, finalize, status updates). The API processes each batch in a Postgres transaction that can take 30-60 s under load; this must be set higher than the API’s transaction timeout to avoid spurious read-timeout failures.
api.cliJobs.podSecurityContextobject{"fsGroup":10001,"runAsGroup":10001,"runAsNonRoot":true,"runAsUser":10001,"seccompProfile":{"type":"RuntimeDefault"}}Pod security context for CLI job pods.
api.cliJobs.pollIntervalMsint2000Poll interval while waiting for job completion (milliseconds).
api.cliJobs.priorityClassNamestring""CLI job priority class.
api.cliJobs.resources.limitsobject{"cpu":"2","ephemeral-storage":"20Gi","memory":"4Gi"}CLI job resource limits.
api.cliJobs.resources.requestsobject{"cpu":"500m","ephemeral-storage":"6Gi","memory":"1Gi"}CLI job resource requests.
api.cliJobs.serviceAccountNamestring""Service account for CLI jobs. Empty uses API service account.
api.cliJobs.tolerationslist[]CLI job scheduling: tolerations.
api.cliJobs.ttlSecondsAfterFinishedint1800TTL for completed CLI jobs (seconds). Ignored when cleanup policy deletes jobs immediately.
api.cliJobs.uvCache.accessModeslist["ReadWriteOnce"]Use ReadWriteMany only if your cluster has a shared filesystem StorageClass (e.g. EFS, NFS).
api.cliJobs.uvCache.enabledbooltrueEnable shared PVC for uv cache (pip package cache shared across CLI jobs).
api.cliJobs.uvCache.existingClaimstring""Existing PVC name for uv cache. Empty creates a new PVC.
api.cliJobs.uvCache.mountPathstring"/cache/uv"Mount path for uv cache in CLI job container.
api.cliJobs.uvCache.prune.enabledbooltrueEnable a CronJob that keeps the uv cache bounded on a schedule.
api.cliJobs.uvCache.prune.imagestring""Image used by the prune CronJob (defaults to the CLI job image).
api.cliJobs.uvCache.prune.maxMBint8000the soft uv cache prune. Keep below the PVC size above.
api.cliJobs.uvCache.prune.schedulestring"0 2 * * *"The job hard-clears the cache once it exceeds maxMB (see below).
api.cliJobs.uvCache.prune.ttlSecondsAfterFinishedint3600TTL for completed prune jobs (seconds).
api.cliJobs.uvCache.sizestring"10Gi"to avoid jobs hanging with “Multi-Attach error” when two jobs land on different nodes.
api.cliJobs.uvCache.storageClassNamestring""Storage class for uv cache PVC.
api.cliJobs.waitTimeoutSecondsint87300Max time API waits for job completion (seconds). Should exceed activeDeadlineSeconds.
api.cliJobs.workDirstring"/app/apps/cli"Working directory inside CLI job container.
api.commandlist[]Optional API container command override.
api.containerSecurityContext.allowPrivilegeEscalationboolfalseDisallow privilege escalation in API container.
api.containerSecurityContext.capabilities.droplist["ALL"]Drop all Linux capabilities in API container.
api.containerSecurityContext.readOnlyRootFilesystemboolfalsepath the app writes to at runtime (e.g. /tmp, log dirs). Hardening step for advanced users.
api.env.DEMO_MODEstring"false"Enable read-only demo mode. When “true” all mutating API operations return 403.
api.env.ENVIRONMENTstring"kubernetes"Execution mode used by API.
api.env.MAX_CONCURRENT_RUNNERSstring"3"Set to “0” to disable the limit (unlimited concurrency).
api.env.MAX_RUNNERS_PER_SOURCEstring"5"exceeds this value. Set to “0” to disable cleanup.
api.env.NODE_ENVstring"production"Runtime environment passed to API container.
api.env.PORTstring"8000"API listen port.
api.env.RUNNER_LOGS_DIRstring"/var/lib/classifyre/runner-logs"Filesystem directory for runner execution logs (filesystem backend only; unused when S3 is configured).
api.env.TEMP_DIRstring"/tmp"Temporary directory used by API.
api.extraEnvlist[]Extra environment variables for API container.
api.extraEnvFromlist[]Extra envFrom sources for API container.
api.extraVolumeMountslist[]Extra volume mounts for the API container.
api.extraVolumeslist[]Extra volumes for the API pod.
api.image.pullPolicystring"IfNotPresent"API image pull policy.
api.image.repositorystring"classifyre/api"API container image repository.
api.image.tagstring""API container image tag. Defaults to the chart appVersion when empty.
api.lifecycleobject{"preStop":{"exec":{"command":["/bin/sh","-c","sleep 5"]}}}during rolling updates by giving kube-proxy time to drain in-flight requests.
api.livenessProbe.enabledbooltrueEnable API liveness probe.
api.livenessProbe.failureThresholdint6API liveness failure threshold.
api.livenessProbe.initialDelaySecondsint30Delay before starting API liveness checks.
api.livenessProbe.pathstring"/ping"HTTP path for API liveness probe.
api.livenessProbe.periodSecondsint15API liveness check period.
api.livenessProbe.timeoutSecondsint5API liveness check timeout.
api.maskedConfigEncryption.autoGeneratebooltrueGenerated key is persisted via Kubernetes Secret lookup across upgrades.
api.maskedConfigEncryption.existingSecretstring""When set, chart will not create or manage this secret.
api.maskedConfigEncryption.secretKeystring"CLASSIFYRE_MASKED_CONFIG_KEY"Secret key name used for CLASSIFYRE_MASKED_CONFIG_KEY.
api.maskedConfigEncryption.secretNamestring""Secret name created by this chart when existingSecret is empty.
api.maskedConfigEncryption.valuestring""Must be exactly 32 chars when using raw string format.
api.migration.containerSecurityContextobject{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]}}Override with runAsUser/runAsNonRoot: false if the migration toolchain requires root (e.g. Prisma on Bun).
api.migration.enabledbooltrueRun database migrations as an API init container.
api.migration.scriptstring"npx prisma migrate deploy --schema /app/api/prisma/schema.prisma"Migration command/script.
api.nodeSelectorobject{}API scheduling: node selector.
api.pdb.enabledbooltrueEnable PodDisruptionBudget for API deployment.
api.pdb.minAvailableint1API minimum pods available during disruptions.
api.podAnnotationsobject{}Additional pod annotations for API deployment.
api.podLabelsobject{}Additional pod labels for API deployment.
api.podSecurityContext.fsGroupint10001API fsGroup for mounted volumes.
api.podSecurityContext.runAsGroupint10001API pod group ID.
api.podSecurityContext.runAsNonRootbooltrueRequire API container to run as non-root.
api.podSecurityContext.runAsUserint10001API pod user ID.
api.podSecurityContext.seccompProfile.typestring"RuntimeDefault"API pod seccomp profile type.
api.priorityClassNamestring""API pod priority class.
api.readinessProbe.enabledbooltrueEnable API readiness probe.
api.readinessProbe.failureThresholdint6API readiness failure threshold.
api.readinessProbe.initialDelaySecondsint10Delay before starting API readiness checks.
api.readinessProbe.pathstring"/ping"HTTP path for API readiness probe.
api.readinessProbe.periodSecondsint10API readiness check period.
api.readinessProbe.timeoutSecondsint3API readiness check timeout.
api.replicaCountint2Number of API replicas when autoscaling is disabled.
api.resources.limitsobject{"cpu":"1","memory":"1Gi"}API resource limits.
api.resources.requestsobject{"cpu":"250m","memory":"512Mi"}API resource requests.
api.sandbox.tempDirstring"/var/lib/classifyre/sandbox-tmp"Mount path for the sandbox emptyDir volume (temp files for local subprocess mode). Must match SANDBOX_TEMP_DIR env var. The emptyDir keeps temp files off the container overlay filesystem and ensures they are cleared on pod restart. In Kubernetes (K8S_JOBS_ENABLED=1) sandbox runs as a K8s Job: file data is passed via base64 env vars (same pattern as RECIPE_B64 for extractions) and decoded inside the job pod’s /tmp — no shared volume required.
api.sandbox.tempSizeLimitstring"2Gi"Size limit for the sandbox emptyDir. Prevents runaway uploads filling the node.
api.service.annotationsobject{}Additional API service annotations.
api.service.nodePortstringnilFixed nodePort when type is NodePort or LoadBalancer.
api.service.portint8000API service port.
api.service.typestring"ClusterIP"API service type.
api.startCommandstring"node dist/src/main.js"Default API process command when command/args are not set.
api.startupProbe.enabledbooltrueEnable API startup probe.
api.startupProbe.failureThresholdint30API startup failure threshold.
api.startupProbe.pathstring"/ping"HTTP path for API startup probe.
api.startupProbe.periodSecondsint10API startup check period.
api.startupProbe.timeoutSecondsint3API startup check timeout.
api.strategyobject{}API deployment strategy override.
api.terminationGracePeriodSecondsstringnilAPI pod termination grace period (seconds). Set to null to use Kubernetes default.
api.tolerationslist[]API scheduling: tolerations.
api.topologySpreadConstraintslist[]API topology spread constraints. When empty, a default hostname spread is applied.
api.workingDirstring""Working directory used by default shell command.
commonAnnotationsobject{}Additional annotations added to supported chart resources.
commonLabelsobject{}Additional labels added to all chart resources.
frontend.affinityobject{}Web scheduling: affinity rules. When empty, default soft anti-affinity is applied.
frontend.argslist[]Optional web container args override.
frontend.autoscaling.enabledbooltrueEnable HPA for web deployment.
frontend.autoscaling.maxReplicasint10Maximum web replicas under HPA.
frontend.autoscaling.minReplicasint2Minimum web replicas under HPA.
frontend.autoscaling.targetCPUUtilizationPercentageint70Target average CPU utilization for web HPA.
frontend.autoscaling.targetMemoryUtilizationPercentageint75Target average memory utilization for web HPA.
frontend.commandlist[]Optional web container command override.
frontend.containerSecurityContext.allowPrivilegeEscalationboolfalseDisallow privilege escalation in web container.
frontend.containerSecurityContext.capabilities.droplist["ALL"]Drop all Linux capabilities in web container.
frontend.containerSecurityContext.readOnlyRootFilesystemboolfalsepath the app writes to at runtime. Hardening step for advanced users.
frontend.env.HOSTNAMEstring"0.0.0.0"Bind address for Next.js standalone server.
frontend.env.NEXT_PUBLIC_API_URLstring"/api"Browser-side API base path.
frontend.env.NODE_ENVstring"production"Runtime environment passed to web container.
frontend.env.PORTstring"3100"Web listen port.
frontend.extraEnvlist[]Extra environment variables for web container.
frontend.extraEnvFromlist[]Extra envFrom sources for web container.
frontend.extraVolumeMountslist[]Extra volume mounts for the web container.
frontend.extraVolumeslist[]Extra volumes for the web pod.
frontend.image.pullPolicystring"IfNotPresent"Web image pull policy.
frontend.image.repositorystring"classifyre/web"Web container image repository.
frontend.image.tagstring""Web container image tag. Defaults to the chart appVersion when empty.
frontend.lifecycleobject{"preStop":{"exec":{"command":["/bin/sh","-c","sleep 5"]}}}Lifecycle hooks for the web container.
frontend.livenessProbe.enabledbooltrueEnable web liveness probe.
frontend.livenessProbe.failureThresholdint6Web liveness failure threshold.
frontend.livenessProbe.initialDelaySecondsint30Delay before starting web liveness checks.
frontend.livenessProbe.pathstring"/"HTTP path for web liveness probe.
frontend.livenessProbe.periodSecondsint15Web liveness check period.
frontend.livenessProbe.timeoutSecondsint5Web liveness check timeout.
frontend.nodeSelectorobject{}Web scheduling: node selector.
frontend.pdb.enabledbooltrueEnable PodDisruptionBudget for web deployment.
frontend.pdb.minAvailableint1Web minimum pods available during disruptions.
frontend.podAnnotationsobject{}Additional pod annotations for web deployment.
frontend.podLabelsobject{}Additional pod labels for web deployment.
frontend.podSecurityContext.fsGroupint10001Web fsGroup for mounted volumes.
frontend.podSecurityContext.runAsGroupint10001Web pod group ID.
frontend.podSecurityContext.runAsNonRootbooltrueRequire web container to run as non-root.
frontend.podSecurityContext.runAsUserint10001Web pod user ID.
frontend.podSecurityContext.seccompProfile.typestring"RuntimeDefault"Web pod seccomp profile type.
frontend.posthog.enabledboolfalseEnable PostHog analytics. When false, no env vars are injected.
frontend.posthog.hoststring"/classifyre-usr"subdomain (e.g. https://e.yourcompany.com) for extra reliability.
frontend.posthog.ingestHoststring"https://us.i.posthog.com"Use https://eu.i.posthog.com for EU Cloud, or your managed proxy CNAME.
frontend.posthog.tokenstring""PostHog project token (phc_…). Required when enabled=true.
frontend.posthog.uiHoststring"https://us.posthog.com"Use https://eu.posthog.com for EU Cloud.
frontend.priorityClassNamestring""Web pod priority class.
frontend.readinessProbe.enabledbooltrueEnable web readiness probe.
frontend.readinessProbe.failureThresholdint6Web readiness failure threshold.
frontend.readinessProbe.initialDelaySecondsint10Delay before starting web readiness checks.
frontend.readinessProbe.pathstring"/"HTTP path for web readiness probe.
frontend.readinessProbe.periodSecondsint10Web readiness check period.
frontend.readinessProbe.timeoutSecondsint3Web readiness check timeout.
frontend.replicaCountint2Number of web replicas when autoscaling is disabled.
frontend.resources.limitsobject{"cpu":"1","memory":"1Gi"}Web resource limits.
frontend.resources.requestsobject{"cpu":"200m","memory":"384Mi"}Web resource requests.
frontend.service.annotationsobject{}Additional web service annotations.
frontend.service.nodePortstringnilFixed nodePort when type is NodePort or LoadBalancer.
frontend.service.portint3100Web service port.
frontend.service.typestring"ClusterIP"Web service type.
frontend.startCommandstring"node /app/apps/web/server.js"Default web process command when command/args are not set.
frontend.startupProbe.enabledbooltrueEnable web startup probe.
frontend.startupProbe.failureThresholdint30Web startup failure threshold.
frontend.startupProbe.pathstring"/"HTTP path for web startup probe.
frontend.startupProbe.periodSecondsint10Web startup check period.
frontend.startupProbe.timeoutSecondsint3Web startup check timeout.
frontend.strategyobject{}Web deployment strategy override.
frontend.terminationGracePeriodSecondsstringnilWeb pod termination grace period (seconds). Set to null to use Kubernetes default.
frontend.tolerationslist[]Web scheduling: tolerations.
frontend.topologySpreadConstraintslist[]Web topology spread constraints. When empty, a default hostname spread is applied.
fullnameOverridestring""Fully override release-based resource names.
imagePullSecretslist[]Image pull secrets for all workloads.
ingress.annotationsobject{}Shared ingress annotations (nginx-specific rewrite annotations are applied to API ingress automatically).
ingress.classNamestring"nginx"Ingress class name.
ingress.enabledboolfalseEnable ingress resources for web/api/socket routes.
ingress.hoststring""Hostname for all ingress rules. Required when ingress.enabled=true.
ingress.tlslist[]TLS configuration for ingress.
nameOverridestring"classifyre"Override chart name used in resource names.
networkPolicy.enabledboolfalseEnable network policies for API and web pods.
networkPolicy.ingressNamespaceSelectorobject{}Namespace selector allowed to reach API/web when network policy is enabled.
objectStorage.accessKeyIdstring""Inline access key ID. Prefer existingSecret for production.
objectStorage.bucketstring"classifyre-logs"S3 bucket used for runner logs.
objectStorage.enabledboolfalseSet to true to enable S3-compatible object storage.
objectStorage.endpointstring""S3 endpoint URL. Leave empty for AWS S3 (SDK auto-resolves). Required for all other providers.
objectStorage.existingSecretstring""Name of a pre-created Kubernetes Secret with S3 credentials. When set, accessKeyId/secretAccessKey are ignored.
objectStorage.existingSecretAccessKeyIdKeystring"access-key-id"Key inside existingSecret that holds the access key ID.
objectStorage.existingSecretSecretAccessKeyKeystring"secret-access-key"Key inside existingSecret that holds the secret access key.
objectStorage.forcePathStyleboolfalseForce path-style S3 URLs. Required for MinIO, Garage, Backblaze B2, and most non-AWS providers.
objectStorage.logPrefixstring"runner-logs/"S3 object key prefix for runner logs.
objectStorage.regionstring"us-east-1"AWS region. Required for AWS S3; ignored by most self-hosted providers.
objectStorage.sandboxBucketstring"classifyre-sandbox"S3 bucket used for sandbox uploaded files.
objectStorage.secretAccessKeystring""Inline secret access key. Prefer existingSecret for production.
postgres.cnpg.appPasswordstring""Application password for generated CNPG secret.
postgres.cnpg.bootstrapSecretNamestring""Existing CNPG app secret name.
postgres.cnpg.clusterNamestring"classifyre-cnpg"CloudNativePG cluster resource name.
postgres.cnpg.databasestring"classifyre"Database bootstrapped by CNPG.
postgres.cnpg.imageNamestring"ghcr.io/cloudnative-pg/postgresql:17"CNPG Postgres image.
postgres.cnpg.instancesint3Number of CNPG instances.
postgres.cnpg.storage.sizestring"20Gi"CNPG storage size per instance.
postgres.cnpg.storage.storageClassNamestring""CNPG storage class name.
postgres.cnpg.superuserSecretNamestring""Existing CNPG superuser secret name.
postgres.cnpg.userstring"classifyre"Owner user bootstrapped by CNPG.
postgres.connection.sslModestring"disable"sslmode used by API when connecting to PostgreSQL (disable, require, verify-ca, verify-full).
postgres.embedded.affinityobject{}Embedded Postgres scheduling: affinity rules.
postgres.embedded.containerSecurityContextobject{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]}}Embedded Postgres container security context.
postgres.embedded.databasestring"classifyre"Embedded Postgres database name.
postgres.embedded.existingSecretstring""Existing secret name holding embedded Postgres password.
postgres.embedded.existingSecretPasswordKeystring"password"Secret key name for embedded Postgres password.
postgres.embedded.image.pullPolicystring"IfNotPresent"Embedded Postgres image pull policy.
postgres.embedded.image.repositorystring"postgres"Embedded Postgres image repository.
postgres.embedded.image.tagstring"18"Embedded Postgres image tag.
postgres.embedded.nodeSelectorobject{}Embedded Postgres scheduling: node selector.
postgres.embedded.passwordstring""Embedded Postgres password (required when existingSecret is empty).
postgres.embedded.persistence.accessModeslist["ReadWriteOnce"]Access modes for embedded Postgres PVC.
postgres.embedded.persistence.enabledbooltrueEnable persistent volume for embedded Postgres data.
postgres.embedded.persistence.existingClaimstring""Existing PVC name for embedded Postgres data.
postgres.embedded.persistence.sizestring"20Gi"Requested size for embedded Postgres PVC.
postgres.embedded.persistence.storageClassNamestring""Storage class for embedded Postgres PVC.
postgres.embedded.podAnnotationsobject{}Additional annotations for embedded Postgres pod.
postgres.embedded.podLabelsobject{}Additional labels for embedded Postgres pod.
postgres.embedded.podSecurityContextobject{"fsGroup":999,"runAsGroup":999,"runAsUser":999,"seccompProfile":{"type":"RuntimeDefault"}}Embedded Postgres pod security context.
postgres.embedded.portint5432Embedded Postgres service and container port.
postgres.embedded.priorityClassNamestring""Embedded Postgres pod priority class.
postgres.embedded.resources.limitsobject{"cpu":"2","memory":"4Gi"}Embedded Postgres resource limits.
postgres.embedded.resources.requestsobject{"cpu":"100m","memory":"256Mi"}Embedded Postgres resource requests.
postgres.embedded.service.annotationsobject{}Additional annotations for embedded Postgres service.
postgres.embedded.terminationGracePeriodSecondsstringnilEmbedded Postgres pod termination grace period (seconds). Set to null to use Kubernetes default.
postgres.embedded.tolerationslist[]Embedded Postgres scheduling: tolerations.
postgres.embedded.usernamestring"postgres"Embedded Postgres user name.
postgres.external.databasestring"classifyre"External Postgres database name.
postgres.external.existingSecretstring""Existing secret name for external Postgres credentials.
postgres.external.existingSecretPasswordKeystring"password"Secret key name for external Postgres password.
postgres.external.existingSecretUrlKeystring""Optional secret key containing full DATABASE_URL.
postgres.external.hoststring""External Postgres host.
postgres.external.passwordstring""External Postgres password (required when existingSecret is empty).
postgres.external.portint5432External Postgres port.
postgres.external.sslModestring"disable"Deprecated: use postgres.connection.sslMode instead.
postgres.external.usernamestring"classifyre"External Postgres user name.
postgres.modestring"embedded"PostgreSQL mode: external, cnpg, or embedded.
priorityClasses.batchNamestring"batch-low-priority"Priority class name for batch workloads.
priorityClasses.batchValueint1000Numeric priority value for batch workloads.
priorityClasses.createboolfalseCreate service and batch priority classes.
priorityClasses.serviceNamestring"service-standard"Priority class name for service workloads.
priorityClasses.serviceValueint10000Numeric priority value for service workloads.
rbac.createbooltrueCreate Role/RoleBinding for API CLI job orchestration.
serviceAccount.annotationsobject{}Extra annotations for the API service account.
serviceAccount.automountbooltrueMount service account token into API pods (required for Kubernetes CLI jobs).
serviceAccount.createbooltrueCreate the API service account.
serviceAccount.namestring""Existing service account name to use when create=false.
telemetry.deployEnvstring"production"Deployment environment tag attached to every span/metric/log.
telemetry.enabledboolfalseOpt out (already default): set enabled=false, or set TELEMETRY_DISABLED=1 / DO_NOT_TRACK=1 at runtime.
telemetry.instanceId.configMapKeystring"instance-id"Key inside the ConfigMap that holds the UUID string.
telemetry.instanceId.enabledbooltruePersist a stable anonymous instance UUID in a ConfigMap so it survives upgrades.
telemetry.instanceId.existingConfigMapstring""Use an existing ConfigMap instead of creating one. Must contain instanceId.configMapKey.
telemetry.otlpEndpointstring""otlpEndpoint: “http://otel-receiver-opentelemetry-collector.monitoring:4318
telemetry.otlpProtocolstring"http/protobuf"OTLP export protocol: “http/protobuf” (default) or “grpc”.
Last updated on