Create Dockerfile
Browse files- 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"]
|