Update start-openclaw.sh
Browse files- start-openclaw.sh +10 -29
start-openclaw.sh
CHANGED
|
@@ -1,9 +1,8 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
-
set -euo pipefail
|
| 3 |
-
echo "===== OpenClaw 启动脚本 v2.
|
| 4 |
echo "启动时间: $(date)"
|
| 5 |
|
| 6 |
-
# --- 初始化与准备工作 ---
|
| 7 |
echo ""
|
| 8 |
echo "=== 1. 初始化环境与目录 ==="
|
| 9 |
mkdir -p /root/.openclaw/agents/main/sessions
|
|
@@ -12,7 +11,6 @@ mkdir -p /root/.openclaw/sessions
|
|
| 12 |
mkdir -p /root/.openclaw/skills
|
| 13 |
echo "目录结构创建完成。"
|
| 14 |
|
| 15 |
-
# --- 数据恢复 ---
|
| 16 |
echo ""
|
| 17 |
echo "=== 2. 从备份恢复数据 ==="
|
| 18 |
if python3 /app/sync.py restore; then
|
|
@@ -21,23 +19,19 @@ else
|
|
| 21 |
echo "⚠️ 数据恢复过程可能存在问题,将继续启动流程。" >&2
|
| 22 |
fi
|
| 23 |
|
| 24 |
-
# --- 技能安装与检查 (核心修复点) ---
|
| 25 |
echo ""
|
| 26 |
echo "=== 3. 检查与安装技能 ==="
|
| 27 |
-
# 修复:技能列表应为由空格分隔的数组元素
|
| 28 |
SKILLS=("openclaw-tavily-search" "@tencent-weixin/openclaw-weixin")
|
| 29 |
INSTALLED_SKILLS=()
|
| 30 |
|
| 31 |
for skill in "${SKILLS[@]}"; do
|
| 32 |
echo ""
|
| 33 |
echo "检查技能: $skill"
|
| 34 |
-
|
| 35 |
|
| 36 |
-
# 方式1: 检查 clawhub 列表
|
| 37 |
if command -v clawhub &> /dev/null && clawhub list 2>/dev/null | grep -q "$skill"; then
|
| 38 |
echo " ✓ 已通过 clawhub 安装。"
|
| 39 |
is_installed=true
|
| 40 |
-
# 方式2: 检查标准技能目录
|
| 41 |
elif [ -d "/app/skills/$skill" ] || [ -d "/root/.openclaw/skills/$skill" ]; then
|
| 42 |
echo " ✓ 技能目录已存在。"
|
| 43 |
is_installed=true
|
|
@@ -56,7 +50,6 @@ for skill in "${SKILLS[@]}"; do
|
|
| 56 |
fi
|
| 57 |
done
|
| 58 |
|
| 59 |
-
# 修复:微信插件安装不应在技能循环内重复执行,移出循环
|
| 60 |
echo ""
|
| 61 |
echo "=== 4. 安装微信 ClawBot 插件 ==="
|
| 62 |
echo "安装命令: npx -y @tencent-weixin/openclaw-weixin-cli@latest install"
|
|
@@ -72,36 +65,31 @@ else
|
|
| 72 |
fi
|
| 73 |
fi
|
| 74 |
|
| 75 |
-
# --- 技能结构诊断 (调试用,可注释掉) ---
|
| 76 |
echo ""
|
| 77 |
echo "=== 5. 技能结构诊断 ==="
|
| 78 |
for skill in "${INSTALLED_SKILLS[@]}"; do
|
| 79 |
echo ""
|
| 80 |
echo "--- 诊断技能: $skill ---"
|
| 81 |
-
|
| 82 |
-
local possible_paths=("/app/skills/$skill" "/root/.openclaw/skills/$skill" "/skills/$skill")
|
| 83 |
for dir in "${possible_paths[@]}"; do
|
| 84 |
if [ -d "$dir" ]; then
|
| 85 |
echo " 找到目录: $dir"
|
| 86 |
-
# 检查关键文件
|
| 87 |
for meta_file in "skill.json" "package.json" "_meta.json"; do
|
| 88 |
if [ -f "$dir/$meta_file" ]; then
|
| 89 |
echo " 📄 发现 $meta_file"
|
| 90 |
fi
|
| 91 |
done
|
| 92 |
-
break
|
| 93 |
fi
|
| 94 |
done
|
| 95 |
done
|
| 96 |
|
| 97 |
-
# --- 配置生成 ---
|
| 98 |
echo ""
|
| 99 |
echo "=== 6. 配置 API 地址与生成主配置 ==="
|
| 100 |
-
|
| 101 |
-
CLEAN_BASE="${OPENAI_API_BASE%/}" # 去除末尾可能存在的斜杠
|
| 102 |
CLEAN_BASE="${CLEAN_BASE%/chat/completions}"
|
| 103 |
CLEAN_BASE="${CLEAN_BASE%/v1}"
|
| 104 |
-
CLEAN_BASE="${CLEAN_BASE}/v1"
|
| 105 |
echo "规范化后的 API 地址: $CLEAN_BASE"
|
| 106 |
|
| 107 |
cat > /root/.openclaw/openclaw.json <<EOF
|
|
@@ -163,17 +151,16 @@ cat > /root/.openclaw/openclaw.json <<EOF
|
|
| 163 |
EOF
|
| 164 |
echo "主配置文件已生成: /root/.openclaw/openclaw.json"
|
| 165 |
|
| 166 |
-
# --- 权限与链接设置 ---
|
| 167 |
echo ""
|
| 168 |
echo "=== 7. 设置权限与技能链接 ==="
|
| 169 |
chmod 700 /root/.openclaw
|
| 170 |
chmod 600 /root/.openclaw/openclaw.json
|
| 171 |
chmod 700 /root/.openclaw/{agents,credentials,sessions}
|
| 172 |
-
chmod 750 /root/.openclaw/skills
|
| 173 |
|
| 174 |
for skill in "${INSTALLED_SKILLS[@]}"; do
|
| 175 |
echo "处理技能链接: $skill"
|
| 176 |
-
|
| 177 |
for dir in "/app/skills/$skill" "/skills/$skill" "/root/.openclaw/skills/$skill"; do
|
| 178 |
if [ -d "$dir" ]; then
|
| 179 |
source_dir="$dir"
|
|
@@ -182,7 +169,7 @@ for skill in "${INSTALLED_SKILLS[@]}"; do
|
|
| 182 |
done
|
| 183 |
|
| 184 |
if [ -n "$source_dir" ]; then
|
| 185 |
-
|
| 186 |
if [ ! -L "$link_target" ] || [ "$(readlink -f "$link_target")" != "$(readlink -f "$source_dir")" ]; then
|
| 187 |
ln -sfn "$source_dir" "$link_target"
|
| 188 |
echo " ✓ 链接已创建/更新: $link_target -> $source_dir"
|
|
@@ -192,13 +179,11 @@ for skill in "${INSTALLED_SKILLS[@]}"; do
|
|
| 192 |
fi
|
| 193 |
done
|
| 194 |
|
| 195 |
-
# --- 启动前健康检查 ---
|
| 196 |
echo ""
|
| 197 |
echo "=== 8. 运行启动前检查 ==="
|
| 198 |
if command -v openclaw &> /dev/null; then
|
| 199 |
openclaw doctor --fix 2>&1 | tee /tmp/openclaw-doctor-startup.log
|
| 200 |
echo "健康检查日志: /tmp/openclaw-doctor-startup.log"
|
| 201 |
-
|
| 202 |
echo ""
|
| 203 |
echo "--- 已安装技能列表 (openclaw) ---"
|
| 204 |
openclaw skills list 2>&1 || echo " 无法列出技能。"
|
|
@@ -206,7 +191,6 @@ else
|
|
| 206 |
echo "⚠️ openclaw 命令未找到,跳过健康检查。" >&2
|
| 207 |
fi
|
| 208 |
|
| 209 |
-
# --- 环境摘要 ---
|
| 210 |
echo ""
|
| 211 |
echo "=== 9. 环境摘要 ==="
|
| 212 |
echo "服务端口: $PORT"
|
|
@@ -215,10 +199,8 @@ echo "API 地址: ${CLEAN_BASE%/v1} (v1)"
|
|
| 215 |
echo "网关令牌: ${OPENCLAW_GATEWAY_PASSWORD:0:3}..."
|
| 216 |
echo "Tavily Key: ${TAVILY_API_KEY:0:5}..."
|
| 217 |
|
| 218 |
-
# --- 启动后台任务与主服务 ---
|
| 219 |
echo ""
|
| 220 |
echo "=== 10. 启动后台任务与主服务 ==="
|
| 221 |
-
# 启动定时备份任务 (每小时一次)
|
| 222 |
(
|
| 223 |
echo " 定时备份任务启动。"
|
| 224 |
while true; do
|
|
@@ -239,5 +221,4 @@ echo "正在启动 OpenClaw 网关..."
|
|
| 239 |
echo "控制台 (如配置): "
|
| 240 |
echo "======================================"
|
| 241 |
echo ""
|
| 242 |
-
# 使用 exec 启动,使网关成为容器主进程
|
| 243 |
exec openclaw gateway run --port "$PORT"
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
echo "===== OpenClaw 启动脚本 v2.2 (修正版) ====="
|
| 4 |
echo "启动时间: $(date)"
|
| 5 |
|
|
|
|
| 6 |
echo ""
|
| 7 |
echo "=== 1. 初始化环境与目录 ==="
|
| 8 |
mkdir -p /root/.openclaw/agents/main/sessions
|
|
|
|
| 11 |
mkdir -p /root/.openclaw/skills
|
| 12 |
echo "目录结构创建完成。"
|
| 13 |
|
|
|
|
| 14 |
echo ""
|
| 15 |
echo "=== 2. 从备份恢复数据 ==="
|
| 16 |
if python3 /app/sync.py restore; then
|
|
|
|
| 19 |
echo "⚠️ 数据恢复过程可能存在问题,将继续启动流程。" >&2
|
| 20 |
fi
|
| 21 |
|
|
|
|
| 22 |
echo ""
|
| 23 |
echo "=== 3. 检查与安装技能 ==="
|
|
|
|
| 24 |
SKILLS=("openclaw-tavily-search" "@tencent-weixin/openclaw-weixin")
|
| 25 |
INSTALLED_SKILLS=()
|
| 26 |
|
| 27 |
for skill in "${SKILLS[@]}"; do
|
| 28 |
echo ""
|
| 29 |
echo "检查技能: $skill"
|
| 30 |
+
is_installed=false
|
| 31 |
|
|
|
|
| 32 |
if command -v clawhub &> /dev/null && clawhub list 2>/dev/null | grep -q "$skill"; then
|
| 33 |
echo " ✓ 已通过 clawhub 安装。"
|
| 34 |
is_installed=true
|
|
|
|
| 35 |
elif [ -d "/app/skills/$skill" ] || [ -d "/root/.openclaw/skills/$skill" ]; then
|
| 36 |
echo " ✓ 技能目录已存在。"
|
| 37 |
is_installed=true
|
|
|
|
| 50 |
fi
|
| 51 |
done
|
| 52 |
|
|
|
|
| 53 |
echo ""
|
| 54 |
echo "=== 4. 安装微信 ClawBot 插件 ==="
|
| 55 |
echo "安装命令: npx -y @tencent-weixin/openclaw-weixin-cli@latest install"
|
|
|
|
| 65 |
fi
|
| 66 |
fi
|
| 67 |
|
|
|
|
| 68 |
echo ""
|
| 69 |
echo "=== 5. 技能结构诊断 ==="
|
| 70 |
for skill in "${INSTALLED_SKILLS[@]}"; do
|
| 71 |
echo ""
|
| 72 |
echo "--- 诊断技能: $skill ---"
|
| 73 |
+
possible_paths=("/app/skills/$skill" "/root/.openclaw/skills/$skill" "/skills/$skill")
|
|
|
|
| 74 |
for dir in "${possible_paths[@]}"; do
|
| 75 |
if [ -d "$dir" ]; then
|
| 76 |
echo " 找到目录: $dir"
|
|
|
|
| 77 |
for meta_file in "skill.json" "package.json" "_meta.json"; do
|
| 78 |
if [ -f "$dir/$meta_file" ]; then
|
| 79 |
echo " 📄 发现 $meta_file"
|
| 80 |
fi
|
| 81 |
done
|
| 82 |
+
break
|
| 83 |
fi
|
| 84 |
done
|
| 85 |
done
|
| 86 |
|
|
|
|
| 87 |
echo ""
|
| 88 |
echo "=== 6. 配置 API 地址与生成主配置 ==="
|
| 89 |
+
CLEAN_BASE="${OPENAI_API_BASE%/}"
|
|
|
|
| 90 |
CLEAN_BASE="${CLEAN_BASE%/chat/completions}"
|
| 91 |
CLEAN_BASE="${CLEAN_BASE%/v1}"
|
| 92 |
+
CLEAN_BASE="${CLEAN_BASE}/v1"
|
| 93 |
echo "规范化后的 API 地址: $CLEAN_BASE"
|
| 94 |
|
| 95 |
cat > /root/.openclaw/openclaw.json <<EOF
|
|
|
|
| 151 |
EOF
|
| 152 |
echo "主配置文件已生成: /root/.openclaw/openclaw.json"
|
| 153 |
|
|
|
|
| 154 |
echo ""
|
| 155 |
echo "=== 7. 设置权限与技能链接 ==="
|
| 156 |
chmod 700 /root/.openclaw
|
| 157 |
chmod 600 /root/.openclaw/openclaw.json
|
| 158 |
chmod 700 /root/.openclaw/{agents,credentials,sessions}
|
| 159 |
+
chmod 750 /root/.openclaw/skills
|
| 160 |
|
| 161 |
for skill in "${INSTALLED_SKILLS[@]}"; do
|
| 162 |
echo "处理技能链接: $skill"
|
| 163 |
+
source_dir=""
|
| 164 |
for dir in "/app/skills/$skill" "/skills/$skill" "/root/.openclaw/skills/$skill"; do
|
| 165 |
if [ -d "$dir" ]; then
|
| 166 |
source_dir="$dir"
|
|
|
|
| 169 |
done
|
| 170 |
|
| 171 |
if [ -n "$source_dir" ]; then
|
| 172 |
+
link_target="/root/.openclaw/skills/$(basename "$skill")"
|
| 173 |
if [ ! -L "$link_target" ] || [ "$(readlink -f "$link_target")" != "$(readlink -f "$source_dir")" ]; then
|
| 174 |
ln -sfn "$source_dir" "$link_target"
|
| 175 |
echo " ✓ 链接已创建/更新: $link_target -> $source_dir"
|
|
|
|
| 179 |
fi
|
| 180 |
done
|
| 181 |
|
|
|
|
| 182 |
echo ""
|
| 183 |
echo "=== 8. 运行启动前检查 ==="
|
| 184 |
if command -v openclaw &> /dev/null; then
|
| 185 |
openclaw doctor --fix 2>&1 | tee /tmp/openclaw-doctor-startup.log
|
| 186 |
echo "健康检查日志: /tmp/openclaw-doctor-startup.log"
|
|
|
|
| 187 |
echo ""
|
| 188 |
echo "--- 已安装技能列表 (openclaw) ---"
|
| 189 |
openclaw skills list 2>&1 || echo " 无法列出技能。"
|
|
|
|
| 191 |
echo "⚠️ openclaw 命令未找到,跳过健康检查。" >&2
|
| 192 |
fi
|
| 193 |
|
|
|
|
| 194 |
echo ""
|
| 195 |
echo "=== 9. 环境摘要 ==="
|
| 196 |
echo "服务端口: $PORT"
|
|
|
|
| 199 |
echo "网关令牌: ${OPENCLAW_GATEWAY_PASSWORD:0:3}..."
|
| 200 |
echo "Tavily Key: ${TAVILY_API_KEY:0:5}..."
|
| 201 |
|
|
|
|
| 202 |
echo ""
|
| 203 |
echo "=== 10. 启动后台任务与主服务 ==="
|
|
|
|
| 204 |
(
|
| 205 |
echo " 定时备份任务启动。"
|
| 206 |
while true; do
|
|
|
|
| 221 |
echo "控制台 (如配置): "
|
| 222 |
echo "======================================"
|
| 223 |
echo ""
|
|
|
|
| 224 |
exec openclaw gateway run --port "$PORT"
|