ted1990 commited on
Commit
21effef
·
verified ·
1 Parent(s): 90a49b0

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +36 -34
Dockerfile CHANGED
@@ -1,41 +1,26 @@
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 \
12
- build-essential \
13
- python3 \
14
- python3-pip \
15
- g++ \
16
- make \
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 证书
24
  RUN update-ca-certificates
25
 
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\
@@ -69,7 +54,7 @@ def restore():\n\
69
  \n\
70
  def backup():\n\
71
  try:\n\
72
- targets = ["sessions", "workspace", "agents", "memory", "openclaw.json"]\n\
73
  existing = [t for t in targets if os.path.exists(os.path.join(DATA_DIR, t))]\n\
74
  if not existing:\n\
75
  print("--- [SYNC] 没有需要备份的数据,跳过备份 ---")\n\
@@ -94,7 +79,7 @@ if __name__ == "__main__":\n\
94
  restore()\n\
95
  ' > /usr/local/bin/sync.py
96
 
97
- # 8. 容器入口脚本
98
  RUN printf '#!/bin/bash\nset -e\n\n\
99
  : "${OPENAI_API_BASE:?OPENAI_API_BASE not set}"\n\
100
  : "${OPENAI_API_KEY:?OPENAI_API_KEY not set}"\n\
@@ -102,16 +87,16 @@ RUN printf '#!/bin/bash\nset -e\n\n\
102
  : "${OPENCLAW_GATEWAY_PASSWORD:?OPENCLAW_GATEWAY_PASSWORD not set}"\n\n\
103
  DATA_DIR="$HOME/.openclaw"\n\
104
  mkdir -p "$DATA_DIR"/{sessions,workspace,agents/main/sessions}\n\n\
105
- # ⚠️ 关键:先恢复备份(仅恢复 sessions/workspace/agents,不恢复 openclaw.json)\n\
106
  python3 /usr/local/bin/sync.py restore\n\n\
107
- # ⚠️ 关键:无论备份是否含旧配置,都强制用环境变量新生成 openclaw.json\n\
108
- CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1/|/v1|g" | sed "s|/v1$|/v1|g")\n\n\
 
109
  cat > "$DATA_DIR/openclaw.json" <<JSON\n\
110
  {\n\
111
  "models": {\n\
112
  "providers": {\n\
113
  "openai-compat": {\n\
114
- "baseUrl": "$CLEAN_BASE",\n\
115
  "apiKey": "$OPENAI_API_KEY",\n\
116
  "api": "openai-completions",\n\
117
  "models": [{ "id": "$MODEL", "name": "Model", "contextWindow": 128000 }]\n\
@@ -120,12 +105,21 @@ cat > "$DATA_DIR/openclaw.json" <<JSON\n\
120
  },\n\
121
  "agents": { "defaults": { "model": { "primary": "openai-compat/$MODEL" } } },\n\
122
  "gateway": {\n\
123
- "mode": "local", "bind": "lan", "port": $PORT,\n\
 
 
124
  "trustedProxies": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],\n\
125
- "auth": { "mode": "token", "token": "$OPENCLAW_GATEWAY_PASSWORD" },\n\
 
 
 
126
  "controlUi": {\n\
127
  "allowInsecureAuth": true,\n\
128
- "allowedOrigins": ["https://ted1990-openclaw.hf.space"]\n\
 
 
 
 
129
  }\n\
130
  }\n\
131
  }\n\
@@ -134,12 +128,25 @@ chmod 700 "$DATA_DIR"\n\
134
  chmod 600 "$DATA_DIR/openclaw.json"\n\n\
135
  echo ""\n\
136
  echo "--- [CONFIG] openclaw.json 已生成 ---"\n\
137
- echo "--- [CONFIG] API Base: $CLEAN_BASE ---"\n\
138
  echo "--- [CONFIG] Model: $MODEL ---"\n\
139
  echo ""\n\n\
 
140
  (while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\n\
 
141
  (\n\
142
- sleep 8\n\
 
 
 
 
 
 
 
 
 
 
 
143
  echo ""\n\
144
  echo "================================================="\n\
145
  echo "✅ OpenClaw 已就绪!请使用以下完整 URL 访问:"\n\
@@ -148,12 +155,7 @@ echo ""\n\n\
148
  ) &\n\n\
149
  exec openclaw gateway run --port $PORT\n' > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
150
 
151
- # 9. 切换到 node 用户
152
  USER node
153
-
154
- # 10. 暴露端口
155
  EXPOSE 7860
156
-
157
- # 11. 使用 tini 启动
158
  ENTRYPOINT ["/usr/bin/tini", "--"]
159
  CMD ["/usr/local/bin/start-openclaw"]
 
1
  # 核心镜像:Node 22 slim
2
  FROM node:22-slim
3
 
 
4
  RUN apt-get update && apt-get install -y --no-install-recommends tini \
5
  && rm -rf /var/lib/apt/lists/*
6
 
 
7
  RUN apt-get update && apt-get install -y --no-install-recommends \
8
+ git openssh-client build-essential python3 python3-pip g++ make ca-certificates \
 
 
 
 
 
 
 
9
  && rm -rf /var/lib/apt/lists/*
10
 
 
11
  RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
12
 
 
13
  RUN update-ca-certificates
14
 
 
15
  RUN npm install -g openclaw@latest --unsafe-perm
16
 
17
+ RUN mkdir -p /home/node/.openclaw && chown -R node:node /home/node/.openclaw
 
 
18
 
 
19
  ENV PORT=7860 \
20
  OPENCLAW_GATEWAY_MODE=local \
21
  HOME=/home/node
22
 
23
+ # sync.py
24
  RUN echo 'import os, sys, tarfile\n\
25
  from huggingface_hub import HfApi, hf_hub_download\n\
26
  from datetime import datetime, timedelta\n\
 
54
  \n\
55
  def backup():\n\
56
  try:\n\
57
+ targets = ["sessions", "workspace", "agents", "memory"]\n\
58
  existing = [t for t in targets if os.path.exists(os.path.join(DATA_DIR, t))]\n\
59
  if not existing:\n\
60
  print("--- [SYNC] 没有需要备份的数据,跳过备份 ---")\n\
 
79
  restore()\n\
80
  ' > /usr/local/bin/sync.py
81
 
82
+ # 入口脚本
83
  RUN printf '#!/bin/bash\nset -e\n\n\
84
  : "${OPENAI_API_BASE:?OPENAI_API_BASE not set}"\n\
85
  : "${OPENAI_API_KEY:?OPENAI_API_KEY not set}"\n\
 
87
  : "${OPENCLAW_GATEWAY_PASSWORD:?OPENCLAW_GATEWAY_PASSWORD not set}"\n\n\
88
  DATA_DIR="$HOME/.openclaw"\n\
89
  mkdir -p "$DATA_DIR"/{sessions,workspace,agents/main/sessions}\n\n\
 
90
  python3 /usr/local/bin/sync.py restore\n\n\
91
+ # 备份恢复后强制重 openclaw.json,防止旧配置污染\n\
92
+ CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1beta/openai.*||g" | sed "s|/v1/||g" | sed "s|/v1$||g")\n\n\
93
+ # 关键:把 GATEWAY_TOKEN 写入配置,让网关启动时就信任已知设备\n\
94
  cat > "$DATA_DIR/openclaw.json" <<JSON\n\
95
  {\n\
96
  "models": {\n\
97
  "providers": {\n\
98
  "openai-compat": {\n\
99
+ "baseUrl": "$OPENAI_API_BASE",\n\
100
  "apiKey": "$OPENAI_API_KEY",\n\
101
  "api": "openai-completions",\n\
102
  "models": [{ "id": "$MODEL", "name": "Model", "contextWindow": 128000 }]\n\
 
105
  },\n\
106
  "agents": { "defaults": { "model": { "primary": "openai-compat/$MODEL" } } },\n\
107
  "gateway": {\n\
108
+ "mode": "local",\n\
109
+ "bind": "lan",\n\
110
+ "port": $PORT,\n\
111
  "trustedProxies": ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"],\n\
112
+ "auth": {\n\
113
+ "mode": "token",\n\
114
+ "token": "$OPENCLAW_GATEWAY_PASSWORD"\n\
115
+ },\n\
116
  "controlUi": {\n\
117
  "allowInsecureAuth": true,\n\
118
+ "allowedOrigins": ["https://ted1990-openclaw.hf.space"],\n\
119
+ "gatewayToken": "$OPENCLAW_GATEWAY_PASSWORD"\n\
120
+ },\n\
121
+ "pairing": {\n\
122
+ "autoApprove": true\n\
123
  }\n\
124
  }\n\
125
  }\n\
 
128
  chmod 600 "$DATA_DIR/openclaw.json"\n\n\
129
  echo ""\n\
130
  echo "--- [CONFIG] openclaw.json 已生成 ---"\n\
131
+ echo "--- [CONFIG] API Base: $OPENAI_API_BASE ---"\n\
132
  echo "--- [CONFIG] Model: $MODEL ---"\n\
133
  echo ""\n\n\
134
+ # 定时备份(注意备份列表已排除 openclaw.json)\n\
135
  (while true; do sleep 10800; python3 /usr/local/bin/sync.py backup; done) &\n\n\
136
+ # 自动批准配对请求(兜底方案)\n\
137
  (\n\
138
+ sleep 15\n\
139
+ for i in $(seq 1 20); do\n\
140
+ REQUEST_ID=$(openclaw devices list --json 2>/dev/null | python3 -c "import sys,json; data=json.load(sys.stdin); reqs=[d.get('"'"'requestId'"'"',...) for d in data if d.get('"'"'status'"'"')=='"'"'pending'"'"']; print(reqs[0] if reqs else '"'"''"'"')" 2>/dev/null || true)\n\
141
+ if [ -n "$REQUEST_ID" ] && [ "$REQUEST_ID" != "None" ]; then\n\
142
+ echo "✅ 正在批准设备: $REQUEST_ID"\n\
143
+ openclaw devices approve "$REQUEST_ID" && break\n\
144
+ fi\n\
145
+ sleep 3\n\
146
+ done\n\
147
+ ) &\n\n\
148
+ (\n\
149
+ sleep 10\n\
150
  echo ""\n\
151
  echo "================================================="\n\
152
  echo "✅ OpenClaw 已就绪!请使用以下完整 URL 访问:"\n\
 
155
  ) &\n\n\
156
  exec openclaw gateway run --port $PORT\n' > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
157
 
 
158
  USER node
 
 
159
  EXPOSE 7860
 
 
160
  ENTRYPOINT ["/usr/bin/tini", "--"]
161
  CMD ["/usr/local/bin/start-openclaw"]