ted1990 commited on
Commit
f244765
·
verified ·
1 Parent(s): 4a7fcd0

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +49 -23
Dockerfile CHANGED
@@ -1,11 +1,11 @@
1
  # 核心镜像:Node 22 slim
2
  FROM node:22-slim
3
 
4
- # 安装 tini 作为 init 系统,正确处理信号和僵尸进程
5
  RUN apt-get update && apt-get install -y --no-install-recommends tini \
6
  && rm -rf /var/lib/apt/lists/*
7
 
8
- # 1. 安装系统依赖(分行列出,便于维护)
9
  RUN apt-get update && apt-get install -y --no-install-recommends \
10
  git \
11
  openssh-client \
@@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
17
  ca-certificates \
18
  && rm -rf /var/lib/apt/lists/*
19
 
20
- # 2. 安装 Hugging Face 命令行工具(允许覆盖外部管理环境)
21
  RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
22
 
23
  # 3. 更新 CA 证书
@@ -26,16 +26,16 @@ RUN update-ca-certificates
26
  # 4. 全局安装 OpenClaw
27
  RUN npm install -g openclaw@latest --unsafe-perm
28
 
29
- # 5. 准备数据目录并设置权限(使用 node 用户,UID 1000)
30
  RUN mkdir -p /home/node/.openclaw && \
31
  chown -R node:node /home/node/.openclaw
32
 
33
- # 6. 设置环境变量(适配 node 用户路径)
34
  ENV PORT=7860 \
35
  OPENCLAW_GATEWAY_MODE=local \
36
  HOME=/home/node
37
 
38
- # 7. 核心同步引擎 (sync.py) - 优化备份逻辑:避免空打包
39
  RUN echo 'import os, sys, tarfile\n\
40
  from huggingface_hub import HfApi, hf_hub_download\n\
41
  from datetime import datetime, timedelta\n\
@@ -84,7 +84,7 @@ def backup():\n\
84
  tar.add(full_path, arcname=target)\n\
85
  api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
86
  print(f"--- [SYNC] 备份上传成功! ---")\n\
87
- os.remove(name) # 清理临时文件\n\
88
  except Exception as e:\n\
89
  print(f"--- [SYNC] 备份失败: {e} ---")\n\
90
  \n\
@@ -95,7 +95,40 @@ if __name__ == "__main__":\n\
95
  restore()\n\
96
  ' > /usr/local/bin/sync.py
97
 
98
- # 8. 容器入口脚本 (start-openclaw) - 增强健壮性,添加自动配对批准(轮询方式
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  RUN echo "#!/bin/bash\n\
100
  set -e\n\
101
  \n\
@@ -105,18 +138,14 @@ set -e\n\
105
  : \"\${MODEL:?环境变量 MODEL 未设置}\"\n\
106
  : \"\${OPENCLAW_GATEWAY_PASSWORD:?环境变量 OPENCLAW_GATEWAY_PASSWORD 未设置}\"\n\
107
  \n\
108
- # 确保数据目录存在且可写\n\
109
  DATA_DIR=\"\$HOME/.openclaw\"\n\
110
  mkdir -p \"\$DATA_DIR\"/{sessions,workspace}\n\
111
  \n\
112
- # 启动前执行数据恢复\n\
113
  python3 /usr/local/bin/sync.py restore\n\
114
  \n\
115
- # 清理 API Base 地址\n\
116
  CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
117
  \n\
118
- # 生成 openclaw.json 配置文件(使用当前用户权限)\n\
119
- # 注意:allowedOrigins 中必须包含 Hugging Face Space 的域名,否则无法从外部访问控制界面\n\
120
  cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
121
  {\n\
122
  \"models\": {\n\
@@ -136,27 +165,25 @@ cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
136
  \"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
137
  \"controlUi\": {\n\
138
  \"allowInsecureAuth\": true,\n\
139
- \"allowedOrigins\": [\"https://ted1990-openclaw.hf.space\"]\n\
 
140
  }\n\
141
  }\n\
142
  }\n\
143
  EOF\n\
144
  \n\
145
- # 修复权��(根据 doctor 建议)\n\
146
  chmod 700 \"\$DATA_DIR\"\n\
147
  chmod 600 \"\$DATA_DIR/openclaw.json\"\n\
148
  \n\
149
- # 启动定时备份进程(每 3 小时执行一次)\n\
150
  (while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\
151
  \n\
152
- # ===== 自动批准设备配对(轮询方式,更可靠=====\n\
153
- # 警告:仅用于首次启动,之后建议手动管理\n\
154
  (\n\
155
  echo \"⏳ 等待网关启动并生成配对请求...\"\n\
156
  sleep 25\n\
157
  for i in {1..15}; do\n\
158
  echo \"尝试获取待批准设备列表 (第 \$i/15 次)...\"\n\
159
- # 使用 --json 输出并提取第一个请求ID\n\
160
  REQUEST_ID=\$(openclaw devices list --json 2>/dev/null | grep -o '\"requestId\":\"[^\"]*\"' | head -1 | cut -d'\"' -f4)\n\
161
  if [ -n \"\$REQUEST_ID\" ]; then\n\
162
  echo \"✅ 找到待批准设备: \$REQUEST_ID,正在批准...\"\n\
@@ -172,19 +199,18 @@ chmod 600 \"\$DATA_DIR/openclaw.json\"\n\
172
  fi\n\
173
  done\n\
174
  ) &\n\
175
- # ===== 自动批准结束 =====\n\
176
  \n\
177
  # 启动 OpenClaw 网关\n\
178
  openclaw doctor --fix\n\
179
  exec openclaw gateway run --port \$PORT\n\
180
  " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
181
 
182
- # 9. 切换到 node 用户
183
  USER node
184
 
185
- # 10. 暴露端口
186
  EXPOSE 7860
187
 
188
- # 11. 使用 tini 作为 init 系统,启动入口脚本
189
  ENTRYPOINT ["/usr/bin/tini", "--"]
190
  CMD ["/usr/local/bin/start-openclaw"]
 
1
  # 核心镜像:Node 22 slim
2
  FROM node:22-slim
3
 
4
+ # 安装 tini 作为 init 系统
5
  RUN apt-get update && apt-get install -y --no-install-recommends tini \
6
  && rm -rf /var/lib/apt/lists/*
7
 
8
+ # 1. 安装系统依赖
9
  RUN apt-get update && apt-get install -y --no-install-recommends \
10
  git \
11
  openssh-client \
 
17
  ca-certificates \
18
  && rm -rf /var/lib/apt/lists/*
19
 
20
+ # 2. 安装 Hugging Face 命令行工具
21
  RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
22
 
23
  # 3. 更新 CA 证书
 
26
  # 4. 全局安装 OpenClaw
27
  RUN npm install -g openclaw@latest --unsafe-perm
28
 
29
+ # 5. 准备数据目录并设置权限
30
  RUN mkdir -p /home/node/.openclaw && \
31
  chown -R node:node /home/node/.openclaw
32
 
33
+ # 6. 设置环境变量
34
  ENV PORT=7860 \
35
  OPENCLAW_GATEWAY_MODE=local \
36
  HOME=/home/node
37
 
38
+ # 7. 核心同步引擎 (sync.py) - 优化备份逻辑
39
  RUN echo 'import os, sys, tarfile\n\
40
  from huggingface_hub import HfApi, hf_hub_download\n\
41
  from datetime import datetime, timedelta\n\
 
84
  tar.add(full_path, arcname=target)\n\
85
  api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
86
  print(f"--- [SYNC] 备份上传成功! ---")\n\
87
+ os.remove(name)\n\
88
  except Exception as e:\n\
89
  print(f"--- [SYNC] 备份失败: {e} ---")\n\
90
  \n\
 
95
  restore()\n\
96
  ' > /usr/local/bin/sync.py
97
 
98
+ # 8. 创建自定义入口页面(用于捕获 token引导至控制界面
99
+ RUN mkdir -p /home/node/.openclaw/static && \
100
+ echo '<!DOCTYPE html>\n\
101
+ <html>\n\
102
+ <head>\n\
103
+ <meta charset="utf-8">\n\
104
+ <title>OpenClaw 入口</title>\n\
105
+ <script>\n\
106
+ function getTokenFromHash() {\n\
107
+ const hash = window.location.hash.substring(1);\n\
108
+ const params = new URLSearchParams(hash);\n\
109
+ return params.get("token");\n\
110
+ }\n\
111
+ window.onload = function() {\n\
112
+ const token = getTokenFromHash();\n\
113
+ if (token) {\n\
114
+ console.log("Token found in hash. Redirecting to control UI...");\n\
115
+ localStorage.setItem("openclaw_token", token);\n\
116
+ window.location.href = "/__openclaw__/canvas/";\n\
117
+ } else {\n\
118
+ document.body.innerHTML = "<h2>错误:未找到 Token</h2>" +\n\
119
+ "<p>请在访问 URL 的末尾添加 <code>#token=您的密码</code>。</p>" +\n\
120
+ "<p>例如:<code>https://ted1990-openclaw.hf.space/static/index.html#token=7932657dc</code></p>";\n\
121
+ }\n\
122
+ };\n\
123
+ </script>\n\
124
+ </head>\n\
125
+ <body>\n\
126
+ <p>正在处理认证,请稍候...</p>\n\
127
+ </body>\n\
128
+ </html>' > /home/node/.openclaw/static/index.html && \
129
+ chown -R node:node /home/node/.openclaw/static
130
+
131
+ # 9. 容器入口脚本 (start-openclaw) - 包含自动批准和静态目录配置
132
  RUN echo "#!/bin/bash\n\
133
  set -e\n\
134
  \n\
 
138
  : \"\${MODEL:?环境变量 MODEL 未设置}\"\n\
139
  : \"\${OPENCLAW_GATEWAY_PASSWORD:?环境变量 OPENCLAW_GATEWAY_PASSWORD 未设置}\"\n\
140
  \n\
 
141
  DATA_DIR=\"\$HOME/.openclaw\"\n\
142
  mkdir -p \"\$DATA_DIR\"/{sessions,workspace}\n\
143
  \n\
 
144
  python3 /usr/local/bin/sync.py restore\n\
145
  \n\
 
146
  CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
147
  \n\
148
+ # 生成 openclaw.json 配置文件,加入静态目录和允许的来源\n\
 
149
  cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
150
  {\n\
151
  \"models\": {\n\
 
165
  \"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
166
  \"controlUi\": {\n\
167
  \"allowInsecureAuth\": true,\n\
168
+ \"allowedOrigins\": [\"https://ted1990-openclaw.hf.space\"],\n\
169
+ \"staticDir\": \"/home/node/.openclaw/static\"\n\
170
  }\n\
171
  }\n\
172
  }\n\
173
  EOF\n\
174
  \n\
 
175
  chmod 700 \"\$DATA_DIR\"\n\
176
  chmod 600 \"\$DATA_DIR/openclaw.json\"\n\
177
  \n\
178
+ # 启动定时备份进程\n\
179
  (while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\
180
  \n\
181
+ # 自动批准设备配对(轮询方式)\n\
 
182
  (\n\
183
  echo \"⏳ 等待网关启动并生成配对请求...\"\n\
184
  sleep 25\n\
185
  for i in {1..15}; do\n\
186
  echo \"尝试获取待批准设备列表 (第 \$i/15 次)...\"\n\
 
187
  REQUEST_ID=\$(openclaw devices list --json 2>/dev/null | grep -o '\"requestId\":\"[^\"]*\"' | head -1 | cut -d'\"' -f4)\n\
188
  if [ -n \"\$REQUEST_ID\" ]; then\n\
189
  echo \"✅ 找到待批准设备: \$REQUEST_ID,正在批准...\"\n\
 
199
  fi\n\
200
  done\n\
201
  ) &\n\
 
202
  \n\
203
  # 启动 OpenClaw 网关\n\
204
  openclaw doctor --fix\n\
205
  exec openclaw gateway run --port \$PORT\n\
206
  " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
207
 
208
+ # 10. 切换到 node 用户
209
  USER node
210
 
211
+ # 11. 暴露端口
212
  EXPOSE 7860
213
 
214
+ # 12. 使用 tini 启动
215
  ENTRYPOINT ["/usr/bin/tini", "--"]
216
  CMD ["/usr/local/bin/start-openclaw"]