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 diff --git a/stacks/openclaw/1.0.0/devfile.yaml b/stacks/openclaw/1.0.0/devfile.yaml new file mode 100644 index 000000000..418056a87 --- /dev/null +++ b/stacks/openclaw/1.0.0/devfile.yaml @@ -0,0 +1,141 @@ +# 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.3.0 +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 48 /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}") + + 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 + 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: openclaw doctor + workingDir: /opt/data/config + - id: restart-gateway + exec: + label: "Restart gateway process" + component: openclaw + commandLine: openclaw gateway stop 2>/dev/null; openclaw gateway + 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 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}