wd21 commited on
Commit
0129dfc
·
verified ·
1 Parent(s): 935f3fa

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +62 -9
Dockerfile CHANGED
@@ -14,14 +14,73 @@ ENV PORT=7860 \
14
  OPENCLAW_GATEWAY_MODE=local \
15
  HOME=/root
16
 
17
- # 备份恢复脚本 sync.py(完整,请从你之前的代码中复制,此处省略以节省篇幅)
18
  RUN cat > /usr/local/bin/sync.py << 'SYNC_EOF'
19
- # 这里放你完整的 sync.py 内容
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  SYNC_EOF
21
 
22
  RUN chmod +x /usr/local/bin/sync.py
23
 
24
- # 启动脚本 start-openclaw(支持 Hugging Face Inference API)
25
  RUN cat > /usr/local/bin/start-openclaw << 'EOF'
26
  #!/bin/bash
27
  set -e
@@ -48,7 +107,6 @@ CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1
48
  # 构建 providers JSON 对象(使用 jq)
49
  PROVIDERS_JSON="{}"
50
 
51
- # 添加 OpenAI/Gemini 提供商
52
  if [ -n "$GEMINI_API_KEY" ]; then
53
  PROVIDERS_JSON=$(echo "$PROVIDERS_JSON" | jq \
54
  --arg baseUrl "https://generativelanguage.googleapis.com/v1beta" \
@@ -63,7 +121,6 @@ elif [ -n "$OPENAI_API_KEY" ]; then
63
  '.openai = {"baseUrl": $baseUrl, "apiKey": $apiKey, "api": "openai-completions", "models": [{"id": $model, "name": $model, "contextWindow": 128000}]}')
64
  fi
65
 
66
- # 添加 Hugging Face 提供商(如果配置了)
67
  if [ -n "$HF_API_TOKEN" ] && [ -n "$HF_MODEL" ]; then
68
  PROVIDERS_JSON=$(echo "$PROVIDERS_JSON" | jq \
69
  --arg baseUrl "https://api-inference.huggingface.co" \
@@ -72,7 +129,6 @@ if [ -n "$HF_API_TOKEN" ] && [ -n "$HF_MODEL" ]; then
72
  '.huggingface = {"baseUrl": $baseUrl, "apiKey": $apiKey, "api": "huggingface", "models": [{"id": $model, "name": $model, "contextWindow": 4096}]}')
73
  fi
74
 
75
- # 确定默认 provider 和模型
76
  DEFAULT_PROVIDER=""
77
  DEFAULT_MODEL=""
78
  if [ -n "$HF_API_TOKEN" ] && [ -n "$HF_MODEL" ]; then
@@ -89,7 +145,6 @@ else
89
  exit 1
90
  fi
91
 
92
- # 构建 groups 配置字符串(与之前相同)
93
  GROUPS_CONFIG=""
94
  if [ -n "$TELEGRAM_GROUP_IDS" ]; then
95
  GROUPS_CONFIG=', "groups": {'
@@ -105,7 +160,6 @@ if [ -n "$TELEGRAM_GROUP_IDS" ]; then
105
  GROUPS_CONFIG="$GROUPS_CONFIG }"
106
  fi
107
 
108
- # 生成最终的 openclaw.json
109
  jq -n \
110
  --argjson providers "$PROVIDERS_JSON" \
111
  --arg defaultProvider "$DEFAULT_PROVIDER" \
@@ -156,7 +210,6 @@ jq -n \
156
  }
157
  }' > /root/.openclaw/openclaw.json
158
 
159
- # 如果 groupsConfig 不为空,手动添加(jq 无法动态添加字段,这里用 sed 简单处理)
160
  if [ -n "$TELEGRAM_GROUP_IDS" ]; then
161
  sed -i '/"retry": {/a\ '"$GROUPS_CONFIG"',' /root/.openclaw/openclaw.json
162
  fi
 
14
  OPENCLAW_GATEWAY_MODE=local \
15
  HOME=/root
16
 
17
+ # ==================== 完整备份恢复脚本 sync.py ====================
18
  RUN cat > /usr/local/bin/sync.py << 'SYNC_EOF'
19
+ import os, sys, tarfile
20
+ from huggingface_hub import HfApi, hf_hub_download
21
+ from datetime import datetime, timedelta
22
+ import subprocess
23
+ import time
24
+
25
+ api = HfApi()
26
+ repo_id = os.getenv("HF_DATASET")
27
+ token = os.getenv("HF_TOKEN")
28
+
29
+ def restore():
30
+ try:
31
+ print(f"--- [SYNC] 启动恢复流程, 目标仓库: {repo_id} ---")
32
+ if not repo_id or not token:
33
+ print("--- [SYNC] 跳过恢复: 未配置 HF_DATASET 或 HF_TOKEN ---")
34
+ return False
35
+ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
36
+ now = datetime.now()
37
+ for i in range(5):
38
+ day = (now - timedelta(days=i)).strftime("%Y-%m-%d")
39
+ name = f"backup_{day}.tar.gz"
40
+ if name in files:
41
+ print(f"--- [SYNC] 发现备份文件: {name}, 正在下载... ---")
42
+ path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token)
43
+ with tarfile.open(path, "r:gz") as tar:
44
+ tar.extractall(path="/root/.openclaw/")
45
+ print(f"--- [SYNC] 恢复成功! 数据已覆盖至 /root/.openclaw/ ---")
46
+ return True
47
+ print("--- [SYNC] 未找到最近 5 天的备份包 ---")
48
+ except Exception as e:
49
+ print(f"--- [SYNC] 恢复异常: {e} ---")
50
+
51
+ def backup():
52
+ try:
53
+ day = datetime.now().strftime("%Y-%m-%d")
54
+ name = f"backup_{day}.tar.gz"
55
+ print(f"--- [SYNC] 正在执行全量备份: {name} ---")
56
+ with tarfile.open(name, "w:gz") as tar:
57
+ for target in ["sessions", "workspace", "agents", "memory", "openclaw.json", "wechat-data"]:
58
+ full_path = f"/root/.openclaw/{target}"
59
+ if os.path.exists(full_path):
60
+ tar.add(full_path, arcname=target)
61
+ api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token)
62
+ print(f"--- [SYNC] 备份上传成功! ---")
63
+ for _ in range(3):
64
+ try:
65
+ result = subprocess.run(["openclaw", "wechat", "send", "--to=me", f"备份成功: {name}"], capture_output=True, timeout=10)
66
+ if result.returncode == 0:
67
+ break
68
+ except Exception:
69
+ pass
70
+ time.sleep(5)
71
+ except Exception as e:
72
+ print(f"--- [SYNC] 备份失败: {e} ---")
73
+
74
+ if __name__ == "__main__":
75
+ if len(sys.argv) > 1 and sys.argv[1] == "backup":
76
+ backup()
77
+ else:
78
+ restore()
79
  SYNC_EOF
80
 
81
  RUN chmod +x /usr/local/bin/sync.py
82
 
83
+ # 启动脚本 start-openclaw(支持 Hugging Face Inference API,含备份恢复)
84
  RUN cat > /usr/local/bin/start-openclaw << 'EOF'
85
  #!/bin/bash
86
  set -e
 
107
  # 构建 providers JSON 对象(使用 jq)
108
  PROVIDERS_JSON="{}"
109
 
 
110
  if [ -n "$GEMINI_API_KEY" ]; then
111
  PROVIDERS_JSON=$(echo "$PROVIDERS_JSON" | jq \
112
  --arg baseUrl "https://generativelanguage.googleapis.com/v1beta" \
 
121
  '.openai = {"baseUrl": $baseUrl, "apiKey": $apiKey, "api": "openai-completions", "models": [{"id": $model, "name": $model, "contextWindow": 128000}]}')
122
  fi
123
 
 
124
  if [ -n "$HF_API_TOKEN" ] && [ -n "$HF_MODEL" ]; then
125
  PROVIDERS_JSON=$(echo "$PROVIDERS_JSON" | jq \
126
  --arg baseUrl "https://api-inference.huggingface.co" \
 
129
  '.huggingface = {"baseUrl": $baseUrl, "apiKey": $apiKey, "api": "huggingface", "models": [{"id": $model, "name": $model, "contextWindow": 4096}]}')
130
  fi
131
 
 
132
  DEFAULT_PROVIDER=""
133
  DEFAULT_MODEL=""
134
  if [ -n "$HF_API_TOKEN" ] && [ -n "$HF_MODEL" ]; then
 
145
  exit 1
146
  fi
147
 
 
148
  GROUPS_CONFIG=""
149
  if [ -n "$TELEGRAM_GROUP_IDS" ]; then
150
  GROUPS_CONFIG=', "groups": {'
 
160
  GROUPS_CONFIG="$GROUPS_CONFIG }"
161
  fi
162
 
 
163
  jq -n \
164
  --argjson providers "$PROVIDERS_JSON" \
165
  --arg defaultProvider "$DEFAULT_PROVIDER" \
 
210
  }
211
  }' > /root/.openclaw/openclaw.json
212
 
 
213
  if [ -n "$TELEGRAM_GROUP_IDS" ]; then
214
  sed -i '/"retry": {/a\ '"$GROUPS_CONFIG"',' /root/.openclaw/openclaw.json
215
  fi