yhwl8888 commited on
Commit
44d4836
·
verified ·
1 Parent(s): 8a5224d

Create Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +72 -0
Dockerfile ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:20-slim
2
+
3
+ # 1. 安装基础依赖
4
+ RUN apt-get update && apt-get install -y \
5
+ socat python3 python3-pip curl procps \
6
+ && rm -rf /var/lib/apt/lists/*
7
+
8
+ # 2. 安装同步工具
9
+ RUN pip3 install --break-system-packages huggingface_hub
10
+
11
+ # 3. 安装 9router
12
+ RUN npm install -g 9router
13
+
14
+ WORKDIR /app
15
+
16
+ # 4. 备份同步脚本 (sync.py) - 修复了引号嵌套错误
17
+ RUN echo 'import os, shutil, tarfile, time, sys\n\
18
+ from huggingface_hub import HfApi, hf_hub_download\n\
19
+ \n\
20
+ REPO_ID = os.environ.get("DATASET_REPO")\n\
21
+ TOKEN = os.environ.get("HF_TOKEN")\n\
22
+ BACKUP_FILE = "/tmp/9router_backup.tar.gz"\n\
23
+ PATHS = ["/root/.9router"]\n\
24
+ \n\
25
+ def upload():\n\
26
+ if not REPO_ID or not TOKEN: return\n\
27
+ try:\n\
28
+ if not os.path.exists("/root/.9router"): \n\
29
+ print(">>> [Sync] 文件夹不存在,跳过备份")\n\
30
+ return\n\
31
+ with tarfile.open(BACKUP_FILE, "w:gz") as tar:\n\
32
+ for p in PATHS:\n\
33
+ if os.path.exists(p): tar.add(p, arcname=".9router")\n\
34
+ api = HfApi(token=TOKEN)\n\
35
+ api.upload_file(path_or_fileobj=BACKUP_FILE, path_in_repo="9router_backup.tar.gz", repo_id=REPO_ID, repo_type="dataset")\n\
36
+ print(">>> [Sync] 备份成功: " + time.strftime("%Y-%m-%d %H:%M:%S"))\n\
37
+ except Exception as e: print(">>> [Sync] 备份失败: " + str(e))\n\
38
+ \n\
39
+ def download():\n\
40
+ if not REPO_ID or not TOKEN: return\n\
41
+ try:\n\
42
+ print(">>> [Sync] 正在从 Dataset 下载数据...")\n\
43
+ path = hf_hub_download(repo_id=REPO_ID, filename="9router_backup.tar.gz", repo_type="dataset", token=TOKEN)\n\
44
+ with tarfile.open(path, "r:gz") as tar: tar.extractall(path="/root")\n\
45
+ print(">>> [Sync] 数据恢复成功")\n\
46
+ except Exception as e: print(">>> [Sync] 跳过恢复 (首次启动或文件不存在)")\n\
47
+ \n\
48
+ if __name__ == "__main__":\n\
49
+ if len(sys.argv) > 1:\n\
50
+ if sys.argv[1] == "upload": upload()\n\
51
+ elif sys.argv[1] == "download": download()' > /app/sync.py
52
+
53
+ # 5. 最终启动脚本 (run.sh)
54
+ RUN echo "#!/bin/bash\n\
55
+ echo '=== 1. 数据恢复 ==='\n\
56
+ python3 /app/sync.py download\n\
57
+ \n\
58
+ echo '=== 2. 建立端口转发 (7860 -> 20128) ==='\n\
59
+ socat TCP-LISTEN:7860,fork,reuseaddr TCP:127.0.0.1:20128 & \n\
60
+ \n\
61
+ echo '=== 3. 启动定时备份 (每10分钟一次) ==='\n\
62
+ (while true; do sleep 600; python3 /app/sync.py upload; done) & \n\
63
+ \n\
64
+ echo '=== 4. 启动 9router ==='\n\
65
+ export NEXT_PUBLIC_BASE_URL=https://\$SPACE_HOST\n\
66
+ # 模拟回车以跳过菜单\n\
67
+ printf '\n' | 9router" > /app/run.sh
68
+
69
+ RUN chmod +x /app/run.sh
70
+
71
+ EXPOSE 7860
72
+ CMD ["/bin/bash", "/app/run.sh"]