Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +16 -21
Dockerfile
CHANGED
|
@@ -24,7 +24,7 @@ ENV TZ=Asia/Shanghai \
|
|
| 24 |
OPENCLAW_TRUST_PROXY=true \
|
| 25 |
NODE_ENV=production
|
| 26 |
|
| 27 |
-
# 5. 同步引擎 (
|
| 28 |
RUN echo 'import os, sys, tarfile, time\n\
|
| 29 |
from huggingface_hub import HfApi, hf_hub_download\n\
|
| 30 |
from datetime import datetime, timedelta\n\
|
|
@@ -40,52 +40,49 @@ def restore():\n\
|
|
| 40 |
now = datetime.now()\n\
|
| 41 |
for i in range(5):\n\
|
| 42 |
day = (now - timedelta(days=i)).strftime("%Y-%m-%d")\n\
|
| 43 |
-
name =
|
| 44 |
if name in files:\n\
|
| 45 |
path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)\n\
|
| 46 |
with tarfile.open(path, "r:gz") as tar: tar.extractall(path=base_dir)\n\
|
| 47 |
-
print(
|
| 48 |
return True\n\
|
| 49 |
-
except Exception as e: print(
|
| 50 |
\n\
|
| 51 |
def backup():\n\
|
| 52 |
if not repo_id or not token: return\n\
|
| 53 |
try:\n\
|
| 54 |
target_dir = "/root/.openclaw"\n\
|
| 55 |
if not os.path.exists(target_dir): return\n\
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
|
|
|
| 59 |
if os.path.exists(name): os.remove(name)\n\
|
| 60 |
-
|
|
|
|
| 61 |
\n\
|
| 62 |
if __name__ == "__main__":\n\
|
| 63 |
if len(sys.argv) > 1 and sys.argv[1] == "backup": backup()\n\
|
| 64 |
else: restore()' > /usr/local/bin/sync.py
|
| 65 |
|
| 66 |
-
# 6. 最终启动脚本
|
| 67 |
RUN echo "#!/bin/bash\n\
|
| 68 |
set -e\n\
|
| 69 |
-
\n\
|
| 70 |
-
# 环境与目录准备\n\
|
| 71 |
mkdir -p /root/.openclaw\n\
|
| 72 |
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\
|
| 73 |
\n\
|
| 74 |
-
# 恢复备份并强制清理残留锁\n\
|
| 75 |
python3 /usr/local/bin/sync.py restore\n\
|
| 76 |
find /root/.openclaw -name \"*.lock\" -delete\n\
|
| 77 |
chmod 700 /root/.openclaw\n\
|
| 78 |
\n\
|
| 79 |
-
# 动态计算 API BASE\n\
|
| 80 |
CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\")\n\
|
| 81 |
\n\
|
| 82 |
-
# 生成配置 (保持你提供的 customBind 逻辑,这是 2.26 版本的标准解)\n\
|
| 83 |
cat > /root/.openclaw/openclaw.json <<EOF\n\
|
| 84 |
{\n\
|
| 85 |
\"models\": { \"providers\": { \"siliconflow\": { \"baseUrl\": \"\$CLEAN_BASE\", \"apiKey\": \"\$OPENAI_API_KEY\", \"api\": \"openai-completions\", \"models\": [{ \"id\": \"\$MODEL\", \"name\": \"DeepSeek\", \"contextWindow\": 128000 }] } } },\n\
|
| 86 |
\"agents\": { \"defaults\": { \"model\": { \"primary\": \"siliconflow/\$MODEL\" } } },\n\
|
| 87 |
\"gateway\": {\n\
|
| 88 |
-
\"mode\": \"local\", \"port\":
|
| 89 |
\"trustedProxies\": [\"10.0.0.0/8\"],\n\
|
| 90 |
\"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
|
| 91 |
\"controlUi\": { \"enabled\": true, \"allowInsecureAuth\": true, \"dangerouslyDisableDeviceAuth\": true, \"dangerouslyAllowHostHeaderOriginFallback\": true },\n\
|
|
@@ -94,15 +91,13 @@ cat > /root/.openclaw/openclaw.json <<EOF\n\
|
|
| 94 |
}\n\
|
| 95 |
EOF\n\
|
| 96 |
\n\
|
| 97 |
-
# 后台备份任务 (30分钟一次)\n\
|
| 98 |
(while true; do sleep 1800; python3 /usr/local/bin/sync.py backup; done) &\n\
|
| 99 |
\n\
|
| 100 |
-
# 健康检查哨兵:解决 HF Starting 状态卡死\n\
|
| 101 |
-
# 如果 7860 还没被 OpenClaw 占用,则临时启动一个 HTTP 服务响应 HF 探针\n\
|
| 102 |
-
(while ! ss -lnt | grep -q :\$PORT; do sleep 2; done; echo \"--- [System] ✅ 端口 \$PORT 已激活 ---\") &\n\
|
| 103 |
-
\n\
|
| 104 |
echo \"--- [System] 🚀 正在启动 OpenClaw Gateway... ---\"\n\
|
| 105 |
-
|
|
|
|
|
|
|
|
|
|
| 106 |
" > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
|
| 107 |
|
| 108 |
EXPOSE 7860
|
|
|
|
| 24 |
OPENCLAW_TRUST_PROXY=true \
|
| 25 |
NODE_ENV=production
|
| 26 |
|
| 27 |
+
# 5. 同步引擎 (修复了 Python 嵌套转义导致的 SyntaxError)
|
| 28 |
RUN echo 'import os, sys, tarfile, time\n\
|
| 29 |
from huggingface_hub import HfApi, hf_hub_download\n\
|
| 30 |
from datetime import datetime, timedelta\n\
|
|
|
|
| 40 |
now = datetime.now()\n\
|
| 41 |
for i in range(5):\n\
|
| 42 |
day = (now - timedelta(days=i)).strftime("%Y-%m-%d")\n\
|
| 43 |
+
name = "backup_" + day + ".tar.gz"\n\
|
| 44 |
if name in files:\n\
|
| 45 |
path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)\n\
|
| 46 |
with tarfile.open(path, "r:gz") as tar: tar.extractall(path=base_dir)\n\
|
| 47 |
+
print("--- [Sync] ✅ 恢复成功: " + day + " ---")\n\
|
| 48 |
return True\n\
|
| 49 |
+
except Exception as e: print("--- [Sync] ❌ 恢复失败: " + str(e))\n\
|
| 50 |
\n\
|
| 51 |
def backup():\n\
|
| 52 |
if not repo_id or not token: return\n\
|
| 53 |
try:\n\
|
| 54 |
target_dir = "/root/.openclaw"\n\
|
| 55 |
if not os.path.exists(target_dir): return\n\
|
| 56 |
+
day_str = datetime.now().strftime("%Y-%m-%d")\n\
|
| 57 |
+
name = "backup_" + day_str + ".tar.gz"\n\
|
| 58 |
+
with tarfile.open(name, "w:gz") as tar: tar.add(target_dir, arcname=".openclaw")\n\
|
| 59 |
+
api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
|
| 60 |
if os.path.exists(name): os.remove(name)\n\
|
| 61 |
+
print("--- [Sync] ✨ 备份完成: " + name + " ---")\n\
|
| 62 |
+
except Exception as e: print("--- [Sync] ❌ 备份失败: " + str(e))\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 |
+
# 6. 最终启动脚本 (保持你的 Gateway 配置,移除了打印)
|
| 69 |
RUN echo "#!/bin/bash\n\
|
| 70 |
set -e\n\
|
|
|
|
|
|
|
| 71 |
mkdir -p /root/.openclaw\n\
|
| 72 |
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\
|
| 73 |
\n\
|
|
|
|
| 74 |
python3 /usr/local/bin/sync.py restore\n\
|
| 75 |
find /root/.openclaw -name \"*.lock\" -delete\n\
|
| 76 |
chmod 700 /root/.openclaw\n\
|
| 77 |
\n\
|
|
|
|
| 78 |
CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\")\n\
|
| 79 |
\n\
|
|
|
|
| 80 |
cat > /root/.openclaw/openclaw.json <<EOF\n\
|
| 81 |
{\n\
|
| 82 |
\"models\": { \"providers\": { \"siliconflow\": { \"baseUrl\": \"\$CLEAN_BASE\", \"apiKey\": \"\$OPENAI_API_KEY\", \"api\": \"openai-completions\", \"models\": [{ \"id\": \"\$MODEL\", \"name\": \"DeepSeek\", \"contextWindow\": 128000 }] } } },\n\
|
| 83 |
\"agents\": { \"defaults\": { \"model\": { \"primary\": \"siliconflow/\$MODEL\" } } },\n\
|
| 84 |
\"gateway\": {\n\
|
| 85 |
+
\"mode\": \"local\", \"port\": 7860, \"bind\": \"custom\", \"customBindHost\": \"0.0.0.0\",\n\
|
| 86 |
\"trustedProxies\": [\"10.0.0.0/8\"],\n\
|
| 87 |
\"auth\": { \"mode\": \"token\", \"token\": \"\$OPENCLAW_GATEWAY_PASSWORD\" },\n\
|
| 88 |
\"controlUi\": { \"enabled\": true, \"allowInsecureAuth\": true, \"dangerouslyDisableDeviceAuth\": true, \"dangerouslyAllowHostHeaderOriginFallback\": true },\n\
|
|
|
|
| 91 |
}\n\
|
| 92 |
EOF\n\
|
| 93 |
\n\
|
|
|
|
| 94 |
(while true; do sleep 1800; python3 /usr/local/bin/sync.py backup; done) &\n\
|
| 95 |
\n\
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
echo \"--- [System] 🚀 正在启动 OpenClaw Gateway... ---\"\n\
|
| 97 |
+
export NODE_ENV=production\n\
|
| 98 |
+
export OPENCLAW_TRUST_PROXY=true\n\
|
| 99 |
+
\n\
|
| 100 |
+
exec openclaw gateway run --port 7860\n\
|
| 101 |
" > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
|
| 102 |
|
| 103 |
EXPOSE 7860
|