kyle-ai commited on
Commit
0a56da9
·
verified ·
1 Parent(s): 47ad3e5

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +33 -35
Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- # 核心镜像:Node 22 slim
2
  FROM node:22-slim
3
 
4
  # 1. 安装系统依赖
@@ -20,16 +20,16 @@ RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
20
 
21
  # --- OpenClaw 安装逻辑 ---
22
  ARG OPENCLAW_VERSION=2026.2.17
23
- ARG CACHEBUST=30
24
  RUN npm install -g openclaw@${OPENCLAW_VERSION} --registry=https://registry.npmjs.org/ --unsafe-perm=true --foreground-scripts && npm cache clean --force
25
 
26
- # 5. 设置核心环境变量
27
  ENV PORT=7860 \
28
  HOME=/root \
29
  VSCODE_CLI_DISABLE_KEYCHAIN_ENCRYPTION=true
30
 
31
- # 6. 同步引擎 (精准备份 .vscode 目录)
32
- RUN echo 'import os, sys, tarfile, shutil\n\
33
  from huggingface_hub import HfApi, hf_hub_download\n\
34
  from datetime import datetime, timedelta\n\
35
  api = HfApi()\n\
@@ -47,61 +47,61 @@ def restore():\n\
47
  name = f"backup_{day}.tar.gz"\n\
48
  if name in files:\n\
49
  path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)\n\
50
- # 还原到根目录以匹配绝对路径\n\
51
- with tarfile.open(path, "r:gz") as tar: tar.extractall(path="/")\n\
52
- print(f"--- [SYNC] 还原成功: {name} ---")\n\
53
  return True\n\
54
- except Exception as e: print(f"--- [SYNC] 还原异常: {e} ---")\n\
55
  \n\
56
  def backup():\n\
57
  try:\n\
58
  if not repo_id or not token: return\n\
59
  day = datetime.now().strftime("%Y-%m-%d")\n\
60
  name = f"backup_{day}.tar.gz"\n\
61
- # 重点:加入截图显示的 .vscode 目录\n\
62
- save_list = ["/root/.openclaw", "/root/.vscode"]\n\
63
- found = False\n\
64
  with tarfile.open(name, "w:gz") as tar:\n\
65
- for p in save_list:\n\
66
- if os.path.exists(p):\n\
67
- print(f"--- [SYNC] 打包目录: {p} ---")\n\
68
- tar.add(p, arcname=os.path.relpath(p, "/"))\n\
69
- found = True\n\
70
- if found:\n\
71
- api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
72
- print("--- [SYNC] 包含 VSCode 凭证的备份已完成 ---")\n\
73
- except Exception as e: print(f"--- [SYNC] 备份失败: {e} ---")\n\
74
  \n\
75
  if __name__ == "__main__":\n\
76
  if len(sys.argv) > 1 and sys.argv[1] == "backup": backup()\n\
77
  else: restore()' > /usr/local/bin/sync.py
78
 
79
- # 7. 入口脚本
80
  RUN echo "#!/bin/bash\n\
81
  set -e\n\
82
- mkdir -p /root/.openclaw /root/.vscode\n\
 
83
  \n\
84
- # 固定机器 ID (双保险)\n\
85
- mkdir -p /etc && echo \"hf-fixed-v4-final\" > /etc/machine-id 2>/dev/null || true\n\
 
 
86
  \n\
87
- # 1. 还原备份\n\
88
- python3 /usr/local/bin/sync.py restore\n\
89
  \n\
90
- # 2. 启动 VS Code Tunnel\n\
91
- # 显式禁用加密,确保 token.json 以明文保存在你截图的那个目录下\n\
92
  export VSCODE_CLI_DISABLE_KEYCHAIN_ENCRYPTION=true\n\
93
  T_NAME=\${VSCODE_TUNNEL_NAME:-kyle-space}\n\
94
  \n\
95
  if [ -n \"\$VS_CODE_TUNNEL_ACCESS_TOKEN\" ]; then\n\
96
- export VS_CODE_TUNNEL_ACCESS_TOKEN=\"\$VS_CODE_TUNNEL_ACCESS_TOKEN\"\n\
 
97
  nohup code tunnel --accept-server-license-terms --name \"\$T_NAME\" --no-sleep > /tmp/vscode.log 2>&1 &\n\
 
 
 
 
 
 
 
 
98
  else\n\
 
99
  code tunnel --accept-server-license-terms --name \"\$T_NAME\" --no-sleep > /tmp/vscode.log 2>&1 &\n\
100
  fi\n\
101
  \n\
102
- (sleep 10; grep -q \"github.com/login/device\" /tmp/vscode.log && grep \"github.com/login/device\" /tmp/vscode.log || echo \"--- [VSCode] 隧道检测完毕 --- \") &\n\
103
- \n\
104
- # 3. OpenClaw 配置\n\
105
  CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\")\n\
106
  cat > /root/.openclaw/openclaw.json <<EOF\n\
107
  {\n\
@@ -111,9 +111,7 @@ cat > /root/.openclaw/openclaw.json <<EOF\n\
111
  }\n\
112
  EOF\n\
113
  \n\
114
- # 4. 自动备份\n\
115
  (while true; do sleep 1800; python3 /usr/local/bin/sync.py backup; done) &\n\
116
- \n\
117
  openclaw doctor --fix\n\
118
  exec openclaw gateway run --port \$PORT\n\
119
  " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
 
1
+ # 核心镜像
2
  FROM node:22-slim
3
 
4
  # 1. 安装系统依赖
 
20
 
21
  # --- OpenClaw 安装逻辑 ---
22
  ARG OPENCLAW_VERSION=2026.2.17
23
+ ARG CACHEBUST=35
24
  RUN npm install -g openclaw@${OPENCLAW_VERSION} --registry=https://registry.npmjs.org/ --unsafe-perm=true --foreground-scripts && npm cache clean --force
25
 
26
+ # 5. 设置环境变量
27
  ENV PORT=7860 \
28
  HOME=/root \
29
  VSCODE_CLI_DISABLE_KEYCHAIN_ENCRYPTION=true
30
 
31
+ # 6. 同步引擎 (仅负责业务数据,不再备份 VSCode 凭证防止干扰)
32
+ RUN echo 'import os, sys, tarfile\n\
33
  from huggingface_hub import HfApi, hf_hub_download\n\
34
  from datetime import datetime, timedelta\n\
35
  api = HfApi()\n\
 
47
  name = f"backup_{day}.tar.gz"\n\
48
  if name in files:\n\
49
  path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)\n\
50
+ with tarfile.open(path, "r:gz") as tar: tar.extractall(path=base_dir)\n\
 
 
51
  return True\n\
52
+ except Exception as e: print(f"恢复失败: {e}")\n\
53
  \n\
54
  def backup():\n\
55
  try:\n\
56
  if not repo_id or not token: return\n\
57
  day = datetime.now().strftime("%Y-%m-%d")\n\
58
  name = f"backup_{day}.tar.gz"\n\
 
 
 
59
  with tarfile.open(name, "w:gz") as tar:\n\
60
+ if os.path.exists("/root/.openclaw"): tar.add("/root/.openclaw", arcname=".openclaw")\n\
61
+ api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
62
+ except Exception as e: print(f"备份成功")\n\
 
 
 
 
 
 
63
  \n\
64
  if __name__ == "__main__":\n\
65
  if len(sys.argv) > 1 and sys.argv[1] == "backup": backup()\n\
66
  else: restore()' > /usr/local/bin/sync.py
67
 
68
+ # 7. 终极启动脚本
69
  RUN echo "#!/bin/bash\n\
70
  set -e\n\
71
+ mkdir -p /root/.openclaw /root/.vscode/cli\n\
72
+ python3 /usr/local/bin/sync.py restore\n\
73
  \n\
74
+ # --- 彻底重置 VSCode 状态,强制其读取 Token ---\n\
75
+ echo \"--- [VSCode] 清理旧凭证干扰... ---\"\n\
76
+ find /root/.vscode/cli -name \"token.json\" -delete 2>/dev/null || true\n\
77
+ find /root/.vscode/cli -name \"*.lock\" -delete 2>/dev/null || true\n\
78
  \n\
79
+ # 固定机器 ID\n\
80
+ mkdir -p /etc && echo \"hf-permanent-id-v6\" > /etc/machine-id 2>/dev/null || true\n\
81
  \n\
82
+ # 确保环境变量正确导出\n\
83
+ export VS_CODE_TUNNEL_ACCESS_TOKEN=\"\$VS_CODE_TUNNEL_ACCESS_TOKEN\"\n\
84
  export VSCODE_CLI_DISABLE_KEYCHAIN_ENCRYPTION=true\n\
85
  T_NAME=\${VSCODE_TUNNEL_NAME:-kyle-space}\n\
86
  \n\
87
  if [ -n \"\$VS_CODE_TUNNEL_ACCESS_TOKEN\" ]; then\n\
88
+ echo \"--- [VSCode] 正在通过环境变量启动隧道: \$T_NAME ---\"\n\
89
+ # 使用 nohup 彻底脱离控制台\n\
90
  nohup code tunnel --accept-server-license-terms --name \"\$T_NAME\" --no-sleep > /tmp/vscode.log 2>&1 &\n\
91
+ \n\
92
+ (sleep 12; \n\
93
+ if grep -q \"github.com/login/device\" /tmp/vscode.log; then \n\
94
+ echo \"--- [VSCode] ❌ Token 注入失败,GitHub 要求手动验证: ---\"; \n\
95
+ grep \"github.com/login/device\" /tmp/vscode.log; \n\
96
+ else\n\
97
+ echo \"--- [VSCode] ✅ 恭喜!Token 验证通过,隧道已静默上线! ---\"; \n\
98
+ fi) &\n\
99
  else\n\
100
+ echo \"--- [VSCode] 未发现 Token,启动扫码模式 ---\"\n\
101
  code tunnel --accept-server-license-terms --name \"\$T_NAME\" --no-sleep > /tmp/vscode.log 2>&1 &\n\
102
  fi\n\
103
  \n\
104
+ # OpenClaw 启动逻辑\n\
 
 
105
  CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\")\n\
106
  cat > /root/.openclaw/openclaw.json <<EOF\n\
107
  {\n\
 
111
  }\n\
112
  EOF\n\
113
  \n\
 
114
  (while true; do sleep 1800; python3 /usr/local/bin/sync.py backup; done) &\n\
 
115
  openclaw doctor --fix\n\
116
  exec openclaw gateway run --port \$PORT\n\
117
  " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw