Skip to content

Commit f6fe4d7

Browse files
committed
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.
1 parent 07d8484 commit f6fe4d7

File tree

1 file changed

+93
-4
lines changed
  • openclaw-helm.html

1 file changed

+93
-4
lines changed

openclaw-helm.html/0.md

Lines changed: 93 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ This post walks through deploying OpenClaw on Kubernetes using [my Helm chart](h
2222
The setup is straightforward:
2323

2424
- **OpenClaw** runs as a single-replica Deployment (it cannot scale horizontally by design)
25-
- **Sidecars and init containers** include a Chromium browser for automation and 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
2626
- **Configuration** is stored in a ConfigMap using JSON5 format
2727
- **Persistent storage** keeps workspace data, sessions, and application state
2828
- **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
3131

3232
#### GitOps Behavior
3333

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:
42+
43+
```yaml
44+
spec:
45+
ignoreDifferences:
46+
- group: ""
47+
kind: ConfigMap
48+
name: openclaw
49+
jsonPointers:
50+
- /data
51+
```
3552
3653
### Quick Start with Helm
3754
@@ -118,11 +135,11 @@ name: openclaw
118135
description: OpenClaw deployment for my-cluster
119136
type: application
120137
version: 1.0.0
121-
appVersion: "2026.1.30"
138+
appVersion: "2026.2.6"
122139

123140
dependencies:
124141
- name: openclaw
125-
version: 1.3.0
142+
version: 1.3.4
126143
repository: https://serhanekicii.github.io/openclaw-helm
127144
```
128145
@@ -259,6 +276,78 @@ spec:
259276

260277
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.
261278

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+
262351
### Post-Installation: Device Pairing
263352

264353
Once the pod is running, you need to pair your device with OpenClaw.

0 commit comments

Comments
 (0)