From 707a140445ecc5bf0a19b4a3e7ef43581e9495f4 Mon Sep 17 00:00:00 2001 From: Oleksii Kurinnyi Date: Tue, 21 Jul 2026 12:33:49 +0300 Subject: [PATCH 1/5] feat: add OpenClaw AI assistant stack Signed-off-by: Oleksii Kurinnyi --- stacks/openclaw/1.0.0/devfile.yaml | 151 +++++++++++++++++++++++++++++ stacks/openclaw/stack.yaml | 7 ++ 2 files changed, 158 insertions(+) create mode 100644 stacks/openclaw/1.0.0/devfile.yaml create mode 100644 stacks/openclaw/stack.yaml diff --git a/stacks/openclaw/1.0.0/devfile.yaml b/stacks/openclaw/1.0.0/devfile.yaml new file mode 100644 index 000000000..64af0f9e9 --- /dev/null +++ b/stacks/openclaw/1.0.0/devfile.yaml @@ -0,0 +1,151 @@ +# OpenClaw — Personal AI Assistant Stack +# +# OpenClaw is a multi-channel AI assistant gateway by the OpenClaw project. +# Repo: https://github.com/openclaw/openclaw +# +# The openclaw container runs the Gateway service which provides: +# - Control UI on port 18789 +# - Multi-channel messaging (WhatsApp, Telegram, Slack, Discord, 25+ channels) +# - Agent tools, skills, cron jobs, webhooks +# +# State is relocated to /opt/data via OPENCLAW_CONFIG_DIR to handle +# OpenShift arbitrary UIDs (the official image uses uid 1000 with 700 perms). +# +# First boot: run `openclaw setup` in the terminal to configure +# your API key and model provider. + +schemaVersion: 2.2.2 +metadata: + name: openclaw + displayName: OpenClaw AI Assistant + description: Personal AI assistant with multi-channel messaging gateway. WhatsApp, Telegram, Slack, Discord, and 25+ channels. + icon: https://raw.githubusercontent.com/openclaw/openclaw/main/ui/public/favicon.svg + tags: + - AI + - Assistant + - Gateway + - OpenClaw + projectType: AI + language: TypeScript + version: 1.0.0 + +attributes: + controller.devfile.io/storage-type: per-workspace + +components: + - name: tools + container: + image: quay.io/devfile/universal-developer-image:ubi9-latest + memoryLimit: 1Gi + memoryRequest: 256Mi + mountSources: true + + # OpenClaw Gateway container. + # Runs the gateway service with Control UI on port 18789. + # State is relocated from /home/node/.openclaw (uid 1000, 700 perms) + # to /opt/data on a writable PVC for OpenShift arbitrary-UID compat. + - name: openclaw + container: + image: docker.io/openclaw/openclaw:2026.7.1 + mountSources: false + memoryRequest: 2Gi + memoryLimit: 3Gi + env: + - name: HOME + value: /opt/data/home + - name: OPENCLAW_CONFIG_DIR + value: /opt/data/config + - name: OPENCLAW_WORKSPACE_DIR + value: /opt/data/config/workspace + - name: OPENCLAW_GATEWAY_BIND + value: lan + - name: OPENCLAW_SKIP_ONBOARDING + value: "1" + command: ["/bin/bash", "-c"] + args: + - | + if ! whoami &>/dev/null; then + echo "openclaw:x:$(id -u):0:OpenClaw:${HOME}:/bin/bash" >> /etc/passwd + fi + + mkdir -p "${HOME}" "${OPENCLAW_CONFIG_DIR}" "${OPENCLAW_WORKSPACE_DIR}" + + TOKEN_FILE="${OPENCLAW_CONFIG_DIR}/.gateway-token" + if [ ! -f "${TOKEN_FILE}" ]; then + TOKEN=$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 48) + echo "${TOKEN}" > "${TOKEN_FILE}" + chmod 600 "${TOKEN_FILE}" + echo "============================================" + echo " Gateway token: ${TOKEN}" + echo " Run 'show-token' command to see it again." + echo "============================================" + fi + export OPENCLAW_GATEWAY_TOKEN=$(cat "${TOKEN_FILE}") + + exec tini -s -- node /app/openclaw.mjs gateway + endpoints: + - name: control-ui + targetPort: 18789 + exposure: public + protocol: https + attributes: + cookiesAuthEnabled: true + discoverable: false + urlRewriteSupported: false + volumeMounts: + - name: openclaw-data + path: /opt/data + + - name: openclaw-data + volume: + size: 10Gi + +commands: + - id: setup + exec: + label: "Configure OpenClaw (onboarding wizard)" + component: openclaw + commandLine: openclaw onboard + workingDir: /opt/data/config + - id: status + exec: + label: "Check gateway health" + component: openclaw + commandLine: | + echo "--- Health ---" + curl -fsS http://127.0.0.1:18789/healthz && echo " OK" || echo " FAIL" + echo "--- Readiness ---" + curl -fsS http://127.0.0.1:18789/readyz && echo " OK" || echo " FAIL" + workingDir: /opt/data/config + - id: show-token + exec: + label: "Display gateway access token" + component: openclaw + commandLine: cat "${OPENCLAW_CONFIG_DIR}/.gateway-token" + workingDir: /opt/data/config + - id: doctor + exec: + label: "Run diagnostics" + component: openclaw + commandLine: | + echo "=== Environment ===" + echo "HOME=${HOME}" + echo "OPENCLAW_CONFIG_DIR=${OPENCLAW_CONFIG_DIR}" + echo "UID=$(id -u) GID=$(id -g) Groups=$(id -G)" + echo "" + echo "=== Directory Permissions ===" + ls -la /opt/data/ 2>/dev/null + ls -la "${OPENCLAW_CONFIG_DIR}/" 2>/dev/null + echo "" + echo "=== Gateway Health ===" + curl -fsS http://127.0.0.1:18789/healthz 2>&1 || echo "Gateway not responding" + echo "" + echo "=== Token ===" + [ -f "${OPENCLAW_CONFIG_DIR}/.gateway-token" ] && echo "Token file exists" || echo "Token file MISSING" + workingDir: /opt/data/config + - id: restart-gateway + exec: + label: "Restart gateway process" + component: openclaw + commandLine: kill -TERM 1 + workingDir: /opt/data/config diff --git a/stacks/openclaw/stack.yaml b/stacks/openclaw/stack.yaml new file mode 100644 index 000000000..961f21e7c --- /dev/null +++ b/stacks/openclaw/stack.yaml @@ -0,0 +1,7 @@ +name: openclaw +displayName: OpenClaw AI Assistant +description: Personal AI assistant with multi-channel messaging gateway. WhatsApp, Telegram, Slack, Discord, and 25+ channels via a single Control UI. +icon: https://raw.githubusercontent.com/openclaw/openclaw/main/ui/public/favicon.svg +versions: + - version: 1.0.0 + default: true From 634b920dcde5d8fa6bdf7fb36360e5347031b1a3 Mon Sep 17 00:00:00 2001 From: Oleksii Kurinnyi Date: Tue, 21 Jul 2026 12:36:56 +0300 Subject: [PATCH 2/5] chore: add CODEOWNERS entry for OpenClaw stack Signed-off-by: Oleksii Kurinnyi --- .github/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5479575a4..529e8af67 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -56,3 +56,6 @@ # Kaoto stacks /stacks/kaoto/ @maximilianoPizarro @devfile/che-team + +# OpenClaw stacks +/stacks/openclaw/ @akurinnoy From 65fd0f7767e504d848b525afeb1dd9c553942be5 Mon Sep 17 00:00:00 2001 From: Oleksii Kurinnyi Date: Tue, 21 Jul 2026 12:38:09 +0300 Subject: [PATCH 3/5] chore: skip OpenClaw stack in odo v3 test Signed-off-by: Oleksii Kurinnyi --- stacks/openclaw/1.0.0/devfile.yaml | 20 +++++--------------- tests/check_odov3.sh | 1 + 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/stacks/openclaw/1.0.0/devfile.yaml b/stacks/openclaw/1.0.0/devfile.yaml index 64af0f9e9..9f82168fc 100644 --- a/stacks/openclaw/1.0.0/devfile.yaml +++ b/stacks/openclaw/1.0.0/devfile.yaml @@ -82,6 +82,10 @@ components: fi export OPENCLAW_GATEWAY_TOKEN=$(cat "${TOKEN_FILE}") + openclaw config set gateway.mode local 2>/dev/null || true + openclaw config set gateway.controlUi.allowedOrigins '["*"]' 2>/dev/null || true + openclaw config set gateway.trustedProxies '["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"]' 2>/dev/null || true + exec tini -s -- node /app/openclaw.mjs gateway endpoints: - name: control-ui @@ -127,21 +131,7 @@ commands: exec: label: "Run diagnostics" component: openclaw - commandLine: | - echo "=== Environment ===" - echo "HOME=${HOME}" - echo "OPENCLAW_CONFIG_DIR=${OPENCLAW_CONFIG_DIR}" - echo "UID=$(id -u) GID=$(id -g) Groups=$(id -G)" - echo "" - echo "=== Directory Permissions ===" - ls -la /opt/data/ 2>/dev/null - ls -la "${OPENCLAW_CONFIG_DIR}/" 2>/dev/null - echo "" - echo "=== Gateway Health ===" - curl -fsS http://127.0.0.1:18789/healthz 2>&1 || echo "Gateway not responding" - echo "" - echo "=== Token ===" - [ -f "${OPENCLAW_CONFIG_DIR}/.gateway-token" ] && echo "Token file exists" || echo "Token file MISSING" + commandLine: openclaw doctor workingDir: /opt/data/config - id: restart-gateway exec: diff --git a/tests/check_odov3.sh b/tests/check_odov3.sh index afc64b375..748fea74b 100755 --- a/tests/check_odov3.sh +++ b/tests/check_odov3.sh @@ -73,6 +73,7 @@ ginkgo run --mod=readonly --procs 2 \ --skip="stack: java-websphereliberty" \ --skip="stack: java-quarkus" \ --skip="stack: ollama" \ + --skip="stack: openclaw" \ --slow-spec-threshold 120s \ --timeout 3h \ tests/odov3 -- -stacksPath "$stacksPath" -stackDirs "$stackDirs" ${args} From bc5ba2fa2be81e9f8e7112e7bf1cf9b285d552f7 Mon Sep 17 00:00:00 2001 From: Oleksii Kurinnyi Date: Wed, 22 Jul 2026 15:52:06 +0300 Subject: [PATCH 4/5] fix: increase token entropy and avoid killing PID 1 on restart Signed-off-by: Oleksii Kurinnyi --- stacks/openclaw/1.0.0/devfile.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stacks/openclaw/1.0.0/devfile.yaml b/stacks/openclaw/1.0.0/devfile.yaml index 9f82168fc..7ca335704 100644 --- a/stacks/openclaw/1.0.0/devfile.yaml +++ b/stacks/openclaw/1.0.0/devfile.yaml @@ -72,7 +72,7 @@ components: TOKEN_FILE="${OPENCLAW_CONFIG_DIR}/.gateway-token" if [ ! -f "${TOKEN_FILE}" ]; then - TOKEN=$(head -c 32 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 48) + TOKEN=$(head -c 48 /dev/urandom | base64 | tr -dc 'a-zA-Z0-9' | head -c 48) echo "${TOKEN}" > "${TOKEN_FILE}" chmod 600 "${TOKEN_FILE}" echo "============================================" @@ -137,5 +137,5 @@ commands: exec: label: "Restart gateway process" component: openclaw - commandLine: kill -TERM 1 + commandLine: openclaw gateway stop 2>/dev/null; openclaw gateway workingDir: /opt/data/config From cd77f7faa42007d4c589af0f15d50ccee3c21335 Mon Sep 17 00:00:00 2001 From: Oleksii Kurinnyi Date: Mon, 27 Jul 2026 16:40:29 +0300 Subject: [PATCH 5/5] Update stacks/openclaw/1.0.0/devfile.yaml Co-authored-by: Ilya Buziuk Signed-off-by: Oleksii Kurinnyi --- stacks/openclaw/1.0.0/devfile.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stacks/openclaw/1.0.0/devfile.yaml b/stacks/openclaw/1.0.0/devfile.yaml index 7ca335704..418056a87 100644 --- a/stacks/openclaw/1.0.0/devfile.yaml +++ b/stacks/openclaw/1.0.0/devfile.yaml @@ -14,7 +14,7 @@ # First boot: run `openclaw setup` in the terminal to configure # your API key and model provider. -schemaVersion: 2.2.2 +schemaVersion: 2.3.0 metadata: name: openclaw displayName: OpenClaw AI Assistant