Update start-openclaw.sh
Browse files- start-openclaw.sh +192 -87
start-openclaw.sh
CHANGED
|
@@ -1,49 +1,119 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
set -e
|
| 3 |
|
|
|
|
|
|
|
|
|
|
| 4 |
# 1. 创建必要的目录
|
|
|
|
|
|
|
| 5 |
mkdir -p /root/.openclaw/agents/main/sessions
|
| 6 |
mkdir -p /root/.openclaw/credentials
|
| 7 |
mkdir -p /root/.openclaw/sessions
|
|
|
|
|
|
|
| 8 |
|
| 9 |
# 2. 从持久化存储恢复数据
|
|
|
|
|
|
|
| 10 |
python3 /app/sync.py restore
|
|
|
|
| 11 |
|
| 12 |
-
|
| 13 |
-
# 3. 检查并安装必要的技能
|
| 14 |
echo ""
|
| 15 |
-
echo "=== 检查技能安装
|
| 16 |
|
| 17 |
-
#
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
echo "安装 liang-tavily-search 技能..."
|
| 21 |
-
clawhub install liang-tavily-search
|
| 22 |
-
echo "liang-tavily-search 安装完成"
|
| 23 |
-
else
|
| 24 |
-
echo "liang-tavily-search 技能已安装"
|
| 25 |
-
fi
|
| 26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
# 4. 查
|
| 29 |
echo ""
|
| 30 |
-
echo "===
|
| 31 |
-
clawhub list 2>/dev/null || echo "无法获取技能列表"
|
| 32 |
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
-
#
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
fi
|
| 43 |
|
| 44 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
echo ""
|
| 46 |
-
echo "=== 生成配置文件 ==="
|
| 47 |
cat > /root/.openclaw/openclaw.json <<EOF
|
| 48 |
{
|
| 49 |
"models": {
|
|
@@ -63,9 +133,14 @@ cat > /root/.openclaw/openclaw.json <<EOF
|
|
| 63 |
"restart": true
|
| 64 |
},
|
| 65 |
"gateway": {
|
| 66 |
-
"mode": "local",
|
|
|
|
|
|
|
| 67 |
"trustedProxies": ["127.0.0.1/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],
|
| 68 |
-
"auth": {
|
|
|
|
|
|
|
|
|
|
| 69 |
"controlUi": {
|
| 70 |
"allowedOrigins": [
|
| 71 |
"https://aip9105-openclaw.hf.space/"
|
|
@@ -76,98 +151,128 @@ cat > /root/.openclaw/openclaw.json <<EOF
|
|
| 76 |
}
|
| 77 |
},
|
| 78 |
"skills": {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
"entries": {
|
| 80 |
"liang-tavily-search": {
|
| 81 |
"enabled": true,
|
| 82 |
"apiKey": "$TAVILY_API_KEY"
|
| 83 |
-
}
|
|
|
|
| 84 |
}
|
| 85 |
}
|
| 86 |
}
|
| 87 |
EOF
|
| 88 |
-
echo "配置文件生成完成: /root/.openclaw/openclaw.json"
|
| 89 |
|
| 90 |
-
|
|
|
|
|
|
|
| 91 |
echo ""
|
| 92 |
-
echo "=== 设置文件权限 ==="
|
| 93 |
chmod 700 /root/.openclaw
|
| 94 |
chmod 600 /root/.openclaw/openclaw.json
|
| 95 |
chmod 700 /root/.openclaw/agents
|
| 96 |
chmod 700 /root/.openclaw/credentials
|
| 97 |
chmod 700 /root/.openclaw/sessions
|
| 98 |
-
chmod
|
| 99 |
-
|
| 100 |
-
# 7. 安装常见技能依赖
|
| 101 |
-
# 检查 liang-tavily-search 是否已安装
|
| 102 |
-
if ! clawhub list | grep -q "liang-tavily-search"; then
|
| 103 |
-
echo "安装 liang-tavily-search 技能..."
|
| 104 |
-
clawhub install liang-tavily-search
|
| 105 |
-
else
|
| 106 |
-
echo "liang-tavily-search 技能已安装"
|
| 107 |
-
fi
|
| 108 |
|
| 109 |
-
#
|
| 110 |
echo ""
|
| 111 |
-
echo "===
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
# 9. 检查技能包内容
|
| 115 |
-
echo "=== 检查 liang-tavily-search 技能包 ==="
|
| 116 |
-
if [ -d "/app/skills/liang-tavily-search" ]; then
|
| 117 |
-
echo "技能安装在: /app/skills/liang-tavily-search"
|
| 118 |
-
ls -la /app/skills/liang-tavily-search/
|
| 119 |
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
echo "skill.json 内容:"
|
| 129 |
-
cat /app/skills/liang-tavily-search/skill.json
|
| 130 |
-
fi
|
| 131 |
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
fi
|
| 138 |
-
|
| 139 |
|
| 140 |
-
|
| 141 |
-
|
|
|
|
|
|
|
| 142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 143 |
|
| 144 |
-
#
|
| 145 |
echo ""
|
| 146 |
-
echo "===
|
| 147 |
-
|
|
|
|
| 148 |
|
| 149 |
-
# 11. 运行健康检查
|
| 150 |
echo ""
|
| 151 |
-
echo "
|
| 152 |
-
openclaw
|
| 153 |
|
| 154 |
-
#
|
| 155 |
echo ""
|
| 156 |
-
echo "===
|
| 157 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
|
| 159 |
-
#
|
| 160 |
echo ""
|
| 161 |
-
echo "
|
| 162 |
-
echo "
|
| 163 |
-
echo "
|
| 164 |
-
echo "
|
| 165 |
-
echo "
|
| 166 |
-
echo "网关令牌: ${OPENCLAW_GATEWAY_PASSWORD:0:10}..."
|
| 167 |
|
| 168 |
-
#
|
| 169 |
echo ""
|
| 170 |
-
echo "=== 启动 OpenClaw 网关 ==="
|
| 171 |
echo "监听端口: $PORT"
|
| 172 |
-
echo "绑定模式: lan
|
|
|
|
|
|
|
| 173 |
exec openclaw gateway run --port $PORT
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
set -e
|
| 3 |
|
| 4 |
+
echo "===== OpenClaw 启动脚本 v2.0 ====="
|
| 5 |
+
echo "启动时间: $(date)"
|
| 6 |
+
|
| 7 |
# 1. 创建必要的目录
|
| 8 |
+
echo ""
|
| 9 |
+
echo "=== 1. 创建目录结构 ==="
|
| 10 |
mkdir -p /root/.openclaw/agents/main/sessions
|
| 11 |
mkdir -p /root/.openclaw/credentials
|
| 12 |
mkdir -p /root/.openclaw/sessions
|
| 13 |
+
mkdir -p /root/.openclaw/skills
|
| 14 |
+
echo "目录创建完成"
|
| 15 |
|
| 16 |
# 2. 从持久化存储恢复数据
|
| 17 |
+
echo ""
|
| 18 |
+
echo "=== 2. 从备份恢复数据 ==="
|
| 19 |
python3 /app/sync.py restore
|
| 20 |
+
echo "数据恢复完成"
|
| 21 |
|
| 22 |
+
# 3. 检查技能安装状态
|
|
|
|
| 23 |
echo ""
|
| 24 |
+
echo "=== 3. 检查技能安装 ==="
|
| 25 |
|
| 26 |
+
# 定义技能列表
|
| 27 |
+
SKILLS=("liang-tavily-search")
|
| 28 |
+
INSTALLED_SKILLS=()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
+
# 检查并安装技能
|
| 31 |
+
for skill in "${SKILLS[@]}"; do
|
| 32 |
+
echo ""
|
| 33 |
+
echo "检查技能: $skill"
|
| 34 |
+
|
| 35 |
+
# 检查是否已安装
|
| 36 |
+
if clawhub list 2>/dev/null | grep -q "$skill"; then
|
| 37 |
+
echo "✓ 已通过 clawhub 安装: $skill"
|
| 38 |
+
INSTALLED_SKILLS+=("$skill")
|
| 39 |
+
elif [ -d "/app/skills/$skill" ]; then
|
| 40 |
+
echo "✓ 技能目录存在: /app/skills/$skill"
|
| 41 |
+
INSTALLED_SKILLS+=("$skill")
|
| 42 |
+
else
|
| 43 |
+
echo "✗ 未找到技能: $skill,尝试安装..."
|
| 44 |
+
echo "安装命令: clawhub install $skill"
|
| 45 |
+
|
| 46 |
+
# 尝试安装
|
| 47 |
+
if clawhub install "$skill"; then
|
| 48 |
+
echo "✓ 安装成功: $skill"
|
| 49 |
+
INSTALLED_SKILLS+=("$skill")
|
| 50 |
+
else
|
| 51 |
+
echo "⚠️ 安装失败: $skill"
|
| 52 |
+
fi
|
| 53 |
+
fi
|
| 54 |
+
done
|
| 55 |
|
| 56 |
+
# 4. 详细检查技能结构
|
| 57 |
echo ""
|
| 58 |
+
echo "=== 4. 详细检查技能结构 ==="
|
|
|
|
| 59 |
|
| 60 |
+
for skill in "${INSTALLED_SKILLS[@]}"; do
|
| 61 |
+
echo ""
|
| 62 |
+
echo "--- 检查 $skill ---"
|
| 63 |
+
|
| 64 |
+
# 查找技能可能的位置
|
| 65 |
+
find / -type d -name "*$skill*" 2>/dev/null | head -5 | while read dir; do
|
| 66 |
+
echo "找到目录: $dir"
|
| 67 |
+
ls -la "$dir/"
|
| 68 |
+
|
| 69 |
+
# 检查关键文件
|
| 70 |
+
for file in "package.json" "skill.json" "_meta.json" "skill.yml" "skill.yaml"; do
|
| 71 |
+
if [ -f "$dir/$file" ]; then
|
| 72 |
+
echo " 📄 找到 $file:"
|
| 73 |
+
head -20 "$dir/$file"
|
| 74 |
+
fi
|
| 75 |
+
done
|
| 76 |
+
done
|
| 77 |
+
done
|
| 78 |
|
| 79 |
+
# 5. 检查 _meta.json 内容
|
| 80 |
+
echo ""
|
| 81 |
+
echo "=== 5. 检查技能元数据 ==="
|
| 82 |
+
if [ -f "/app/skills/liang-tavily-search/_meta.json" ]; then
|
| 83 |
+
echo "_meta.json 内容:"
|
| 84 |
+
cat "/app/skills/liang-tavily-search/_meta.json"
|
| 85 |
+
|
| 86 |
+
# 解析 _meta.json
|
| 87 |
+
if command -v jq &> /dev/null; then
|
| 88 |
+
echo ""
|
| 89 |
+
echo "解析 _meta.json:"
|
| 90 |
+
cat "/app/skills/liang-tavily-search/_meta.json" | jq .
|
| 91 |
+
fi
|
| 92 |
+
fi
|
| 93 |
|
| 94 |
+
# 6. 检查 SKILL.md
|
| 95 |
+
if [ -f "/app/skills/liang-tavily-search/SKILL.md" ]; then
|
| 96 |
+
echo ""
|
| 97 |
+
echo "SKILL.md 前20行:"
|
| 98 |
+
head -20 "/app/skills/liang-tavily-search/SKILL.md"
|
| 99 |
fi
|
| 100 |
|
| 101 |
+
# 7. 检查 scripts 目录
|
| 102 |
+
if [ -d "/app/skills/liang-tavily-search/scripts" ]; then
|
| 103 |
+
echo ""
|
| 104 |
+
echo "scripts 目录内容:"
|
| 105 |
+
ls -la "/app/skills/liang-tavily-search/scripts/"
|
| 106 |
+
fi
|
| 107 |
+
|
| 108 |
+
# 8. 清理和格式化 API 地址
|
| 109 |
+
echo ""
|
| 110 |
+
echo "=== 6. 配置 API 地址 ==="
|
| 111 |
+
CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1/|/v1|g" | sed "s|/v1$|/v1|g")
|
| 112 |
+
echo "API 地址: $CLEAN_BASE"
|
| 113 |
+
|
| 114 |
+
# 9. 生成主配置文件
|
| 115 |
echo ""
|
| 116 |
+
echo "=== 7. 生成主配置文件 ==="
|
| 117 |
cat > /root/.openclaw/openclaw.json <<EOF
|
| 118 |
{
|
| 119 |
"models": {
|
|
|
|
| 133 |
"restart": true
|
| 134 |
},
|
| 135 |
"gateway": {
|
| 136 |
+
"mode": "local",
|
| 137 |
+
"bind": "lan",
|
| 138 |
+
"port": $PORT,
|
| 139 |
"trustedProxies": ["127.0.0.1/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],
|
| 140 |
+
"auth": {
|
| 141 |
+
"mode": "token",
|
| 142 |
+
"token": "$OPENCLAW_GATEWAY_PASSWORD"
|
| 143 |
+
},
|
| 144 |
"controlUi": {
|
| 145 |
"allowedOrigins": [
|
| 146 |
"https://aip9105-openclaw.hf.space/"
|
|
|
|
| 151 |
}
|
| 152 |
},
|
| 153 |
"skills": {
|
| 154 |
+
"directories": [
|
| 155 |
+
"/root/.openclaw/skills",
|
| 156 |
+
"/app/skills",
|
| 157 |
+
"/skills"
|
| 158 |
+
],
|
| 159 |
"entries": {
|
| 160 |
"liang-tavily-search": {
|
| 161 |
"enabled": true,
|
| 162 |
"apiKey": "$TAVILY_API_KEY"
|
| 163 |
+
},
|
| 164 |
+
|
| 165 |
}
|
| 166 |
}
|
| 167 |
}
|
| 168 |
EOF
|
|
|
|
| 169 |
|
| 170 |
+
echo "配置文件已生成: /root/.openclaw/openclaw.json"
|
| 171 |
+
|
| 172 |
+
# 10. 修复权限
|
| 173 |
echo ""
|
| 174 |
+
echo "=== 8. 设置文件权限 ==="
|
| 175 |
chmod 700 /root/.openclaw
|
| 176 |
chmod 600 /root/.openclaw/openclaw.json
|
| 177 |
chmod 700 /root/.openclaw/agents
|
| 178 |
chmod 700 /root/.openclaw/credentials
|
| 179 |
chmod 700 /root/.openclaw/sessions
|
| 180 |
+
chmod 755 /root/.openclaw/skills 2>/dev/null || true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 181 |
|
| 182 |
+
# 11. 创建技能符号链接
|
| 183 |
echo ""
|
| 184 |
+
echo "=== 9. 设置技能链接 ==="
|
| 185 |
+
for skill in "${INSTALLED_SKILLS[@]}"; do
|
| 186 |
+
echo "处理技能: $skill"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 187 |
|
| 188 |
+
# 查找技能目录
|
| 189 |
+
SKILL_DIR=""
|
| 190 |
+
for dir in "/app/skills/$skill" "/skills/$skill" "/root/.openclaw/skills/$skill"; do
|
| 191 |
+
if [ -d "$dir" ]; then
|
| 192 |
+
SKILL_DIR="$dir"
|
| 193 |
+
break
|
| 194 |
+
fi
|
| 195 |
+
done
|
|
|
|
|
|
|
|
|
|
| 196 |
|
| 197 |
+
if [ -n "$SKILL_DIR" ]; then
|
| 198 |
+
echo " 找到技能目录: $SKILL_DIR"
|
| 199 |
+
|
| 200 |
+
# 创建符号链接到 OpenClaw 技能目录
|
| 201 |
+
LINK_TARGET="/root/.openclaw/skills/$skill"
|
| 202 |
+
if [ ! -e "$LINK_TARGET" ] && [ "$SKILL_DIR" != "$LINK_TARGET" ]; then
|
| 203 |
+
echo " 创建链接: $SKILL_DIR -> $LINK_TARGET"
|
| 204 |
+
ln -sf "$SKILL_DIR" "$LINK_TARGET"
|
| 205 |
+
fi
|
| 206 |
+
|
| 207 |
+
# 检查是否缺少关键文件
|
| 208 |
+
if [ ! -f "$SKILL_DIR/package.json" ] && [ ! -f "$SKILL_DIR/skill.json" ]; then
|
| 209 |
+
echo " ⚠️ 警告: 缺少 package.json 或 skill.json,技能可能无法被 OpenClaw 识别"
|
| 210 |
+
|
| 211 |
+
# 尝试创建基本的 skill.json
|
| 212 |
+
if [ ! -f "$SKILL_DIR/skill.json" ] && [ -f "$SKILL_DIR/_meta.json" ]; then
|
| 213 |
+
echo " 尝试从 _meta.json 创建 skill.json..."
|
| 214 |
+
cat > "$SKILL_DIR/skill.json" <<EOF
|
| 215 |
+
{
|
| 216 |
+
"name": "$skill",
|
| 217 |
+
"description": "Auto-generated from _meta.json",
|
| 218 |
+
"version": "1.0.0",
|
| 219 |
+
"main": "index.js",
|
| 220 |
+
"type": "skill"
|
| 221 |
+
}
|
| 222 |
+
EOF
|
| 223 |
+
echo " 创建了基本的 skill.json"
|
| 224 |
+
fi
|
| 225 |
+
fi
|
| 226 |
+
else
|
| 227 |
+
echo " ❌ 未找到技能目录: $skill"
|
| 228 |
fi
|
| 229 |
+
done
|
| 230 |
|
| 231 |
+
# 12. 启动定时备份
|
| 232 |
+
echo ""
|
| 233 |
+
echo "=== 10. 启动定时备份 ==="
|
| 234 |
+
(while true; do sleep 3600; python3 /app/sync.py backup; done) &
|
| 235 |
|
| 236 |
+
# 13. 运行健康检查
|
| 237 |
+
echo ""
|
| 238 |
+
echo "=== 11. 运行健康检查 ==="
|
| 239 |
+
openclaw doctor --fix 2>&1 | tee /tmp/openclaw-doctor.log
|
| 240 |
+
echo "健康检查完成,日志: /tmp/openclaw-doctor.log"
|
| 241 |
|
| 242 |
+
# 14. 列出所有技能
|
| 243 |
echo ""
|
| 244 |
+
echo "=== 12. 列出所有技能 ==="
|
| 245 |
+
echo "--- ClawHub 安装的技能 ---"
|
| 246 |
+
clawhub list 2>/dev/null || echo "无法获取列表"
|
| 247 |
|
|
|
|
| 248 |
echo ""
|
| 249 |
+
echo "--- OpenClaw 识别的技能 ---"
|
| 250 |
+
openclaw skills list 2>&1 || echo "无法获取技能列表"
|
| 251 |
|
| 252 |
+
# 15. 调试:检查技能配置
|
| 253 |
echo ""
|
| 254 |
+
echo "=== 13. 调试信息 ==="
|
| 255 |
+
echo "当前用户: $(whoami)"
|
| 256 |
+
echo "HOME 目录: $HOME"
|
| 257 |
+
echo "PORT: $PORT"
|
| 258 |
+
echo "技能目录列表:"
|
| 259 |
+
ls -la /root/.openclaw/skills/ 2>/dev/null || echo "无技能目录"
|
| 260 |
+
ls -la /app/skills/ 2>/dev/null || echo "无 /app/skills 目录"
|
| 261 |
+
ls -la /skills/ 2>/dev/null || echo "无 /skills 目录"
|
| 262 |
|
| 263 |
+
# 16. 检查环境变量
|
| 264 |
echo ""
|
| 265 |
+
echo "环境变量检查:"
|
| 266 |
+
echo "TAVILY_API_KEY: ${TAVILY_API_KEY:0:5}..."
|
| 267 |
+
echo "OPENCLAW_GATEWAY_PASSWORD: ${OPENCLAW_GATEWAY_PASSWORD:0:5}..."
|
| 268 |
+
echo "MODEL: $MODEL"
|
| 269 |
+
echo "OPENAI_API_BASE: $OPENAI_API_BASE"
|
|
|
|
| 270 |
|
| 271 |
+
# 17. 启动网关
|
| 272 |
echo ""
|
| 273 |
+
echo "=== 14. 启动 OpenClaw 网关 ==="
|
| 274 |
echo "监听端口: $PORT"
|
| 275 |
+
echo "绑定模式: lan"
|
| 276 |
+
echo "控制台: https://aip9105-openclaw.hf.space/"
|
| 277 |
+
echo "======================================"
|
| 278 |
exec openclaw gateway run --port $PORT
|