feat:添加openclaw到列表

This commit is contained in:
okxlin 2026-03-06 11:35:31 +08:00
parent 59b8ed174a
commit c6898804c6
22 changed files with 789 additions and 0 deletions

View File

@ -0,0 +1,9 @@
CONTAINER_NAME="openclaw"
OPENCLAW_BRIDGE_PORT=18790
OPENCLAW_CONFIG_DIR="./data/conf"
OPENCLAW_GATEWAY_BIND="lan"
OPENCLAW_GATEWAY_TOKEN="xxxxxxxxxxxxxxxxx"
OPENCLAW_MODE="local"
OPENCLAW_WORKSPACE_DIR="./data/workspace"
PANEL_APP_PORT_HTTP=18789
DOCKER_SOCK_PATH="/var/run/docker.sock"

View File

@ -0,0 +1,143 @@
additionalProperties:
formFields:
- default: 18789
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web UI Port
labelZh: Web UI 端口
required: true
rule: paramPort
type: number
label:
en: Web UI Port
ja: Web UIポート
ms: Port Web UI
pt-br: Porta da Web UI
ru: Порт веб-интерфейса
ko: 웹 UI 포트
zh-Hant: Web UI 埠
zh: Web UI 端口
- default: 18790
edit: true
envKey: OPENCLAW_BRIDGE_PORT
labelEn: Bridge Port
labelZh: Bridge 端口
required: true
rule: paramPort
type: number
label:
en: Bridge Port
ja: ブリッジポート
ms: Port Bridge
pt-br: Porta Bridge
ru: Порт моста
ko: 브리지 포트
zh-Hant: Bridge 埠
zh: Bridge 端口
- default: "./data/conf"
disabled: true
envKey: OPENCLAW_CONFIG_DIR
labelEn: OpenClaw Config Path
labelZh: OpenClaw 配置文件路径
required: true
type: text
label:
en: OpenClaw Config Path
ja: OpenClaw コンフィグパス
ms: Path OpenClaw Config
pt-br: Caminho do Config OpenClaw
ru: Путь конфигурации OpenClaw
ko: OpenClaw Config Path
zh-Hant: OpenClaw 配置文件路径
zh: OpenClaw 配置文件路径
- default: "./data/workspace"
disabled: true
envKey: OPENCLAW_WORKSPACE_DIR
labelEn: OpenClaw Workspace Path
labelZh: OpenClaw 工作区路径
required: true
type: text
label:
en: OpenClaw Workspace Path
ja: OpenClaw ワークスペースパス
ms: Path OpenClaw Workspace
pt-br: Caminho do Workspace OpenClaw
ru: Путь к рабочей области OpenClaw
ko: OpenClaw 워크스페이스 경로
zh-Hant: OpenClaw 工作區路徑
zh: OpenClaw 工作区路径
- default: "lan"
edit: true
envKey: OPENCLAW_GATEWAY_BIND
labelEn: OpenClaw Gateway Bind
labelZh: OpenClaw 网关绑定
required: true
type: select
values:
- label: "loopback"
value: "loopback"
- label: "lan"
value: "lan"
- label: "tailnet"
value: "tailnet"
- label: "custom"
value: "custom"
- label: "auto"
value: "auto"
label:
en: OpenClaw Gateway Bind
ja: OpenClaw ゲートウェイバインド
ms: OpenClaw Gateway Bind
pt-br: OpenClaw Gateway Bind
ru: OpenClaw Gateway Bind
ko: OpenClaw Gateway Bind
zh-Hant: OpenClaw 网关绑定
zh: OpenClaw 网关绑定
- default: "local"
disabled: true
envKey: OPENCLAW_MODE
labelEn: OpenClaw Mode
labelZh: OpenClaw 模式
required: true
type: text
label:
en: OpenClaw Mode
ja: OpenClaw モード
ms: OpenClaw Mode
pt-br: OpenClaw Mode
ru: OpenClaw Mode
ko: OpenClaw Mode
zh-Hant: OpenClaw 模式
zh: OpenClaw 模式
- default: ""
edit: true
envKey: OPENCLAW_GATEWAY_TOKEN
labelEn: Gateway Token (The more complex the better, can be generated using `openssl rand -hex 32`)
labelZh: 网关令牌 (建议越复杂越好,可使用 `openssl rand -hex 32` 生成)
required: true
type: text
label:
en: "Gateway Token (The more complex the better, can be generated using `openssl rand -hex 32`)"
ja: "ゲートウェイトークン (複雑なほど良い、`openssl rand -hex 32` を使用して生成できます)"
ms: "Token Gateway (Semakin kompleks semakin baik, boleh dijana menggunakan `openssl rand -hex 32`)"
pt-br: "Token de Gateway (Quanto mais complexo melhor, pode ser gerado usando `openssl rand -hex 32`)"
ru: "Токен шлюза (чем сложнее, тем лучше, можно сгенерировать с помощью `openssl rand -hex 32`)"
ko: "게이트웨이 토큰 (복잡할수록 좋으며, `openssl rand -hex 32`를 사용하여 생성할 수 있습니다)"
zh-Hant: "網關權杖 (建議越複雜越好,可使用 `openssl rand -hex 32` 生成)"
zh: "网关令牌 (建议越复杂越好,可使用 `openssl rand -hex 32` 生成)"
- default: "/var/run/docker.sock"
edit: true
envKey: DOCKER_SOCK_PATH
labelEn: Docker Socket Path
labelZh: Docker 套接字路径
required: true
type: text
label:
en: Docker Socket Path
ja: Docker ソケットパス
ms: Laluan Soket Docker
pt-br: Caminho do Socket Docker
ru: Путь к сокету Docker
ko: Docker 소켓 경로
zh-Hant: Docker 套接字路徑
zh: Docker 套接字路径

View File

@ -0,0 +1,35 @@
services:
openclaw:
container_name: ${CONTAINER_NAME}
image: "ghcr.io/okxlin/openclaw-sandbox:v2026.3.2-sandbox"
restart: unless-stopped
networks:
- 1panel-network
environment:
HOME: /home/node
TERM: xterm-256color
OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
OPENCLAW_GATEWAY_PORT: ${PANEL_APP_PORT_HTTP}
OPENCLAW_MODE: ${OPENCLAW_MODE}
volumes:
- ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw
- ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace
- ${DOCKER_SOCK_PATH:-/var/run/docker.sock}:/var/run/docker.sock
group_add:
- "${DOCKER_GID:-999}"
ports:
- ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}
- ${OPENCLAW_BRIDGE_PORT}:18790
init: true
command: [ "node", "dist/index.js", "gateway", "--bind", "${OPENCLAW_GATEWAY_BIND}", "--port", "${PANEL_APP_PORT_HTTP}" ]
healthcheck:
test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:${PANEL_APP_PORT_HTTP}/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true

View File

@ -0,0 +1,71 @@
#!/bin/bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
COMPOSE_FILE="$ROOT_DIR/docker-compose.yml"
COMPOSE_CMD=(docker compose -f "$COMPOSE_FILE" --project-directory "$ROOT_DIR")
# 读取环境变量并提供默认值(与 docker-compose/.env 保持一致)
CONFIG_DIR_RAW="${OPENCLAW_CONFIG_DIR:-./data/conf}"
WORKSPACE_DIR_RAW="${OPENCLAW_WORKSPACE_DIR:-./data/workspace}"
BIND="${OPENCLAW_GATEWAY_BIND:-lan}"
PORT="${PANEL_APP_PORT_HTTP:-${OPENCLAW_GATEWAY_PORT:-18789}}"
# 尝试自动获取宿主机 docker 套接字的 GID 并更新至 .env 中
if [ -f "$ROOT_DIR/.env" ]; then
# 优先从 .env 读取用户配置的套接字路径,默认为 /var/run/docker.sock
SOCK_PATH=$(grep "^DOCKER_SOCK_PATH=" "$ROOT_DIR/.env" 2>/dev/null | cut -d '=' -f2 | tr -d '"' | tr -d "'")
SOCK_PATH=${SOCK_PATH:-/var/run/docker.sock}
if [ -e "$SOCK_PATH" ]; then
AUTO_GID=$(stat -c '%g' "$SOCK_PATH" 2>/dev/null || echo "999")
if grep -q "^DOCKER_GID=" "$ROOT_DIR/.env" 2>/dev/null; then
sed -i "s|^DOCKER_GID=.*|DOCKER_GID=${AUTO_GID}|" "$ROOT_DIR/.env"
else
echo "DOCKER_GID=${AUTO_GID}" >> "$ROOT_DIR/.env"
fi
echo "==> 自动检测到 Docker GID: ${AUTO_GID}"
fi
fi
# 支持相对路径与绝对路径
if [[ "$CONFIG_DIR_RAW" = /* ]]; then
CONFIG_DIR="$CONFIG_DIR_RAW"
else
CONFIG_DIR="$ROOT_DIR/${CONFIG_DIR_RAW#./}"
fi
if [[ "$WORKSPACE_DIR_RAW" = /* ]]; then
WORKSPACE_DIR="$WORKSPACE_DIR_RAW"
else
WORKSPACE_DIR="$ROOT_DIR/${WORKSPACE_DIR_RAW#./}"
fi
echo "==> 准备数据目录"
mkdir -p "$CONFIG_DIR" "$WORKSPACE_DIR"
# 面板部署常用:确保挂载目录归属为容器内 node 用户uid/gid 1000
chown -R 1000:1000 "$ROOT_DIR/data" 2>/dev/null || true
echo "==> 执行 onboard 初始化"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js onboard --mode local --no-install-daemon
echo "==> 初始化 gateway.mode / gateway.bind"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set gateway.mode local
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set gateway.bind "$BIND"
# 如果是从 Sandbox 目录部署 (含 docker.sock 挂载),自动应用 Sandbox 最佳安全配置
if grep -q "DOCKER_SOCK_PATH" "$COMPOSE_FILE"; then
echo "==> 检测到 Sandbox 模式,初始化 Sandbox 极简安全配置"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set agents.defaults.sandbox.mode "non-main"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set agents.defaults.sandbox.scope "agent"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set agents.defaults.sandbox.workspaceAccess "none"
fi
echo "==> 初始化完成"

View File

@ -0,0 +1,8 @@
CONTAINER_NAME="openclaw"
OPENCLAW_BRIDGE_PORT=18790
OPENCLAW_CONFIG_DIR="./data/conf"
OPENCLAW_GATEWAY_BIND="lan"
OPENCLAW_GATEWAY_TOKEN="xxxxxxxxxxxxxxxxx"
OPENCLAW_MODE="local"
OPENCLAW_WORKSPACE_DIR="./data/workspace"
PANEL_APP_PORT_HTTP=18789

View File

@ -0,0 +1,127 @@
additionalProperties:
formFields:
- default: 18789
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web UI Port
labelZh: Web UI 端口
required: true
rule: paramPort
type: number
label:
en: Web UI Port
ja: Web UIポート
ms: Port Web UI
pt-br: Porta da Web UI
ru: Порт веб-интерфейса
ko: 웹 UI 포트
zh-Hant: Web UI 埠
zh: Web UI 端口
- default: 18790
edit: true
envKey: OPENCLAW_BRIDGE_PORT
labelEn: Bridge Port
labelZh: Bridge 端口
required: true
rule: paramPort
type: number
label:
en: Bridge Port
ja: ブリッジポート
ms: Port Bridge
pt-br: Porta Bridge
ru: Порт моста
ko: 브리지 포트
zh-Hant: Bridge 埠
zh: Bridge 端口
- default: "./data/conf"
disabled: true
envKey: OPENCLAW_CONFIG_DIR
labelEn: OpenClaw Config Path
labelZh: OpenClaw 配置文件路径
required: true
type: text
label:
en: OpenClaw Config Path
ja: OpenClaw コンフィグパス
ms: Path OpenClaw Config
pt-br: Caminho do Config OpenClaw
ru: Путь конфигурации OpenClaw
ko: OpenClaw Config Path
zh-Hant: OpenClaw 配置文件路径
zh: OpenClaw 配置文件路径
- default: "./data/workspace"
disabled: true
envKey: OPENCLAW_WORKSPACE_DIR
labelEn: OpenClaw Workspace Path
labelZh: OpenClaw 工作区路径
required: true
type: text
label:
en: OpenClaw Workspace Path
ja: OpenClaw ワークスペースパス
ms: Path OpenClaw Workspace
pt-br: Caminho do Workspace OpenClaw
ru: Путь к рабочей области OpenClaw
ko: OpenClaw 워크스페이스 경로
zh-Hant: OpenClaw 工作區路徑
zh: OpenClaw 工作区路径
- default: "lan"
edit: true
envKey: OPENCLAW_GATEWAY_BIND
labelEn: OpenClaw Gateway Bind
labelZh: OpenClaw 网关绑定
required: true
type: select
values:
- label: "loopback"
value: "loopback"
- label: "lan"
value: "lan"
- label: "tailnet"
value: "tailnet"
- label: "custom"
value: "custom"
- label: "auto"
value: "auto"
label:
en: OpenClaw Gateway Bind
ja: OpenClaw ゲートウェイバインド
ms: OpenClaw Gateway Bind
pt-br: OpenClaw Gateway Bind
ru: OpenClaw Gateway Bind
ko: OpenClaw Gateway Bind
zh-Hant: OpenClaw 网关绑定
zh: OpenClaw 网关绑定
- default: "local"
disabled: true
envKey: OPENCLAW_MODE
labelEn: OpenClaw Mode
labelZh: OpenClaw 模式
required: true
type: text
label:
en: OpenClaw Mode
ja: OpenClaw モード
ms: OpenClaw Mode
pt-br: OpenClaw Mode
ru: OpenClaw Mode
ko: OpenClaw Mode
zh-Hant: OpenClaw 模式
zh: OpenClaw 模式
- default: ""
edit: true
envKey: OPENCLAW_GATEWAY_TOKEN
labelEn: Gateway Token (The more complex the better, can be generated using `openssl rand -hex 32`)
labelZh: 网关令牌 (建议越复杂越好,可使用 `openssl rand -hex 32` 生成)
required: true
type: text
label:
en: "Gateway Token (The more complex the better, can be generated using `openssl rand -hex 32`)"
ja: "ゲートウェイトークン (複雑なほど良い、`openssl rand -hex 32` を使用して生成できます)"
ms: "Token Gateway (Semakin kompleks semakin baik, boleh dijana menggunakan `openssl rand -hex 32`)"
pt-br: "Token de Gateway (Quanto mais complexo melhor, pode ser gerado usando `openssl rand -hex 32`)"
ru: "Токен шлюза (чем сложнее, тем лучше, можно сгенерировать с помощью `openssl rand -hex 32`)"
ko: "게이트웨이 토큰 (복잡할수록 좋으며, `openssl rand -hex 32`를 사용하여 생성할 수 있습니다)"
zh-Hant: "網關權杖 (建議越複雜越好,可使用 `openssl rand -hex 32` 生成)"
zh: "网关令牌 (建议越复杂越好,可使用 `openssl rand -hex 32` 生成)"

View File

@ -0,0 +1,32 @@
services:
openclaw:
container_name: ${CONTAINER_NAME}
image: "ghcr.io/openclaw/openclaw:2026.3.2"
restart: unless-stopped
networks:
- 1panel-network
environment:
HOME: /home/node
TERM: xterm-256color
OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
OPENCLAW_GATEWAY_PORT: ${PANEL_APP_PORT_HTTP}
OPENCLAW_MODE: ${OPENCLAW_MODE}
volumes:
- ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw
- ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace
ports:
- ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}
- ${OPENCLAW_BRIDGE_PORT}:18790
init: true
command: [ "node", "dist/index.js", "gateway", "--bind", "${OPENCLAW_GATEWAY_BIND}", "--port", "${PANEL_APP_PORT_HTTP}" ]
healthcheck:
test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:${PANEL_APP_PORT_HTTP}/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true

View File

@ -0,0 +1,43 @@
#!/bin/bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
COMPOSE_FILE="$ROOT_DIR/docker-compose.yml"
COMPOSE_CMD=(docker compose -f "$COMPOSE_FILE" --project-directory "$ROOT_DIR")
# 读取环境变量并提供默认值(与 docker-compose/.env 保持一致)
CONFIG_DIR_RAW="${OPENCLAW_CONFIG_DIR:-./data/conf}"
WORKSPACE_DIR_RAW="${OPENCLAW_WORKSPACE_DIR:-./data/workspace}"
BIND="${OPENCLAW_GATEWAY_BIND:-lan}"
PORT="${PANEL_APP_PORT_HTTP:-${OPENCLAW_GATEWAY_PORT:-18789}}"
# 支持相对路径与绝对路径
if [[ "$CONFIG_DIR_RAW" = /* ]]; then
CONFIG_DIR="$CONFIG_DIR_RAW"
else
CONFIG_DIR="$ROOT_DIR/${CONFIG_DIR_RAW#./}"
fi
if [[ "$WORKSPACE_DIR_RAW" = /* ]]; then
WORKSPACE_DIR="$WORKSPACE_DIR_RAW"
else
WORKSPACE_DIR="$ROOT_DIR/${WORKSPACE_DIR_RAW#./}"
fi
echo "==> 准备数据目录"
mkdir -p "$CONFIG_DIR" "$WORKSPACE_DIR"
# 面板部署常用:确保挂载目录归属为容器内 node 用户uid/gid 1000
chown -R 1000:1000 "$ROOT_DIR/data" 2>/dev/null || true
echo "==> 执行 onboard 初始化"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js onboard --mode local --no-install-daemon
echo "==> 初始化 gateway.mode / gateway.bind"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set gateway.mode local
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set gateway.bind "$BIND"
echo "==> 初始化完成"

39
apps/openclaw/README.md Normal file
View File

@ -0,0 +1,39 @@
## 产品介绍
**OpenClaw** 是一个运行在你自己设备上的 **个人 AI 助理**。它可以在你已经使用的各种沟通渠道中与你对话包括飞书、钉钉、企业微信、QQ、WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、Microsoft Teams、WebChat等。
如果你想要一个可以在本地 7x24 运行的个人 AI 助理,那就是它了。
## 核心特性
- **Local-first Gateway** — 本地优先的网关架构,统一管理会话、渠道、工具和事件的单一控制平面。
- **多渠道收件箱** — 原生支持 WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、BlueBubbles、Microsoft Teams、Matrix、Zalo、Zalo Personal、WebChat以及 macOS、iOS / Android。
- **多 Agent 路由** — 可将不同的接入渠道 / 账号 / 对象路由到相互隔离的 Agent实现工作区级别和 Agent 级别的会话隔离。
- **语音唤醒与对话模式** — 在 macOS / iOS / Android 上提供始终在线的语音交互能力,集成 ElevenLabs。
- **实时 Canvas** — 基于 A2UI 的可视化工作区,由 Agent 驱动,支持实时渲染和交互。
- **一等公民级工具系统** — 内置浏览器、Canvas、节点Nodes、定时任务Cron、会话管理以及 Discord / Slack 行为操作。
- **配套客户端应用** — 提供 macOS 菜单栏应用,以及 iOS / Android 节点应用。
- 引导式上手与技能系统 — 通过向导完成初始化,内置并支持托管 / 工作区级技能Skills管理。
## 部署后指南
部署完成后,为了确保 OpenClaw 的正常运行和外部访问,请按照以下步骤进行配置:
1. **更新配置文件**
找到并编辑应用挂载的数据目录下的 `./data/conf/openclaw.json`。将 `"allowedOrigins"` 部分更新为您实际使用的反向代理 URL 地址,以允许相应的跨域请求。
2. **访问注册设备**
在浏览器地址栏的 URL 后面追加您的 token格式如`http://your_address:port?token=xxx`,使用此带有 token 的链接访问以注册您的设备。
3. **审批设备请求**
设备注册后,需要连接到容器的终端环境,执行以下命令检查并批准配对请求:
查看待处理的配对请求:
```bash
openclaw devices list
```
如果您看到待处理的请求,请使用获取到的 `<request id>` 来批准它:
```bash
openclaw devices approve <request id>
```

View File

@ -0,0 +1,40 @@
## Introduction
**OpenClaw** is a **personal AI assistant** you run on your own devices.
It answers you on the channels you already use (WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, Microsoft Teams, WebChat), plus extension channels like BlueBubbles, Matrix, Zalo, and Zalo Personal. It can speak and listen on macOS/iOS/Android, and can render a live Canvas you control. The Gateway is just the control plane — the product is the assistant.
If you want a personal, single-user assistant that feels local, fast, and always-on, this is it.
## Highlights
- **Local-first Gateway** — single control plane for sessions, channels, tools, and events.
- **Multi-channel inbox** — WhatsApp, Telegram, Slack, Discord, Google Chat, Signal, iMessage, BlueBubbles, Microsoft Teams, Matrix, Zalo, Zalo Personal, WebChat, macOS, iOS/Android.
- **Multi-agent routing** — route inbound channels/accounts/peers to isolated agents (workspaces + per-agent sessions).
- **Voice Wake + Talk Mode** — always-on speech for macOS/iOS/Android with ElevenLabs.
- **Live Canvas** — agent-driven visual workspace with A2UI.
- **First-class tools** — browser, canvas, nodes, cron, sessions, and Discord/Slack actions.
- **Companion apps** — macOS menu bar app + iOS/Android nodes.
- **Onboarding + skills** — wizard-driven setup with bundled/managed/workspace skills.
## Post-Deployment Guide
After deployment, to ensure OpenClaw operates correctly and can be accessed externally, please follow these configuration steps:
1. **Update Configuration File**:
Locate and edit `./data/conf/openclaw.json` within your application's mounted data directory. Update the `"allowedOrigins"` section with the URL address of your actual reverse proxy to allow corresponding CORS requests.
2. **Access and Register Device**:
Append your token to the URL in your browser's address bar, for example: `http://your_address:port?token=xxx`. Use this link with the token to access and register your device.
3. **Approve Device Requests**:
After registering the device, you need to connect to the container's terminal environment and execute the following commands to check and approve pairing requests:
Run below commands and check do you have any pending pairing request:
```bash
openclaw devices list
```
If you have any pending request approve by below command:
```bash
openclaw devices approve <request id>
```

32
apps/openclaw/data.yml Normal file
View File

@ -0,0 +1,32 @@
name: OpenClaw
tags:
- AI
title: 开源、自托管的个人 AI 助手
description: 开源、自托管的个人 AI 助手
additionalProperties:
key: openclaw
name: OpenClaw
tags:
- AI
shortDescZh: 开源、自托管的个人 AI 助手
shortDescEn: Your own personal AI assistant
description:
en: Your own personal AI assistant
ja: あなた専用のパーソナルAIアシスタント
ms: Pembantu AI peribadi anda sendiri
pt-br: Seu assistente pessoal de IA
ru: Ваш личный помощник на базе ИИ
ko: 나만의 개인 AI 비서
zh-Hant: 開源、自托管的個人 AI 助手
zh: 开源、自托管的个人 AI 助手
type: website
crossVersionUpdate: true
limit: 0
recommend: 14
batchInstallSupport: true
website: https://openclaw.ai/
github: https://github.com/openclaw/openclaw
document: https://docs.openclaw.ai/
architectures:
- amd64
- arm64

View File

@ -0,0 +1,8 @@
CONTAINER_NAME="openclaw"
OPENCLAW_BRIDGE_PORT=18790
OPENCLAW_CONFIG_DIR="./data/conf"
OPENCLAW_GATEWAY_BIND="lan"
OPENCLAW_GATEWAY_TOKEN="xxxxxxxxxxxxxxxxx"
OPENCLAW_MODE="local"
OPENCLAW_WORKSPACE_DIR="./data/workspace"
PANEL_APP_PORT_HTTP=18789

View File

@ -0,0 +1,127 @@
additionalProperties:
formFields:
- default: 18789
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Web UI Port
labelZh: Web UI 端口
required: true
rule: paramPort
type: number
label:
en: Web UI Port
ja: Web UIポート
ms: Port Web UI
pt-br: Porta da Web UI
ru: Порт веб-интерфейса
ko: 웹 UI 포트
zh-Hant: Web UI 埠
zh: Web UI 端口
- default: 18790
edit: true
envKey: OPENCLAW_BRIDGE_PORT
labelEn: Bridge Port
labelZh: Bridge 端口
required: true
rule: paramPort
type: number
label:
en: Bridge Port
ja: ブリッジポート
ms: Port Bridge
pt-br: Porta Bridge
ru: Порт моста
ko: 브리지 포트
zh-Hant: Bridge 埠
zh: Bridge 端口
- default: "./data/conf"
disabled: true
envKey: OPENCLAW_CONFIG_DIR
labelEn: OpenClaw Config Path
labelZh: OpenClaw 配置文件路径
required: true
type: text
label:
en: OpenClaw Config Path
ja: OpenClaw コンフィグパス
ms: Path OpenClaw Config
pt-br: Caminho do Config OpenClaw
ru: Путь конфигурации OpenClaw
ko: OpenClaw Config Path
zh-Hant: OpenClaw 配置文件路径
zh: OpenClaw 配置文件路径
- default: "./data/workspace"
disabled: true
envKey: OPENCLAW_WORKSPACE_DIR
labelEn: OpenClaw Workspace Path
labelZh: OpenClaw 工作区路径
required: true
type: text
label:
en: OpenClaw Workspace Path
ja: OpenClaw ワークスペースパス
ms: Path OpenClaw Workspace
pt-br: Caminho do Workspace OpenClaw
ru: Путь к рабочей области OpenClaw
ko: OpenClaw 워크스페이스 경로
zh-Hant: OpenClaw 工作區路徑
zh: OpenClaw 工作区路径
- default: "lan"
edit: true
envKey: OPENCLAW_GATEWAY_BIND
labelEn: OpenClaw Gateway Bind
labelZh: OpenClaw 网关绑定
required: true
type: select
values:
- label: "loopback"
value: "loopback"
- label: "lan"
value: "lan"
- label: "tailnet"
value: "tailnet"
- label: "custom"
value: "custom"
- label: "auto"
value: "auto"
label:
en: OpenClaw Gateway Bind
ja: OpenClaw ゲートウェイバインド
ms: OpenClaw Gateway Bind
pt-br: OpenClaw Gateway Bind
ru: OpenClaw Gateway Bind
ko: OpenClaw Gateway Bind
zh-Hant: OpenClaw 网关绑定
zh: OpenClaw 网关绑定
- default: "local"
disabled: true
envKey: OPENCLAW_MODE
labelEn: OpenClaw Mode
labelZh: OpenClaw 模式
required: true
type: text
label:
en: OpenClaw Mode
ja: OpenClaw モード
ms: OpenClaw Mode
pt-br: OpenClaw Mode
ru: OpenClaw Mode
ko: OpenClaw Mode
zh-Hant: OpenClaw 模式
zh: OpenClaw 模式
- default: ""
edit: true
envKey: OPENCLAW_GATEWAY_TOKEN
labelEn: Gateway Token (The more complex the better, can be generated using `openssl rand -hex 32`)
labelZh: 网关令牌 (建议越复杂越好,可使用 `openssl rand -hex 32` 生成)
required: true
type: text
label:
en: "Gateway Token (The more complex the better, can be generated using `openssl rand -hex 32`)"
ja: "ゲートウェイトークン (複雑なほど良い、`openssl rand -hex 32` を使用して生成できます)"
ms: "Token Gateway (Semakin kompleks semakin baik, boleh dijana menggunakan `openssl rand -hex 32`)"
pt-br: "Token de Gateway (Quanto mais complexo melhor, pode ser gerado usando `openssl rand -hex 32`)"
ru: "Токен шлюза (чем сложнее, тем лучше, можно сгенерировать с помощью `openssl rand -hex 32`)"
ko: "게이트웨이 토큰 (복잡할수록 좋으며, `openssl rand -hex 32`를 사용하여 생성할 수 있습니다)"
zh-Hant: "網關權杖 (建議越複雜越好,可使用 `openssl rand -hex 32` 生成)"
zh: "网关令牌 (建议越复杂越好,可使用 `openssl rand -hex 32` 生成)"

View File

View File

@ -0,0 +1,32 @@
services:
openclaw:
container_name: ${CONTAINER_NAME}
image: "ghcr.io/openclaw/openclaw:latest"
restart: unless-stopped
networks:
- 1panel-network
environment:
HOME: /home/node
TERM: xterm-256color
OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
OPENCLAW_GATEWAY_PORT: ${PANEL_APP_PORT_HTTP}
OPENCLAW_MODE: ${OPENCLAW_MODE}
volumes:
- ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw
- ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace
ports:
- ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}
- ${OPENCLAW_BRIDGE_PORT}:18790
init: true
command: [ "node", "dist/index.js", "gateway", "--bind", "${OPENCLAW_GATEWAY_BIND}", "--port", "${PANEL_APP_PORT_HTTP}" ]
healthcheck:
test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:${PANEL_APP_PORT_HTTP}/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" ]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true

View File

@ -0,0 +1,43 @@
#!/bin/bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
COMPOSE_FILE="$ROOT_DIR/docker-compose.yml"
COMPOSE_CMD=(docker compose -f "$COMPOSE_FILE" --project-directory "$ROOT_DIR")
# 读取环境变量并提供默认值(与 docker-compose/.env 保持一致)
CONFIG_DIR_RAW="${OPENCLAW_CONFIG_DIR:-./data/conf}"
WORKSPACE_DIR_RAW="${OPENCLAW_WORKSPACE_DIR:-./data/workspace}"
BIND="${OPENCLAW_GATEWAY_BIND:-lan}"
PORT="${PANEL_APP_PORT_HTTP:-${OPENCLAW_GATEWAY_PORT:-18789}}"
# 支持相对路径与绝对路径
if [[ "$CONFIG_DIR_RAW" = /* ]]; then
CONFIG_DIR="$CONFIG_DIR_RAW"
else
CONFIG_DIR="$ROOT_DIR/${CONFIG_DIR_RAW#./}"
fi
if [[ "$WORKSPACE_DIR_RAW" = /* ]]; then
WORKSPACE_DIR="$WORKSPACE_DIR_RAW"
else
WORKSPACE_DIR="$ROOT_DIR/${WORKSPACE_DIR_RAW#./}"
fi
echo "==> 准备数据目录"
mkdir -p "$CONFIG_DIR" "$WORKSPACE_DIR"
# 面板部署常用:确保挂载目录归属为容器内 node 用户uid/gid 1000
chown -R 1000:1000 "$ROOT_DIR/data" 2>/dev/null || true
echo "==> 执行 onboard 初始化"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js onboard --mode local --no-install-daemon
echo "==> 初始化 gateway.mode / gateway.bind"
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set gateway.mode local
"${COMPOSE_CMD[@]}" run --rm openclaw \
node dist/index.js config set gateway.bind "$BIND"
echo "==> 初始化完成"

BIN
apps/openclaw/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB