Skip to main content
The Helm chart provides a values.yaml that maps to the operator’s command-line flags and Kubernetes resource configuration.

Default values

Value reference

Image

Replicas and scheduling

Removed: the validating webhook

Chart 0.12.0 removed the Deployment validating admission webhook, its webhook.enabled, webhook.mode and webhook.port values, its Service, and its ValidatingWebhookConfiguration. It never produced a warning or a denial in any release, so removing it changes no admission behaviour on your cluster.
An install or upgrade that still sets webhook.enabled=true fails with a message saying the webhook was removed, rather than silently dropping the value. Remove webhook.* from your values files before upgrading to 0.12.0. If you run the binary directly, the --enable-webhook, --webhook-mode, --webhook-cert-path, --webhook-cert-name and --webhook-cert-key flags are gone too, and passing one stops the operator from starting.
Persona validation itself is unaffected: the controller still validates every Deployment against its persona and records the result on the persona’s status. See validation.

Self-healing

Rendered as --enable-health-check=<value> on the operator container either way, so the setting is always visible in the pod spec:
When healthCheck.enabled is false, the operator still validates personas, records their health, and discovers the cluster, and from chart 0.12.0 it never opens an incident or proposes a fix. Chart 0.11.x and older did not fully honour this: an older code path still opened OOMKilled incidents and wrote RemediationAction proposals with detection off, without the guardrails the health-check path applies. Setting metricsServer.enabled=false passes --enable-metrics-server=false; OOM and crash-loop detection read pod status and are unaffected, but usage and saturation signals go dark. See Self-healing.
Upgrading from a chart older than 0.8.0 turns detection on. A release that never set healthCheck.enabled will start detecting after the upgrade: expect IncidentMemory records to appear, and RemediationAction proposals wherever the ClusterPersona self-healing mode is propose (the default). Nothing is applied without approval. To keep the old behaviour, upgrade with --set healthCheck.enabled=false.

Remediation safety

Dorgu never proposes a remediation for a persona in a protected namespace. Three sources make up the list:
  • kube-system, always.
  • The namespace the operator runs in, always. The chart sets POD_NAMESPACE on the operator container from the downward API, so with the documented install that is dorgu-system, and with any other --namespace it is that one.
  • Anything you add, through safety.excludedNamespaces here or through spec.policies.selfHealing.excludeNamespaces on the ClusterPersona. Both are honoured.
From operator v0.13.0, pod detection skips these namespaces too. A pod that fails in a protected namespace raises no incident at all. Before 0.13.0 it raised one that was recorded and never remediated. Node and control-plane findings belong to no namespace and are unaffected. If the ClusterPersona list cannot be read, the pod collector fails rather than guess.
Fixed in operator v0.12.0. Older releases protected a hardcoded dorgu-operator-system, the kustomize default, rather than the namespace the chart actually installs into. With the documented --namespace dorgu-system install, Dorgu’s own namespace was not protected at all. Upgrade if you run 0.11.x.

Event pipeline and DorguEvent retention

The two dorguEvents.* values apply only when eventPipeline.enabled=true, and the chart renders their flags only then. With the pipeline off no watcher or cleaner starts, no DorguEvent is written, and existing records are not pruned. Delete them with kubectl delete dorguevents -A --all. The Kubernetes Events on incidents, which kubectl describe shows, are separate and always on. DorguEvent records are Dorgu’s own log of what it saw, readable with kubectl get dorguevent -A. They live in etcd, so they are bounded twice over: by age, and by count. The count bound is the one that holds on a large cluster. Records arrive in proportion to cluster size, so a time window alone bounds nothing: a five-app clean-room cluster produced 187 records in 100 minutes, roughly 2,700 a day, every one of them inside the 24-hour window and all of them in etcd. The cleaner runs every 30 minutes, deletes oldest-first, and runs one pass at startup rather than waiting a full interval, because a restarted operator inherits the largest backlog it will ever see. With the pipeline on, both flags are rendered on the operator container, so the pod spec states what bounds the record count, maxRecords: 0 included:
New in operator v0.10.0. Before it, the cleaner had no delete permission on dorguevents.dorgu.io at all: it ran every cycle, failed, and removed nothing. The ClusterRole now grants delete on Dorgu’s own CRD and on no workload kind. See why that verb is there.

AI

Both AI values default off, so a chart installed with no --set flags makes no API calls and spends nothing. Rules run either way. The key is always delivered to the pod as an environment variable via secretKeyRef (ANTHROPIC_API_KEY for claude, GEMINI_API_KEY for gemini), and the chart never passes it as a container argument. llm.existingSecretKey defaults to the matching name, and any llm.provider other than claude or gemini fails the install. See AI setup for the full walkthrough and the caveat about llm.apiKey being visible in helm get values.
A Secret you created yourself with kubectl create secret, which is the recommended path, is not part of the Helm release and survives helm uninstall. Delete it explicitly: Uninstall leads with it.

Bootstrap

Set autoCreateClusterPersona: false if you manage ClusterPersonas through GitOps and do not want the operator creating one.

Validation

Metrics and probes

With metrics.enabled=true the chart creates a <release>-metrics Service on the metrics port and a <release>-metrics-reader ClusterRole. With metrics.secure=true every scrape is authenticated and authorized, so bind the reader role to whatever scrapes the operator:
The operator itself needs create on tokenreviews and subjectaccessreviews to check those scrapes, and the chart grants both only while metrics.secure=true. The operator exports gate decisions, apply tickets, heal credit, stage durations, incident counters and model usage. Every family is listed in the metrics reference.

ArgoCD

The watcher auto-detects whether the ArgoCD CRD exists. If enabled: true but the CRD is absent, the watcher silently skips.

Prometheus

Example: http://prometheus-server.monitoring:9090

Removed: the WebSocket server

Chart 0.13.0 removed the operator’s WebSocket server and its websocket.enabled, websocket.port, websocket.service.type and websocket.service.port values, the <release>-websocket Service and the container’s websocket port. The server was unauthenticated and nothing used it. A values file that still sets websocket.* installs unchanged, because Helm ignores unknown keys. See the upgrade guide.

Resources

Service account

Nothing to set. Detection, rule-based diagnosis, and rule-based remediation are all on, and no key is involved:

Example: opting in to AI

Create the Secret out of band, then:

Example: Production deployment

Configuration overview

Feature matrix and CLI flags

AI setup

Key handling, verification, and turning AI off

Self-healing

What the health-check reconciler does once enabled

Installation

Install the operator with these values