aip9105 commited on
Commit
ba27334
·
verified ·
1 Parent(s): d6ec84e

Update start-openclaw.sh

Browse files
Files changed (1) hide show
  1. start-openclaw.sh +158 -200
start-openclaw.sh CHANGED
@@ -1,134 +1,109 @@
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=("openclaw-tavily-search","@tencent-weixin/openclaw-weixin")
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
- # 添加微信插件安装
55
- echo ""
56
- echo "=== 安装微信ClawBot插件 ==="
57
- echo "安装命令: npx -y @tencent-weixin/openclaw-weixin-cli@latest install"
58
- if npx -y @tencent-weixin/openclaw-weixin-cli@latest install; then
59
- echo "✓ 微信插件安装成功"
60
- else
61
- echo "⚠️ npx安装失败,尝试openclaw插件安装方式"
62
- if openclaw plugins install "@tencent-weixin/openclaw-weixin"; then
63
- echo "✓ openclaw插件安装成功"
64
- openclaw config set plugins.entries.openclaw-weixin.enabled true
65
- else
66
- echo "❌ 微信插件安装失败"
67
- fi
68
  fi
69
  done
70
 
71
- # 4. 详细检查技能结构
72
- echo ""
73
- echo "=== 4. 详细检查技能结构 ==="
 
 
 
 
 
 
 
 
 
 
 
 
74
 
 
 
 
75
  for skill in "${INSTALLED_SKILLS[@]}"; do
76
  echo ""
77
- echo "--- 检查 $skill ---"
78
-
79
- # 查找技能可能的位置
80
- find / -type d -name "*$skill*" 2>/dev/null | head -5 | while read dir; do
81
- echo "找到目录: $dir"
82
- ls -la "$dir/"
83
-
84
- # 检查关键文件
85
- for file in "package.json" "skill.json" "_meta.json" "skill.yml" "skill.yaml"; do
86
- if [ -f "$dir/$file" ]; then
87
- echo " 📄 找到 $file:"
88
- head -20 "$dir/$file"
89
- fi
90
- done
91
  done
92
  done
93
 
94
- # 5. 检查 _meta.json 内容
95
- echo ""
96
- echo "=== 5. 检查技能元数据 ==="
97
- if [ -f "/app/skills/liang-tavily-search/_meta.json" ]; then
98
- echo "_meta.json 内容:"
99
- cat "/app/skills/liang-tavily-search/_meta.json"
100
-
101
- # 解析 _meta.json
102
- if command -v jq &> /dev/null; then
103
- echo ""
104
- echo "解析 _meta.json:"
105
- cat "/app/skills/liang-tavily-search/_meta.json" | jq .
106
- fi
107
- fi
108
-
109
- # 6. 检查 SKILL.md
110
- if [ -f "/app/skills/liang-tavily-search/SKILL.md" ]; then
111
- echo ""
112
- echo "SKILL.md 前20行:"
113
- head -20 "/app/skills/liang-tavily-search/SKILL.md"
114
- fi
115
-
116
- # 7. 检查 scripts 目录
117
- if [ -d "/app/skills/liang-tavily-search/scripts" ]; then
118
- echo ""
119
- echo "scripts 目录内容:"
120
- ls -la "/app/skills/liang-tavily-search/scripts/"
121
- fi
122
-
123
- # 8. 清理和格式化 API 地址
124
  echo ""
125
- echo "=== 6. 配置 API 地址 ==="
126
- CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1/|/v1|g" | sed "s|/v1$|/v1|g")
127
- echo "API 地址: $CLEAN_BASE"
 
 
 
 
128
 
129
- # 9. 生成主配置文件
130
- echo ""
131
- echo "=== 7. 生成主配置文件 ==="
132
  cat > /root/.openclaw/openclaw.json <<EOF
133
  {
134
  "models": {
@@ -138,28 +113,41 @@ cat > /root/.openclaw/openclaw.json <<EOF
138
  "apiKey": "$OPENAI_API_KEY",
139
  "api": "openai-completions",
140
  "models": [
141
- { "id": "$MODEL", "name": "$MODEL", "contextWindow": 128000 }
 
 
 
 
142
  ]
143
  }
144
  }
145
  },
146
- "agents": { "defaults": { "model": { "primary": "nvidia/$MODEL" } } },
 
 
 
 
 
 
147
  "commands": {
148
  "restart": true
149
  },
150
  "gateway": {
151
- "mode": "local",
152
- "bind": "lan",
153
  "port": $PORT,
154
- "trustedProxies": ["127.0.0.1/8", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],
155
- "auth": {
156
- "mode": "token",
157
- "token": "$OPENCLAW_GATEWAY_PASSWORD"
 
 
 
 
 
158
  },
159
- "controlUi": {
160
- "allowedOrigins": [
161
- "https://aip9105-openclaw.hf.space/","https://openclaw.2025924.xyz/"
162
- ],
163
  "dangerouslyAllowHostHeaderOriginFallback": true,
164
  "allowInsecureAuth": true,
165
  "dangerouslyDisableDeviceAuth": true
@@ -168,118 +156,88 @@ cat > /root/.openclaw/openclaw.json <<EOF
168
  "enabled": false
169
  },
170
  "plugins": {
171
- "allow": ["openclaw-weixin"]
172
  }
173
- },
174
-
175
  }
176
  EOF
 
177
 
178
- echo "配文件已生成: /root/.openclaw/openclaw.json"
179
-
180
- # 10. 修复权限
181
  echo ""
182
- echo "=== 8. 设置文件权限 ==="
183
  chmod 700 /root/.openclaw
184
  chmod 600 /root/.openclaw/openclaw.json
185
- chmod 700 /root/.openclaw/agents
186
- chmod 700 /root/.openclaw/credentials
187
- chmod 700 /root/.openclaw/sessions
188
- chmod 755 /root/.openclaw/skills 2>/dev/null || true
189
 
190
- # 11. 创建技能符号链接
191
- echo ""
192
- echo "=== 9. 设置技能链接 ==="
193
  for skill in "${INSTALLED_SKILLS[@]}"; do
194
- echo "处理技能: $skill"
195
-
196
- # 查找技能目录
197
- SKILL_DIR=""
198
  for dir in "/app/skills/$skill" "/skills/$skill" "/root/.openclaw/skills/$skill"; do
199
  if [ -d "$dir" ]; then
200
- SKILL_DIR="$dir"
201
  break
202
  fi
203
  done
204
-
205
- if [ -n "$SKILL_DIR" ]; then
206
- echo " 找到技能目录: $SKILL_DIR"
207
-
208
- # 创建符号链接到 OpenClaw 技能目录
209
- LINK_TARGET="/root/.openclaw/skills/$skill"
210
- if [ ! -e "$LINK_TARGET" ] && [ "$SKILL_DIR" != "$LINK_TARGET" ]; then
211
- echo " 创建链接: $SKILL_DIR -> $LINK_TARGET"
212
- ln -sf "$SKILL_DIR" "$LINK_TARGET"
213
- fi
214
-
215
- # 检查是否缺少关键文件
216
- if [ ! -f "$SKILL_DIR/package.json" ] && [ ! -f "$SKILL_DIR/skill.json" ]; then
217
- echo " ⚠️ 警告: 缺少 package.json 或 skill.json,技能可能无法被 OpenClaw 识别"
218
-
219
- # 尝试创建基本的 skill.json
220
- if [ ! -f "$SKILL_DIR/skill.json" ] && [ -f "$SKILL_DIR/_meta.json" ]; then
221
- echo " 尝试从 _meta.json 创建 skill.json..."
222
- cat > "$SKILL_DIR/skill.json" <<EOF
223
- {
224
- "name": "$skill",
225
- "description": "Auto-generated from _meta.json",
226
- "version": "1.0.0",
227
- "main": "index.js",
228
- "type": "skill"
229
- }
230
- EOF
231
- echo " 创建了基本的 skill.json"
232
- fi
233
  fi
234
  else
235
- echo " 未找到技能目录: $skill"
236
  fi
237
  done
238
 
239
- # 12. 启动定时备份
240
  echo ""
241
- echo "=== 10. 启动定时备份 ==="
242
- (while true; do sleep 3600; python3 /app/sync.py backup; done) &
 
 
243
 
244
- # 13. 运行健康检查
245
- echo ""
246
- echo "=== 11. 运行健康检查 ==="
247
- openclaw doctor --fix 2>&1 | tee /tmp/openclaw-doctor.log
248
- echo "健康检查完成,日志: /tmp/openclaw-doctor.log"
249
-
250
- # 14. 列出所有技能
251
- echo ""
252
- echo "=== 12. 列出所有技能 ==="
253
- echo "--- ClawHub 安装的技能 ---"
254
- clawhub list 2>/dev/null || echo "无法获取列表"
255
-
256
- echo ""
257
- echo "--- OpenClaw 识别的技能 ---"
258
- openclaw skills list 2>&1 || echo "无法获取技能列表"
259
 
260
- # 15. 调试:检查技能配置
261
- echo ""
262
- echo "=== 13. 调试信息 ==="
263
- echo "当前用户: $(whoami)"
264
- echo "HOME 目录: $HOME"
265
- echo "PORT: $PORT"
266
- echo "技能目录列表:"
267
- ls -la /root/.openclaw/skills/ 2>/dev/null || echo "无技能目录"
268
- ls -la /app/skills/ 2>/dev/null || echo "无 /app/skills 目录"
269
- ls -la /skills/ 2>/dev/null || echo "无 /skills 目录"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
 
271
- # 16. 检查环境变量
272
  echo ""
273
- echo "环境变量检查:"
274
- echo "TAVILY_API_KEY: ${TAVILY_API_KEY:0:5}..."
275
- echo "OPENCLAW_GATEWAY_PASSWORD: ${OPENCLAW_GATEWAY_PASSWORD:0:5}..."
276
- echo "MODEL: $MODEL"
277
- echo "OPENAI_API_BASE: $OPENAI_API_BASE"
278
- # 17. 启动网关
279
- echo ""
280
- echo "=== 14. 启动 OpenClaw 网关 ==="
281
- echo "监听端口: $PORT"
282
- echo "绑定模式: lan"
283
- echo "控制台: https://aip9105-openclaw.hf.space/"
284
  echo "======================================"
285
- exec openclaw gateway run --port $PORT
 
 
 
 
 
 
1
  #!/bin/bash
2
+ set -euo pipefail # 启用更严格的错误处理,检测未定义变量
3
+ echo "===== OpenClaw 启动脚本 v2.1 (优化版) ====="
 
4
  echo "启动时间: $(date)"
5
 
6
+ # --- 初始化与准备工作 ---
7
  echo ""
8
+ echo "=== 1. 初始化环境与目录 ==="
9
  mkdir -p /root/.openclaw/agents/main/sessions
10
  mkdir -p /root/.openclaw/credentials
11
  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
19
+ echo "数据恢复完成"
20
+ 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
+ local is_installed=false
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
44
  else
45
+ echo " ✗ 未找到技能,尝试通过 clawhub 安装..."
46
+ if command -v clawhub &> /dev/null && clawhub install "$skill"; then
47
+ echo " ✓ 安装成功: $skill"
48
+ is_installed=true
 
 
 
49
  else
50
+ echo " ⚠️ 安装失败: $skill (clawhub 可能不可用或网络错误)。" >&2
51
  fi
52
  fi
53
+
54
+ if [ "$is_installed" = true ]; then
55
+ INSTALLED_SKILLS+=("$skill")
 
 
 
 
 
 
 
 
 
 
 
56
  fi
57
  done
58
 
59
+ # 修复:微信插件安装不应在技能循环内重复执行,移出循环
60
+ echo ""
61
+ echo "=== 4. 安装微信 ClawBot 插件 ==="
62
+ echo "安装命令: npx -y @tencent-weixin/openclaw-weixin-cli@latest install"
63
+ if npx -y @tencent-weixin/openclaw-weixin-cli@latest install; then
64
+ echo "✓ 微信插件 (npx) 安装成功。"
65
+ else
66
+ echo "⚠️ npx 安装失败,尝试 openclaw 插件安装方式。" >&2
67
+ if command -v openclaw &> /dev/null && openclaw plugins install "@tencent-weixin/openclaw-weixin"; then
68
+ openclaw config set plugins.entries.openclaw-weixin.enabled true
69
+ echo "✓ 微信插件 (openclaw) 安装成功。"
70
+ else
71
+ echo "❌ 微信插件安装失败,相关功能可能不可用。" >&2
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
+ # 清理和格式化 API 地址
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" # 确保以 /v1 结尾
105
+ echo "规范化后的 API 地址: $CLEAN_BASE"
106
 
 
 
 
107
  cat > /root/.openclaw/openclaw.json <<EOF
108
  {
109
  "models": {
 
113
  "apiKey": "$OPENAI_API_KEY",
114
  "api": "openai-completions",
115
  "models": [
116
+ {
117
+ "id": "$MODEL",
118
+ "name": "$MODEL",
119
+ "contextWindow": 128000
120
+ }
121
  ]
122
  }
123
  }
124
  },
125
+ "agents": {
126
+ "defaults": {
127
+ "model": {
128
+ "primary": "nvidia/$MODEL"
129
+ }
130
+ }
131
+ },
132
  "commands": {
133
  "restart": true
134
  },
135
  "gateway": {
136
+ "mode": "local",
137
+ "bind": "lan",
138
  "port": $PORT,
139
+ "trustedProxies": [
140
+ "127.0.0.1/8",
141
+ "10.0.0.0/8",
142
+ "172.16.0.0/12",
143
+ "192.168.0.0/16"
144
+ ],
145
+ "auth": {
146
+ "mode": "token",
147
+ "token": "$OPENCLAW_GATEWAY_PASSWORD"
148
  },
149
+ "controlUi": {
150
+ "allowedOrigins": ["*"],
 
 
151
  "dangerouslyAllowHostHeaderOriginFallback": true,
152
  "allowInsecureAuth": true,
153
  "dangerouslyDisableDeviceAuth": true
 
156
  "enabled": false
157
  },
158
  "plugins": {
159
+ "allow": ["openclaw-weixin"]
160
  }
161
+ }
 
162
  }
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
+ local source_dir=""
 
 
177
  for dir in "/app/skills/$skill" "/skills/$skill" "/root/.openclaw/skills/$skill"; do
178
  if [ -d "$dir" ]; then
179
+ source_dir="$dir"
180
  break
181
  fi
182
  done
183
+
184
+ if [ -n "$source_dir" ]; then
185
+ local link_target="/root/.openclaw/skills/$(basename "$skill")"
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"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
189
  fi
190
  else
191
+ echo " ⚠️ 未找到技能目录,无法创建链接: $skill" >&2
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 " 无法列出技能。"
205
+ else
206
+ echo "⚠️ openclaw 命令未找到,跳过健康检查" >&2
207
+ fi
 
 
 
 
 
 
 
 
 
208
 
209
+ # --- 环境摘要 ---
210
+ echo ""
211
+ echo "=== 9. 环境摘要 ==="
212
+ echo "服务端口: $PORT"
213
+ echo "模型: $MODEL"
214
+ 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
225
+ sleep 3600
226
+ if python3 /app/sync.py backup; then
227
+ echo " [$(date)] 定时备份完成。"
228
+ else
229
+ echo " [$(date)] 定时备份失败。" >&2
230
+ fi
231
+ done
232
+ ) &
233
+ BACKUP_PID=$!
234
+ echo " 定时备份任务 PID: $BACKUP_PID"
235
 
 
236
  echo ""
 
 
 
 
 
 
 
 
 
 
 
237
  echo "======================================"
238
+ echo "正在启动 OpenClaw 网关..."
239
+ echo "控制台 (如配置): "
240
+ echo "======================================"
241
+ echo ""
242
+ # 使用 exec 启动,使网关成为容器主进程
243
+ exec openclaw gateway run --port "$PORT"