quinnz commited on
Commit
c8a0246
·
verified ·
1 Parent(s): c5a2e7d

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +198 -22
Dockerfile CHANGED
@@ -1,34 +1,210 @@
 
1
  FROM node:22-slim
2
 
3
- # ---------------------------
4
- # 系统依赖
5
- # ---------------------------
6
- RUN apt-get update && apt-get install -y \
7
- curl jq python3 python3-venv python3-pip git build-essential \
8
- && rm -rf /var/lib/apt/lists/*
 
 
 
9
 
10
- # ---------------------------
11
- # 安装 OpenClaw
12
- # ---------------------------
 
 
 
 
 
 
 
 
 
 
13
  RUN npm install -g openclaw@latest --unsafe-perm
14
 
15
- # ---------------------------
16
- # 创建目录
17
- # ---------------------------
18
- RUN mkdir -p /root/.openclaw/{sessions,workspace,credentials} && chmod 700 /root/.openclaw
19
 
20
- # ---------------------------
21
- # 拷贝启动脚本
22
- # ---------------------------
23
- COPY start-openclaw-slack-echo.sh /usr/local/bin/start-openclaw.sh
24
- RUN chmod +x /usr/local/bin/start-openclaw.sh
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
  # ---------------------------
27
- # 暴露端口
28
  # ---------------------------
29
- EXPOSE 7860
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
  # ---------------------------
32
- #
33
  # ---------------------------
34
- CMD ["/usr/local/bin/start-openclaw.sh"]
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ========= Base =========
2
  FROM node:22-slim
3
 
4
+ # ========= System deps =========
5
+ RUN apt-get update && apt-get install -y --no-install-recommends \
6
+ git \
7
+ openssh-client \
8
+ build-essential \
9
+ python3 \
10
+ python3-pip \
11
+ ca-certificates \
12
+ && rm -rf /var/lib/apt/lists/*
13
 
14
+ RUN apt-get update && \
15
+ apt-get install -y \
16
+ curl \
17
+ jq \
18
+ && rm -rf /var/lib/apt/lists/*
19
+
20
+ # ========= HF CLI =========
21
+ RUN pip3 install --no-cache-dir huggingface_hub --break-system-packages
22
+
23
+ # ========= Git HTTPS fallback =========
24
+ RUN git config --global url."https://github.com/".insteadOf ssh://git@github.com/
25
+
26
+ # ========= OpenClaw =========
27
  RUN npm install -g openclaw@latest --unsafe-perm
28
 
29
+ COPY auto-approve.sh /usr/local/bin/auto-approve.sh
30
+ RUN chmod +x /usr/local/bin/auto-approve.sh
 
 
31
 
32
+
33
+ # ========= ENV =========
34
+ ENV PORT=7860 \
35
+ OPENCLAW_GATEWAY_MODE=local \
36
+ HOME=/root
37
+
38
+ # ========= sync.py =========
39
+ RUN cat <<'PYEOF' > /usr/local/bin/sync.py
40
+ import os, sys, tarfile
41
+ from huggingface_hub import HfApi, hf_hub_download
42
+ from datetime import datetime, timedelta
43
+
44
+ api = HfApi()
45
+ repo_id = os.getenv("HF_DATASET")
46
+ token = os.getenv("HF_TOKEN")
47
+
48
+ def restore():
49
+ try:
50
+ print(f"--- [SYNC] Restore from {repo_id} ---")
51
+ if not repo_id or not token:
52
+ print("--- [SYNC] Skipped (no config) ---")
53
+ return
54
+
55
+ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
56
+ now = datetime.now()
57
+
58
+ for i in range(5):
59
+ day = (now - timedelta(days=i)).strftime("%Y-%m-%d")
60
+ name = f"backup_{day}.tar.gz"
61
+
62
+ if name in files:
63
+ path = hf_hub_download(
64
+ repo_id=repo_id,
65
+ filename=name,
66
+ repo_type="dataset",
67
+ token=token
68
+ )
69
+
70
+ with tarfile.open(path, "r:gz") as tar:
71
+ tar.extractall("/root/.openclaw/")
72
+ print("--- [SYNC] Restore OK ---")
73
+ return
74
+
75
+ print("--- [SYNC] No backup found ---")
76
+
77
+ except Exception as e:
78
+ print("Restore error:", e)
79
+
80
+ def backup():
81
+ try:
82
+ day = datetime.now().strftime("%Y-%m-%d")
83
+ name = f"backup_{day}.tar.gz"
84
+
85
+ with tarfile.open(name, "w:gz") as tar:
86
+ for t in ["sessions","workspace","agents","memory","openclaw.json"]:
87
+ p=f"/root/.openclaw/{t}"
88
+ if os.path.exists(p):
89
+ tar.add(p, arcname=t)
90
+
91
+ api.upload_file(
92
+ path_or_fileobj=name,
93
+ path_in_repo=name,
94
+ repo_id=repo_id,
95
+ repo_type="dataset",
96
+ token=token
97
+ )
98
+ print("--- [SYNC] Backup OK ---")
99
+
100
+ except Exception as e:
101
+ print("Backup error:", e)
102
+
103
+ if __name__ == "__main__":
104
+ if len(sys.argv)>1 and sys.argv[1]=="backup":
105
+ backup()
106
+ else:
107
+ restore()
108
+ PYEOF
109
+
110
+ # ========= start script =========
111
+ RUN cat <<'SHEOF' > /usr/local/bin/start-openclaw
112
+ #!/bin/bash
113
+ set -e
114
+
115
+ mkdir -p /root/.openclaw/{sessions,workspace,credentials}
116
+ chmod 700 /root/.openclaw
117
+
118
+ # Restore state
119
+ python3 /usr/local/bin/sync.py
120
+
121
+ # Clean base url safely
122
+ if [ -n "$OPENAI_API_BASE" ]; then
123
+ CLEAN_BASE=$(echo "$OPENAI_API_BASE" \
124
+ | sed "s|/chat/completions||g" \
125
+ | sed "s|/v1/|/v1|g" \
126
+ | sed "s|/v1$|/v1|g")
127
+ else
128
+ CLEAN_BASE="https://api.siliconflow.cn/v1"
129
+ fi
130
 
131
  # ---------------------------
132
+ # Slack
133
  # ---------------------------
134
+ if [ -n "$SLACK_BOT_TOKEN" ]; then
135
+ cat > /root/.openclaw/credentials/slack.json <<EOF
136
+ {
137
+ "botToken":"$SLACK_BOT_TOKEN",
138
+ "appToken":"$SLACK_APP_TOKEN"
139
+ }
140
+ EOF
141
+ fi
142
+
143
+ # Write config
144
+ cat > /root/.openclaw/openclaw.json <<EOF
145
+ {
146
+ "models":{
147
+ "providers":{
148
+ "siliconflow":{
149
+ "baseUrl":"$CLEAN_BASE",
150
+ "apiKey":"$OPENAI_API_KEY",
151
+ "api":"openai-completions",
152
+ "models":[
153
+ {"id":"$MODEL","name":"LLM","contextWindow":128000}
154
+ ]
155
+ }
156
+ }
157
+ },
158
+ "agents":{
159
+ "defaults":{
160
+ "model":{"primary":"siliconflow/$MODEL"}
161
+ }
162
+ },
163
+ "gateway":{
164
+ "mode":"local",
165
+ "bind":"lan",
166
+ "port":$PORT,
167
+ "trustedProxies":["0.0.0.0/0"],
168
+ "auth":{
169
+ "mode":"token",
170
+ "token":"$OPENCLAW_GATEWAY_PASSWORD"
171
+ },
172
+ "controlUi":{"allowInsecureAuth":true}
173
+ },
174
+ "channels":{
175
+ "slack":{
176
+ "enabled":true,
177
+ "botToken":"$SLACK_BOT_TOKEN",
178
+ "appToken":"$SLACK_APP_TOKEN"
179
+ }
180
+ }
181
+ }
182
+ EOF
183
+
184
+ # Background backup loop
185
+ (
186
+ while true; do
187
+ sleep 10800
188
+ python3 /usr/local/bin/sync.py backup
189
+ done
190
+ ) &
191
+
192
+ # Run doctor once
193
+ openclaw doctor --fix || true
194
 
195
  # ---------------------------
196
+ # Slack 自 approve ,需要slack先发送消息,获得paring code
197
  # ---------------------------
198
+ #openclaw pairing approve slack H3CBFPEN
199
+
200
+ # Start gateway foreground
201
+ #exec openclaw gateway run --port $PORT
202
+ openclaw gateway run --port $PORT &
203
+ # 立即运行 auto-approve 脚本(前台)
204
+ /usr/local/bin/auto-approve.sh
205
+ SHEOF
206
+
207
+ RUN chmod +x /usr/local/bin/start-openclaw
208
+
209
+ EXPOSE 7860
210
+ CMD ["/usr/local/bin/start-openclaw"]