Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +33 -35
Dockerfile
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
# 核心镜像
|
| 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=
|
| 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. 同步引擎 (
|
| 32 |
-
RUN echo 'import os, sys, tarfile
|
| 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 |
-
|
| 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"
|
| 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 |
-
|
| 66 |
-
|
| 67 |
-
|
| 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 |
-
#
|
| 85 |
-
|
|
|
|
|
|
|
| 86 |
\n\
|
| 87 |
-
#
|
| 88 |
-
|
| 89 |
\n\
|
| 90 |
-
#
|
| 91 |
-
|
| 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 |
-
|
|
|
|
| 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 |
-
|
| 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
|