mirror of
https://github.com/okxlin/appstore.git
synced 2026-03-10 18:57:49 +08:00
feat:添加openclaw到列表
This commit is contained in:
parent
59b8ed174a
commit
c6898804c6
9
apps/openclaw/2026.3.2-sandbox/.env.sample
Normal file
9
apps/openclaw/2026.3.2-sandbox/.env.sample
Normal 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"
|
||||
143
apps/openclaw/2026.3.2-sandbox/data.yml
Normal file
143
apps/openclaw/2026.3.2-sandbox/data.yml
Normal 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 套接字路径
|
||||
0
apps/openclaw/2026.3.2-sandbox/data/conf/.gitkeep
Normal file
0
apps/openclaw/2026.3.2-sandbox/data/conf/.gitkeep
Normal file
35
apps/openclaw/2026.3.2-sandbox/docker-compose.yml
Normal file
35
apps/openclaw/2026.3.2-sandbox/docker-compose.yml
Normal 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
|
||||
71
apps/openclaw/2026.3.2-sandbox/scripts/init.sh
Normal file
71
apps/openclaw/2026.3.2-sandbox/scripts/init.sh
Normal 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 "==> 初始化完成"
|
||||
8
apps/openclaw/2026.3.2/.env.sample
Normal file
8
apps/openclaw/2026.3.2/.env.sample
Normal 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
|
||||
127
apps/openclaw/2026.3.2/data.yml
Normal file
127
apps/openclaw/2026.3.2/data.yml
Normal 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` 生成)"
|
||||
0
apps/openclaw/2026.3.2/data/conf/.gitkeep
Normal file
0
apps/openclaw/2026.3.2/data/conf/.gitkeep
Normal file
0
apps/openclaw/2026.3.2/data/workspace/.gitkeep
Normal file
0
apps/openclaw/2026.3.2/data/workspace/.gitkeep
Normal file
32
apps/openclaw/2026.3.2/docker-compose.yml
Normal file
32
apps/openclaw/2026.3.2/docker-compose.yml
Normal 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
|
||||
43
apps/openclaw/2026.3.2/scripts/init.sh
Normal file
43
apps/openclaw/2026.3.2/scripts/init.sh
Normal 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
39
apps/openclaw/README.md
Normal 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>
|
||||
```
|
||||
40
apps/openclaw/README_en.md
Normal file
40
apps/openclaw/README_en.md
Normal 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
32
apps/openclaw/data.yml
Normal 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
|
||||
8
apps/openclaw/latest/.env.sample
Normal file
8
apps/openclaw/latest/.env.sample
Normal 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
|
||||
127
apps/openclaw/latest/data.yml
Normal file
127
apps/openclaw/latest/data.yml
Normal 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` 生成)"
|
||||
0
apps/openclaw/latest/data/conf/.gitkeep
Normal file
0
apps/openclaw/latest/data/conf/.gitkeep
Normal file
0
apps/openclaw/latest/data/workspace/.gitkeep
Normal file
0
apps/openclaw/latest/data/workspace/.gitkeep
Normal file
32
apps/openclaw/latest/docker-compose.yml
Normal file
32
apps/openclaw/latest/docker-compose.yml
Normal 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
|
||||
43
apps/openclaw/latest/scripts/init.sh
Normal file
43
apps/openclaw/latest/scripts/init.sh
Normal 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
BIN
apps/openclaw/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Loading…
Reference in New Issue
Block a user