You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(openclaw-helm): bump to chart 1.3.4, document config merge modes
Bump version references to 1.3.4 (appVersion 2026.2.6). Rewrite the
GitOps Behavior section to cover the new configMode merge/overwrite
options introduced since 1.3.0, add ArgoCD ignoreDifferences hint for
merge mode, and mention the init-config container in the architecture
overview.
Copy file name to clipboardExpand all lines: openclaw-helm.html/0.md
+93-4Lines changed: 93 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,7 +22,7 @@ This post walks through deploying OpenClaw on Kubernetes using [my Helm chart](h
22
22
The setup is straightforward:
23
23
24
24
-**OpenClaw** runs as a single-replica Deployment (it cannot scale horizontally by design)
25
-
-**Sidecars and init containers** include a Chromium browser for automationand an init-skills container for declaratively installing skills and runtime dependencies
25
+
-**Sidecars and init containers** include a Chromium browser for automation, an init-config container for initializing configuration (with merge or overwrite modes), and an init-skills container for declaratively installing ClawHub skills and runtime dependencies
26
26
-**Configuration** is stored in a ConfigMap using JSON5 format
27
27
-**Persistent storage** keeps workspace data, sessions, and application state
28
28
-**Secrets** are managed externally (Vault recommended, but optional)
@@ -31,7 +31,24 @@ The Helm chart is built on the [bjw-s app-template](https://github.com/bjw-s/hel
31
31
32
32
#### GitOps Behavior
33
33
34
-
This is important: **any configuration done via the OpenClaw web UI is ephemeral**. When the pod restarts, UI changes are wiped. The source of truth is your Helm values and manifests in Git. This is intentional. If you want persistent configuration changes, commit them to your repository.
34
+
The chart supports two config modes, controlled by the `configMode` value:
35
+
36
+
-**merge** (default): Helm values are deep-merged with the existing config on the PVC at each restart. Runtime changes made through the web UI—paired devices, settings tweaks, etc.—persist across pod restarts. Your Helm values act as defaults and overrides, but they don't wipe what's already there.
37
+
-**overwrite**: strict GitOps. The config file is replaced wholesale on every restart, so the source of truth is purely your Helm values and manifests in Git. Any changes made through the UI are ephemeral.
38
+
39
+
If you want full declarative control with no drift, set `configMode: overwrite`. If you prefer a more forgiving setup where UI changes survive restarts, leave the default.
40
+
41
+
If you use merge mode with ArgoCD, you'll want to tell ArgoCD to ignore diffs on the ConfigMap so it doesn't fight with runtime config on the PVC:
For TLS termination and DNS automation (using tools like [cert-manager](https://cert-manager.io/) and [external-dns](https://github.com/kubernetes-sigs/external-dns)), that's a topic that deserves its own post. For now, just know the Helm chart exposes the service on port 18789 and you can wire it up however fits your setup.
261
278
279
+
### Network Policy Isolation
280
+
281
+
Given OpenClaw's security profile—shell access, file reads, untrusted input processing—network policies add an important layer of defense. Even if the application gets compromised, network policies limit what an attacker can reach from within the pod.
282
+
283
+
The Helm chart includes a network policy that's disabled by default. Enable it in your values:
284
+
285
+
```yaml
286
+
openclaw:
287
+
app-template:
288
+
networkpolicies:
289
+
main:
290
+
enabled: true
291
+
```
292
+
293
+
The default policy allows:
294
+
295
+
- **Ingress** from the `gateway-system` namespace on port 18789
296
+
- **Egress** to kube-dns for DNS resolution
297
+
- **Egress** to all public internet IPs (blocks RFC1918 private ranges)
298
+
299
+
This means OpenClaw can reach external APIs (Anthropic, OpenAI, messaging platforms) but cannot access your internal services, databases, or other workloads. The blast radius of a compromise stays contained.
300
+
301
+
Adjust the ingress source to match your setup. If you're using ingress-nginx instead of Gateway API:
302
+
303
+
```yaml
304
+
openclaw:
305
+
app-template:
306
+
networkpolicies:
307
+
main:
308
+
enabled: true
309
+
rules:
310
+
ingress:
311
+
- from:
312
+
- namespaceSelector:
313
+
matchLabels:
314
+
kubernetes.io/metadata.name: ingress-nginx
315
+
ports:
316
+
- protocol: TCP
317
+
port: 18789
318
+
```
319
+
320
+
If you need OpenClaw to reach specific internal services (Vault, a local LLM, internal APIs), add explicit egress rules:
321
+
322
+
```yaml
323
+
openclaw:
324
+
app-template:
325
+
networkpolicies:
326
+
main:
327
+
enabled: true
328
+
rules:
329
+
egress:
330
+
# ... keep existing rules ...
331
+
# Vault for secrets
332
+
- to:
333
+
- namespaceSelector:
334
+
matchLabels:
335
+
kubernetes.io/metadata.name: vault
336
+
ports:
337
+
- protocol: TCP
338
+
port: 8200
339
+
# Local Ollama instance
340
+
- to:
341
+
- namespaceSelector:
342
+
matchLabels:
343
+
kubernetes.io/metadata.name: ollama
344
+
ports:
345
+
- protocol: TCP
346
+
port: 11434
347
+
```
348
+
349
+
Note that network policies require a CNI that supports them—Calico, Cilium, and Weave all work. If you're running Flannel without the network policy controller, policies will be created but not enforced.
350
+
262
351
### Post-Installation: Device Pairing
263
352
264
353
Once the pod is running, you need to pair your device with OpenClaw.
0 commit comments