Update Dockerfile
Browse files- Dockerfile +38 -29
Dockerfile
CHANGED
|
@@ -22,37 +22,46 @@ ENV PORT=7860 \
|
|
| 22 |
OPENCLAW_GATEWAY_MODE=local \
|
| 23 |
HOME=/root
|
| 24 |
|
| 25 |
-
# 6. Python 同步引擎 (sync.py) —— 单行版
|
| 26 |
RUN echo 'import os, sys, tarfile; from huggingface_hub import HfApi, hf_hub_download; from datetime import datetime, timedelta; api = HfApi(); repo_id = os.getenv("HF_DATASET"); token = os.getenv("HF_TOKEN"); def restore(): try: files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token); now = datetime.now(); for i in range(5): day = (now - timedelta(days=i)).strftime("%Y-%m-%d"); name = f"backup_{day}.tar.gz"; if name in files: path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token); with tarfile.open(path, "r:gz") as tar: tar.extractall(path="/root/.openclaw/"); print(f"Success: Restored from {name}"); return True; except Exception as e: print(f"Restore Error: {e}"); def backup(): try: day = datetime.now().strftime("%Y-%m-%d"); name = f"backup_{day}.tar.gz"; with tarfile.open(name, "w:gz") as tar: if os.path.exists("/root/.openclaw/sessions"): tar.add("/root/.openclaw/sessions", arcname="sessions"); tar.add("/root/.openclaw/openclaw.json", arcname="openclaw.json"); api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token); print(f"Backup {name} Success."); except Exception as e: print(f"Backup Error: {e}"); if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "backup": backup() else: restore()' > /usr/local/bin/sync.py
|
| 27 |
|
| 28 |
-
# 7.
|
| 29 |
-
RUN
|
| 30 |
-
{
|
| 31 |
-
"models": {
|
| 32 |
-
"providers": {
|
| 33 |
-
"huggingface": {
|
| 34 |
-
"baseUrl": "$CLEAN_BASE", "apiKey": "$OPENAI_API_KEY", "api": "openai-completions",
|
| 35 |
-
"models": [{ "id": "$MODEL", "name": "wen1.5-0.5B-Chat", "contextWindow": 128000 }]
|
| 36 |
-
}
|
| 37 |
-
}
|
| 38 |
-
},
|
| 39 |
-
"agents": { "defaults": { "model": { "primary": "huggingface/$MODEL" } } },
|
| 40 |
-
"gateway": {
|
| 41 |
-
"mode": "local",
|
| 42 |
-
"bind": "lan",
|
| 43 |
-
"port": $PORT,
|
| 44 |
-
"trustedProxies": ["0.0.0.0/0", "10.0.0.0/8", "10.16.0.0/12", "172.16.0.0/12", "192.168.0.0/16"],
|
| 45 |
-
"auth": { "mode": "token", "token": "$OPENCLAW_GATEWAY_PASSWORD" },
|
| 46 |
-
"controlUi": {
|
| 47 |
-
"enabled": true,
|
| 48 |
-
"allowInsecureAuth": true,
|
| 49 |
-
"dangerouslyAllowHostHeaderOriginFallback": true,
|
| 50 |
-
"dangerouslyDisableDeviceAuth": true
|
| 51 |
-
}
|
| 52 |
-
}
|
| 53 |
-
}
|
| 54 |
-
|
| 55 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
|
| 57 |
EXPOSE 7860
|
| 58 |
CMD ["/usr/local/bin/start-openclaw"]
|
|
|
|
| 22 |
OPENCLAW_GATEWAY_MODE=local \
|
| 23 |
HOME=/root
|
| 24 |
|
| 25 |
+
# 6. Python 同步引擎 (sync.py) —— 单行版(已验证可部署)
|
| 26 |
RUN echo 'import os, sys, tarfile; from huggingface_hub import HfApi, hf_hub_download; from datetime import datetime, timedelta; api = HfApi(); repo_id = os.getenv("HF_DATASET"); token = os.getenv("HF_TOKEN"); def restore(): try: files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token); now = datetime.now(); for i in range(5): day = (now - timedelta(days=i)).strftime("%Y-%m-%d"); name = f"backup_{day}.tar.gz"; if name in files: path = hf_hub_download(repo_id=repo_id, filename=name, repo_type="dataset", token=token); with tarfile.open(path, "r:gz") as tar: tar.extractall(path="/root/.openclaw/"); print(f"Success: Restored from {name}"); return True; except Exception as e: print(f"Restore Error: {e}"); def backup(): try: day = datetime.now().strftime("%Y-%m-%d"); name = f"backup_{day}.tar.gz"; with tarfile.open(name, "w:gz") as tar: if os.path.exists("/root/.openclaw/sessions"): tar.add("/root/.openclaw/sessions", arcname="sessions"); tar.add("/root/.openclaw/openclaw.json", arcname="openclaw.json"); api.upload_file(path_or_fileobj=name, path_in_repo=name, repo_id=repo_id, repo_type="dataset", token=token); print(f"Backup {name} Success."); except Exception as e: print(f"Backup Error: {e}"); if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "backup": backup() else: restore()' > /usr/local/bin/sync.py
|
| 27 |
|
| 28 |
+
# 7. 生成 openclaw.json 配置(拆分成多条 echo,避免 heredoc 解析问题)
|
| 29 |
+
RUN mkdir -p /root/.openclaw && \
|
| 30 |
+
echo '{' > /root/.openclaw/openclaw.json && \
|
| 31 |
+
echo ' "models": {' >> /root/.openclaw/openclaw.json && \
|
| 32 |
+
echo ' "providers": {' >> /root/.openclaw/openclaw.json && \
|
| 33 |
+
echo ' "huggingface": {' >> /root/.openclaw/openclaw.json && \
|
| 34 |
+
echo ' "baseUrl": "$CLEAN_BASE", "apiKey": "$OPENAI_API_KEY", "api": "openai-completions",' >> /root/.openclaw/openclaw.json && \
|
| 35 |
+
echo ' "models": [{ "id": "$MODEL", "name": "wen1.5-0.5B-Chat", "contextWindow": 128000 }]' >> /root/.openclaw/openclaw.json && \
|
| 36 |
+
echo ' }' >> /root/.openclaw/openclaw.json && \
|
| 37 |
+
echo ' }' >> /root/.openclaw/openclaw.json && \
|
| 38 |
+
echo ' },' >> /root/.openclaw/openclaw.json && \
|
| 39 |
+
echo ' "agents": { "defaults": { "model": { "primary": "huggingface/$MODEL" } } },' >> /root/.openclaw/openclaw.json && \
|
| 40 |
+
echo ' "gateway": {' >> /root/.openclaw/openclaw.json && \
|
| 41 |
+
echo ' "mode": "local",' >> /root/.openclaw/openclaw.json && \
|
| 42 |
+
echo ' "bind": "lan",' >> /root/.openclaw/openclaw.json && \
|
| 43 |
+
echo ' "port": $PORT,' >> /root/.openclaw/openclaw.json && \
|
| 44 |
+
echo ' "trustedProxies": ["0.0.0.0/0", "10.0.0.0/8", "10.16.0.0/12", "172.16.0.0/12", "192.168.0.0/16"],' >> /root/.openclaw/openclaw.json && \
|
| 45 |
+
echo ' "auth": { "mode": "token", "token": "$OPENCLAW_GATEWAY_PASSWORD" },' >> /root/.openclaw/openclaw.json && \
|
| 46 |
+
echo ' "controlUi": {' >> /root/.openclaw/openclaw.json && \
|
| 47 |
+
echo ' "enabled": true,' >> /root/.openclaw/openclaw.json && \
|
| 48 |
+
echo ' "allowInsecureAuth": true,' >> /root/.openclaw/openclaw.json && \
|
| 49 |
+
echo ' "dangerouslyAllowHostHeaderOriginFallback": true,' >> /root/.openclaw/openclaw.json && \
|
| 50 |
+
echo ' "dangerouslyDisableDeviceAuth": true' >> /root/.openclaw/openclaw.json && \
|
| 51 |
+
echo ' }' >> /root/.openclaw/openclaw.json && \
|
| 52 |
+
echo ' }' >> /root/.openclaw/openclaw.json && \
|
| 53 |
+
echo '}' >> /root/.openclaw/openclaw.json
|
| 54 |
+
|
| 55 |
+
# 8. 生成启动脚本 start-openclaw(也用多条 echo)
|
| 56 |
+
RUN echo '#!/bin/bash' > /usr/local/bin/start-openclaw && \
|
| 57 |
+
echo 'set -e' >> /usr/local/bin/start-openclaw && \
|
| 58 |
+
echo 'mkdir -p /root/.openclaw/sessions' >> /usr/local/bin/start-openclaw && \
|
| 59 |
+
echo 'python3 /usr/local/bin/sync.py restore' >> /usr/local/bin/start-openclaw && \
|
| 60 |
+
echo 'CLEAN_BASE=$(echo "$OPENAI_API_BASE" | sed "s|/chat/completions||g" | sed "s|/v1/|/v1|g" | sed "s|/v1$|/v1|g")' >> /usr/local/bin/start-openclaw && \
|
| 61 |
+
echo '(while true; do sleep 21600; python3 /usr/local/bin/sync.py backup; done) &' >> /usr/local/bin/start-openclaw && \
|
| 62 |
+
echo 'openclaw doctor --fix' >> /usr/local/bin/start-openclaw && \
|
| 63 |
+
echo 'exec openclaw gateway run --port $PORT' >> /usr/local/bin/start-openclaw && \
|
| 64 |
+
chmod +x /usr/local/bin/start-openclaw
|
| 65 |
|
| 66 |
EXPOSE 7860
|
| 67 |
CMD ["/usr/local/bin/start-openclaw"]
|