CHouseUI
Install & upgrade

Helm values reference

Every value of the chouse-ui Helm chart with its type, default and meaning — generated from the chart.

Source
Generated from charts/chouse-ui/values.yaml (via the chart README), so it always matches the code.

Every value of the chouse-ui Helm chart, version 2.0.1. Installing, topology and upgrades are covered in Helm chart; this page is the lookup table.

The app itself is configured through the free-form config: value, which the chart renders to a YAML file loaded via CHOUSE_CONFIG_PATH — so every key on Environment variables can go there. Secrets belong in secrets.* or an existing Kubernetes secret, not in config:.

affinity

KeyTypeDefaultDescription
affinityobject{}Affinity for all pods.

autoscaling

KeyTypeDefaultDescription
autoscaling.enabledboolfalseHorizontal pod autoscaling for the web pods. Requires database.type: postgres (render fails on sqlite). Implies CHOUSE_HA=true regardless of replicaCount.
autoscaling.maxReplicasint5
autoscaling.minReplicasint2
autoscaling.targetCPUUtilizationPercentageint80Target average CPU utilization (percent).
autoscaling.targetMemoryUtilizationPercentagestring""Target average memory utilization (percent). Empty disables the memory metric.

clickhouse

KeyTypeDefaultDescription
clickhouse.auth.accessManagementbooltrueGrant the user access management rights (needed for CHouse UI's ClickHouse user/role management features).
clickhouse.auth.passwordstring""
clickhouse.auth.usernamestring"default"ClickHouse user and password. The password is required when enabled. openssl rand -hex 16.
clickhouse.enabledboolfalseDeploy a single-node ClickHouse StatefulSet and pre-fill the app's connection form with its in-cluster URL.
clickhouse.image.pullPolicystring"IfNotPresent"
clickhouse.image.repositorystring"clickhouse/clickhouse-server"
clickhouse.image.tagstring"25.3-alpine"
clickhouse.nodeSelectorobject{}Node selector for the ClickHouse pod.
clickhouse.persistence.enabledboolfalseOff by default, same reasoning as the bundled PostgreSQL.
clickhouse.persistence.sizestring"10Gi"
clickhouse.persistence.storageClassstring""
clickhouse.podSecurityContextobject{"fsGroup":101,"runAsGroup":101,"runAsNonRoot":true,"runAsUser":101,"seccompProfile":{"type":"RuntimeDefault"}}Pod security context. Defaults suit the official ClickHouse image (runs as uid/gid 101).
clickhouse.resources.limits.memorystring"2Gi"
clickhouse.resources.requests.cpustring"250m"
clickhouse.resources.requests.memorystring"512Mi"
clickhouse.tolerationslist[]Tolerations for the ClickHouse pod.

commonLabels

KeyTypeDefaultDescription
commonLabelsobject{}Labels added to every rendered resource.

config

KeyTypeDefaultDescription
configobject{}Freeform CHouse UI configuration, rendered to a Secret-mounted config.yaml (see .config.example.yaml in the repo for the full schema: SSO, fleet poller, AI doctor, admin seeding, CORS, log level, ...). Do NOT set keys the chart already manages (port, node_env, static_path, rbac.db_type, rbac.sqlite_path, rbac.postgres_url, rbac.encryption, jwt.secret, scheduled_queries) — the chart refuses to render if you do, because config.yaml values override the pod environment.

containerSecurityContext

KeyTypeDefaultDescription
containerSecurityContextobject{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true}Container security context. The root filesystem is read-only; the chart mounts an emptyDir on /tmp.

database

KeyTypeDefaultDescription
database.postgres.existingSecretstring""Name of an existing Secret holding the connection URL.
database.postgres.existingSecretKeystring"RBAC_POSTGRES_URL"Key inside existingSecret that holds the URL.
database.postgres.poolSizeint10Connection pool size per pod.
database.postgres.urlstring""Full PostgreSQL connection URL (postgres://user:pass@host:5432/dbname). Stored in a chart-managed Secret. Prefer existingSecret so the URL never lands in values files.
database.sqlite.persistence.accessModeslist["ReadWriteOnce"]PVC access modes.
database.sqlite.persistence.annotationsobject{}Extra annotations for the PVC (e.g. to keep it on helm uninstall).
database.sqlite.persistence.enabledbooltruePersist the SQLite database (/app/data) on a PVC. Disabling this loses all users, connections, and settings on every pod restart — only do it for throwaway installs.
database.sqlite.persistence.existingClaimstring""Use a pre-created PVC instead of chart-managed one.
database.sqlite.persistence.sizestring"1Gi"PVC size.
database.sqlite.persistence.storageClassstring""StorageClass. Empty string uses the cluster default.
database.typestring"sqlite"RBAC database backend: sqlite (single replica + PVC) or postgres (external PostgreSQL; required for HA / more than one replica).

dedicatedScheduler

KeyTypeDefaultDescription
dedicatedScheduler.enabledboolfalseRun the scheduled-queries scheduler on a dedicated single-replica Deployment instead of the web pods. Requires database.type: postgres.
dedicatedScheduler.resourcesobject{}Resources for the scheduler pod.

extraEnv

KeyTypeDefaultDescription
extraEnvlist[]Extra environment variables for the web pods (list of EnvVar). Useful for referencing SSO client secrets from Secrets via valueFrom.

extraEnvFrom

KeyTypeDefaultDescription
extraEnvFromlist[]Extra envFrom sources (ConfigMap/Secret refs) for the web pods.

extraVolumeMounts

KeyTypeDefaultDescription
extraVolumeMountslist[]Extra volume mounts for the web container.

extraVolumes

KeyTypeDefaultDescription
extraVolumeslist[]Extra volumes for the web pods.

fullnameOverride

KeyTypeDefaultDescription
fullnameOverridestring""Override the fully qualified release name.

image

KeyTypeDefaultDescription
image.pullPolicystring"IfNotPresent"Image pull policy.
image.repositorystring"ghcr.io/daun-gatal/chouse-ui"Container image repository.
image.tagstring""Image tag. Defaults to v<Chart.appVersion>.

imagePullSecrets

KeyTypeDefaultDescription
imagePullSecretslist[]Secrets for pulling the image from a private registry.

ingress

KeyTypeDefaultDescription
ingress.annotationsobject{}Ingress annotations. Two matter operationally: AI chat streams over SSE, so raise the proxy read timeout (nginx: nginx.ingress.kubernetes.io/proxy-read-timeout: "300") and disable buffering (nginx.ingress.kubernetes.io/proxy-buffering: "off"); and login rate limiting keys on X-Forwarded-For, so the ingress must overwrite it with the real client IP.
ingress.classNamestring""IngressClass name.
ingress.enabledboolfalseExpose the UI through an Ingress.
ingress.hosts[0].hoststring"chouse-ui.local"
ingress.hosts[0].paths[0].pathstring"/"
ingress.hosts[0].paths[0].pathTypestring"Prefix"
ingress.tlslist[]TLS configuration.

initContainers

KeyTypeDefaultDescription
initContainerslist[]Extra init containers for the web pods.

nameOverride

KeyTypeDefaultDescription
nameOverridestring""Override the chart name.

networkPolicy

KeyTypeDefaultDescription
networkPolicy.egressTolist[]Extra egress rules (full NetworkPolicyEgressRule objects) applied when restrictEgress is true.
networkPolicy.enabledboolfalseCreate a NetworkPolicy for the pods.
networkPolicy.ingressFromlist[]Extra from peers allowed to reach the pods on the app port (in addition to same-namespace pods). Use this to admit your ingress controller's namespace.
networkPolicy.restrictEgressboolfalseRestrict egress. When true, only DNS plus egressTo are allowed — list your ClickHouse hosts, PostgreSQL, IdP, SMTP, and AI provider endpoints there. When false, all egress is allowed.

nodeSelector

KeyTypeDefaultDescription
nodeSelectorobject{}Node selector for all pods.

observability

KeyTypeDefaultDescription
observability.fleetIntervalSecondsstring""Fleet snapshot interval in seconds (OBSERVE_FLEET_INTERVAL, app default 30). Replaces FLEET_POLL_INTERVAL_SECONDS, which is still read.
observability.maxFingerprintsstring""Query shapes tracked per connection for regression detection (OBSERVE_MAX_FINGERPRINTS, app default 5000).
observability.retentionDaysstring""Days of lineage, pipeline and query-shape evidence to keep (OBSERVE_RETENTION_DAYS, app default 90).
observability.scratchDatabasestring""ClickHouse database where codec trials copy samples (OBSERVE_SCRATCH_DATABASE, app default chouse_scratch).

pdb

KeyTypeDefaultDescription
pdb.enabledboolfalsePodDisruptionBudget for the web pods. Only meaningful with more than one replica.
pdb.maxUnavailablestring""Maximum pods that may be unavailable. Set minAvailable to "" when using this.
pdb.minAvailableint1Minimum pods that must stay available. Mutually exclusive with maxUnavailable.

podAnnotations

KeyTypeDefaultDescription
podAnnotationsobject{}Extra annotations for the pods.

podLabels

KeyTypeDefaultDescription
podLabelsobject{}Extra labels for the pods.

podSecurityContext

KeyTypeDefaultDescription
podSecurityContextobject{"fsGroup":1001,"runAsGroup":1001,"runAsNonRoot":true,"runAsUser":1001,"seccompProfile":{"type":"RuntimeDefault"}}Pod security context. The image runs as uid/gid 1001; fsGroup makes the SQLite PVC writable.

postgresql

KeyTypeDefaultDescription
postgresql.auth.databasestring"chouse"Database name, user, and password. The password is required when enabled — the chart never invents credentials. openssl rand -hex 16.
postgresql.auth.passwordstring""
postgresql.auth.usernamestring"chouse"
postgresql.enabledboolfalseDeploy a PostgreSQL StatefulSet alongside the app and wire RBAC_POSTGRES_URL to it. Requires database.type: postgres, and conflicts with database.postgres.url/existingSecret.
postgresql.image.pullPolicystring"IfNotPresent"
postgresql.image.repositorystring"postgres"
postgresql.image.tagstring"16-alpine"
postgresql.nodeSelectorobject{}Node selector for the database pod.
postgresql.persistence.enabledboolfalseOff by default: an evaluation database that loses its data on restart is honest about what it is. Turn it on for a longer-lived demo.
postgresql.persistence.sizestring"8Gi"
postgresql.persistence.storageClassstring""
postgresql.podSecurityContextobject{"fsGroup":70,"runAsGroup":70,"runAsNonRoot":true,"runAsUser":70,"seccompProfile":{"type":"RuntimeDefault"}}Pod security context. Defaults suit the official postgres image (runs as uid/gid 70 on Alpine).
postgresql.resources.limits.memorystring"1Gi"
postgresql.resources.requests.cpustring"100m"
postgresql.resources.requests.memorystring"256Mi"
postgresql.tolerationslist[]Tolerations for the database pod.

preStopSleepSeconds

KeyTypeDefaultDescription
preStopSleepSecondsint5Seconds the web container keeps serving after Kubernetes starts terminating it (preStop sleep). Endpoint removal reaches kube-proxy asynchronously; without this, connections routed to a terminating pod during a rolling update can hang. Set to 0 to disable. Applies to web pods only (the scheduler receives no Service traffic).

priorityClassName

KeyTypeDefaultDescription
priorityClassNamestring""Priority class for all pods.

probes

KeyTypeDefaultDescription
probes.livenessobject{"failureThreshold":3,"httpGet":{"path":"/api/health","port":"http"},"periodSeconds":20,"timeoutSeconds":5}Liveness probe — dependency-free endpoint.
probes.readinessobject{"failureThreshold":3,"httpGet":{"path":"/api/rbac/health","port":"http"},"periodSeconds":10,"timeoutSeconds":5}Readiness probe — 503 until the RBAC database is healthy and migrations have applied.
probes.startupobject{"failureThreshold":60,"httpGet":{"path":"/api/rbac/health","port":"http"},"periodSeconds":5,"timeoutSeconds":5}Startup probe — generous budget (5 min) so long upgrade migrations don't get the pod killed.

publicBaseUrl

KeyTypeDefaultDescription
publicBaseUrlstring""External URL of CHouse UI (PUBLIC_BASE_URL), used in Slack messages to link back to incidents and fixes. Empty: links are omitted.

remediation

KeyTypeDefaultDescription
remediation.maintenanceWindowstring""UTC window HH:MM-HH:MM for window-only fixes such as codec or TTL changes (REMEDIATION_MAINTENANCE_WINDOW, app default 02:00-04:00).
remediation.slackChannelstring""Slack channel id that receives approval requests (REMEDIATION_SLACK_CHANNEL). Needs slack.*.

replicaCount

KeyTypeDefaultDescription
replicaCountint1Number of web pods. Must be 1 when database.type is sqlite (the chart refuses to render otherwise). When >1, the chart sets CHOUSE_HA=true on the pods automatically.

resources

KeyTypeDefaultDescription
resources.limits.memorystring"1Gi"
resources.requests.cpustring"250m"
resources.requests.memorystring"256Mi"

scheduledQueries

KeyTypeDefaultDescription
scheduledQueries.enabledbooltrueRun the in-process scheduled-queries scheduler on the web pods. Redundant ticks across pods are harmless (per-job atomic lease on PostgreSQL). Ignored (forced off on web pods) when dedicatedScheduler.enabled is true.

secrets

KeyTypeDefaultDescription
secrets.encryptionKeystring""AES-256 key for stored connection passwords, 64 hex chars. Generate: openssl rand -hex 32.
secrets.encryptionSaltstring""Key-derivation salt, exactly 64 hex chars. Generate: openssl rand -hex 32.
secrets.existingSecretstring""Name of an existing Secret with keys JWT_SECRET, RBAC_ENCRYPTION_KEY, and RBAC_ENCRYPTION_SALT (recommended). When empty, the three inline values below are required and rendered into a chart-managed Secret. The chart never auto-generates these: the encryption key/salt protect stored ClickHouse passwords, and a regenerated key makes them unrecoverable.
secrets.jwtSecretstring""JWT signing secret, min 32 chars. Generate: openssl rand -base64 32.

service

KeyTypeDefaultDescription
service.annotationsobject{}Extra annotations for the Service.
service.portint80Service port (targets the fixed container port 5521).
service.sessionAffinitystring""Service sessionAffinity (ClientIP or None). Since ADR 0010 the app keeps no request-authoritative state in pod memory, so multi-replica is correct WITHOUT stickiness and you should not need this. It remains available for operators who want a client pinned to one pod for other reasons (e.g. warm per-pod caches). Note that behind an ingress controller or mesh proxy every request appears to come from the proxy's IP, which collapses ClientIP affinity onto a single pod — prefer cookie affinity at your ingress if you need stickiness.
service.sessionAffinityTimeoutSecondsint10800Session stickiness timeout when sessionAffinity: ClientIP.
service.typestring"ClusterIP"Service type.

serviceAccount

KeyTypeDefaultDescription
serviceAccount.annotationsobject{}Annotations for the ServiceAccount.
serviceAccount.createbooltrueCreate a ServiceAccount for the pods.
serviceAccount.namestring""ServiceAccount name override.

slack

KeyTypeDefaultDescription
slack.botTokenstring""Slack bot token (xoxb-…): posts approval requests.
slack.existingSecretstring""Name of an existing Secret with keys SLACK_SIGNING_SECRET and SLACK_BOT_TOKEN (either may be absent). Slack reaches /api/integrations/slack/interactions through your Ingress; with networkPolicy.restrictEgress, add an egressTo rule for slack.com.
slack.signingSecretstring""Slack app signing secret: verifies approve/reject button clicks.

terminationGracePeriodSeconds

KeyTypeDefaultDescription
terminationGracePeriodSecondsint60Grace period so the SIGTERM handler can release poller leases and drain scheduled-query slots.

tolerations

KeyTypeDefaultDescription
tolerationslist[]Tolerations for all pods.

topologySpreadConstraints

KeyTypeDefaultDescription
topologySpreadConstraintslist[]Topology spread constraints for the web pods (postgres/HA installs).