Tea78 commited on
Commit
95f8d64
·
verified ·
1 Parent(s): 5096d62

Create Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +124 -0
Dockerfile ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 核心镜像选择
2
+ FROM node:22-slim
3
+
4
+ # 1. 基础依赖补全
5
+ RUN apt-get update && apt-get install -y --no-install-recommends \
6
+ git openssh-client build-essential python3 python3-pip \
7
+ g++ make ca-certificates \
8
+ && rm -rf /var/lib/apt/lists/*
9
+
10
+ # 2. 安装 HF 数据交互工具
11
+ RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
12
+
13
+ # 3. 构建环境与 Git 协议优化
14
+ RUN update-ca-certificates && \
15
+ git config --global http.sslVerify false && \
16
+ git config --global url."https://github.com/".insteadOf ssh://git@github.com/
17
+
18
+ # 4. OpenClaw 核心安装
19
+ RUN npm install -g openclaw@latest --unsafe-perm
20
+
21
+ # 5. 环境变量预设
22
+ ENV PORT=7860 \
23
+ OPENCLAW_GATEWAY_MODE=local \
24
+ HOME=/root
25
+
26
+ # 6. Python 同步引擎 (sync.py)
27
+ RUN echo 'import os, sys, tarfile\n\
28
+ from huggingface_hub import HfApi, hf_hub_download\n\
29
+ from datetime import datetime, timedelta\n\
30
+ api = HfApi()\n\
31
+ repo_id = os.getenv("HF_DATASET")\n\
32
+ token = os.getenv("HF_TOKEN")\n\
33
+ def restore():\n\
34
+ try:\n\
35
+ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)\n\
36
+ now = datetime.now()\n\
37
+ for i in range(5):\n\
38
+ day = (now - timedelta(days=i)).strftime("%Y-%m-%d")\n\
39
+ name = f"backup_{day}.tar.gz"\n\
40
+ if name in files:\n\
41
+ path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)\n\
42
+ with tarfile.open(path, "r:gz") as tar: tar.extractall(path="/root/.openclaw/")\n\
43
+ print(f"Success: Restored from {name}")\n\
44
+ return True\n\
45
+ except Exception as e: print(f"Restore Error: {e}")\n\
46
+ def backup():\n\
47
+ try:\n\
48
+ day = datetime.now().strftime("%Y-%m-%d")\n\
49
+ name = f"backup_{day}.tar.gz"\n\
50
+ with tarfile.open(name, "w:gz") as tar:\n\
51
+ if os.path.exists("/root/.openclaw/sessions"): tar.add("/root/.openclaw/sessions", arcname="sessions")\n\
52
+ tar.add("/root/.openclaw/openclaw.json", arcname="openclaw.json")\n\
53
+ api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)\n\
54
+ print(f"Backup {name} Success.")\n\
55
+ except Exception as e: print(f"Backup Error: {e}")\n\
56
+ if __name__ == "__main__":\n\
57
+ if len(sys.argv) > 1 and sys.argv[1] == "backup": backup()\n\
58
+ else: restore()' > /usr/local/bin/sync.py
59
+
60
+ # 7. 启动控制逻辑(NVIDIA 配置版)
61
+ RUN echo "#!/bin/bash\n\
62
+ set -e\n\
63
+ mkdir -p /root/.openclaw/sessions\n\
64
+ \n\
65
+ # 阶段 3: 执行启动前恢复\n\
66
+ python3 /usr/local/bin/sync.py restore\n\
67
+ \n\
68
+ # 处理地址逻辑\n\
69
+ CLEAN_BASE=\$(echo \"\$OPENAI_API_BASE\" | sed \"s|/chat/completions||g\" | sed \"s|/v1/|/v1|g\" | sed \"s|/v1\$|/v1|g\")\n\
70
+ \n\
71
+ # 阶段 2: 生成网关与模型配置(NVIDIA 版)\n\
72
+ cat > /root/.openclaw/openclaw.json <<EOF\n\
73
+ {\n\
74
+ \"models\": {\n\
75
+ \"providers\": {\n\
76
+ \"nvidia\": {\n\
77
+ \"baseUrl\": \"\$CLEAN_BASE\", \n\
78
+ \"apiKey\": \"\$OPENAI_API_KEY\", \n\
79
+ \"api\": \"openai-completions\",\n\
80
+ \"models\": [{ \n\
81
+ \"id\": \"\$MODEL\", \n\
82
+ \"name\": \"Kimi K2.5\", \n\
83
+ \"contextWindow\": 256000 \n\
84
+ }]\n\
85
+ }\n\
86
+ }\n\
87
+ },\n\
88
+ \"agents\": { \n\
89
+ \"defaults\": { \n\
90
+ \"model\": { \n\
91
+ \"primary\": \"nvidia/\$MODEL\" \n\
92
+ } \n\
93
+ } \n\
94
+ },\n\
95
+ \"gateway\": {\n\
96
+ \"mode\": \"local\", \n\
97
+ \"bind\": \"lan\", \n\
98
+ \"port\": \$PORT,\n\
99
+ \"trustedProxies\": [\"0.0.0.0/0\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"],\n\
100
+ \"auth\": { \n\
101
+ \"mode\": \"token\", \n\
102
+ \"token\": \"\$OPENCLAW_GATEWAY_TOKEN\" \n\
103
+ },\n\
104
+ \"remote\": { \n\
105
+ \"token\": \"\$OPENCLAW_GATEWAY_TOKEN\" \n\
106
+ },\n\
107
+ \"controlUi\": { \n\
108
+ \"allowInsecureAuth\": true,\n\
109
+ \"dangerouslyAllowHostHeaderOriginFallback\": true,\n\
110
+ \"dangerouslyDisableDeviceAuth\": true \n\
111
+ }\n\
112
+ }\n\
113
+ }\n\
114
+ EOF\n\
115
+ \n\
116
+ # 增量备份循环 (每 6 小时)\n\
117
+ (while true; do sleep 21600; python3 /usr/local/bin/sync.py backup; done) &\n\
118
+ \n\
119
+ openclaw doctor --fix\n\
120
+ exec openclaw gateway run --port \$PORT\n\
121
+ " > /usr/local/bin/start-openclaw && chmod +x /usr/local/bin/start-openclaw
122
+
123
+ EXPOSE 7860
124
+ CMD ["/usr/local/bin/start-openclaw"]