ted1990 commited on
Commit
336153d
·
verified ·
1 Parent(s): 91747fb

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +22 -10
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 用户)
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,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,22 +95,28 @@ 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\
 
102
  : \"\${OPENAI_API_BASE:?环境变量 OPENAI_API_BASE 未设置}\"\n\
103
  : \"\${OPENAI_API_KEY:?环境变量 OPENAI_API_KEY 未设置}\"\n\
104
  : \"\${MODEL:?环境变量 MODEL 未设置}\"\n\
105
  : \"\${OPENCLAW_GATEWAY_PASSWORD:?环境变量 OPENCLAW_GATEWAY_PASSWORD 未设置}\"\n\
106
  \n\
 
107
  DATA_DIR=\"\$HOME/.openclaw\"\n\
108
  mkdir -p \"\$DATA_DIR\"/{sessions,workspace}\n\
109
  \n\
 
110
  python3 /usr/local/bin/sync.py restore\n\
111
  \n\
 
112
  CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
113
  \n\
 
 
114
  cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
115
  {\n\
116
  \"models\": {\n\
@@ -128,16 +134,22 @@ cat > \"\$DATA_DIR/openclaw.json\" <<EOF\n\
128
  \"mode\": \"local\", \"bind\": \"lan\", \"port\": \$PORT,\n\
129
  \"trustedProxies\": [\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\n\
130
  \"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
131
- \"controlUi\": { \"allowInsecureAuth\": true }\n\
 
 
 
132
  }\n\
133
  }\n\
134
  EOF\n\
135
  \n\
 
136
  chmod 700 \"\$DATA_DIR\"\n\
137
  chmod 600 \"\$DATA_DIR/openclaw.json\"\n\
138
  \n\
 
139
  (while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\
140
  \n\
 
141
  openclaw doctor --fix\n\
142
  exec openclaw gateway run --port \$PORT\n\
143
  " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
@@ -148,6 +160,6 @@ USER node
148
  # 10. 暴露端口
149
  EXPOSE 7860
150
 
151
- # 11. 使用 tini 启动
152
  ENTRYPOINT ["/usr/bin/tini", "--"]
153
  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. 准备数据目录并设置权限(使用 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
  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. 容器入口脚本 (start-openclaw) - 增强健壮性,并添加 allowedOrigins 配置
99
  RUN echo "#!/bin/bash\n\
100
  set -e\n\
101
  \n\
102
+ # 强制检查必要环境变量\n\
103
  : \"\${OPENAI_API_BASE:?环境变量 OPENAI_API_BASE 未设置}\"\n\
104
  : \"\${OPENAI_API_KEY:?环境变量 OPENAI_API_KEY 未设置}\"\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\
 
134
  \"mode\": \"local\", \"bind\": \"lan\", \"port\": \$PORT,\n\
135
  \"trustedProxies\": [\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\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
+ # 启动 OpenClaw 网关\n\
153
  openclaw doctor --fix\n\
154
  exec openclaw gateway run --port \$PORT\n\
155
  " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
 
160
  # 10. 暴露端口
161
  EXPOSE 7860
162
 
163
+ # 11. 使用 tini 作为 init 系统,启动入口脚本
164
  ENTRYPOINT ["/usr/bin/tini", "--"]
165
  CMD ["/usr/local/bin/start-openclaw"]