apiVersion: apps/v1 kind: Deployment metadata: namespace: customer1 name: openclaw labels: app: openclaw spec: replicas: 1 selector: matchLabels: app: openclaw strategy: type: Recreate template: metadata: labels: app: openclaw spec: automountServiceAccountToken: false securityContext: fsGroup: 1000 # This helps chown files created by rootfs seccompProfile: type: RuntimeDefault initContainers: - name: init-home image: busybox:1.37 imagePullPolicy: IfNotPresent command: - sh - -c - | mkdir -p /home/node/.npm /home/node/.openclaw/workspace # No chown needed — fsGroup + our UID will handle it echo "✅ Home directories created" securityContext: runAsUser: 1000 # Non-root runAsGroup: 1000 volumeMounts: - name: openclaw-home-new mountPath: /home/node - name: init-config image: busybox:1.37 imagePullPolicy: IfNotPresent command: - sh - -c - | cp /config/openclaw.json /home/node/.openclaw/openclaw.json cp /config/AGENTS.md /home/node/.openclaw/workspace/AGENTS.md || true echo "✅ Config copied" securityContext: runAsUser: 1000 runAsGroup: 1000 volumeMounts: - name: openclaw-home-new mountPath: /home/node - name: config mountPath: /config containers: - name: gateway image: ghcr.io/openclaw/openclaw:slim imagePullPolicy: IfNotPresent command: - node - /app/dist/index.js - gateway - run ports: - name: gateway containerPort: 18789 protocol: TCP env: - name: HOME value: /home/node - name: NODE_PATH value: /home/node/.openclaw/plugin-runtime-deps/node_modules - name: OPENCLAW_CONFIG_DIR value: /home/node/.openclaw - name: NODE_ENV value: production - name: NPM_CONFIG_CACHE value: /tmp/.npm - name: OPENCLAW_GATEWAY_TOKEN valueFrom: secretKeyRef: name: openclaw-secrets key: OPENCLAW_GATEWAY_TOKEN - name: ANTHROPIC_API_KEY valueFrom: secretKeyRef: name: openclaw-secrets key: ANTHROPIC_API_KEY optional: true - name: TELEGRAM_BOT_TOKEN valueFrom: secretKeyRef: name: openclaw-secrets key: TELEGRAM_BOT_TOKEN optional: true - name: GEMINI_API_KEY valueFrom: secretKeyRef: name: openclaw-secrets key: GEMINI_API_KEY optional: true - name: OPENROUTER_API_KEY valueFrom: secretKeyRef: name: openclaw-secrets key: OPENROUTER_API_KEY optional: true - name: XAI_API_KEY valueFrom: secretKeyRef: name: xai-apikey key: XAI_API_KEY optional: true resources: requests: memory: 2Gi cpu: "1" limits: memory: 6Gi cpu: "4" securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 allowPrivilegeEscalation: false readOnlyRootFilesystem: false capabilities: drop: - ALL volumeMounts: - name: openclaw-home-new mountPath: /home/node - name: tmp-volume mountPath: /tmp volumes: - name: openclaw-home-new persistentVolumeClaim: claimName: openclaw-home-new-pvc - name: config configMap: name: openclaw-config - name: tmp-volume emptyDir: medium: Memory