wd21 commited on
Commit
24d3bc0
·
verified ·
1 Parent(s): 7d9480c

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +10 -28
Dockerfile CHANGED
@@ -1,18 +1,17 @@
1
  FROM lampon/omnibox:latest
2
 
3
- # 安装 Python3、pip 和 huggingface_hub(用于上传备份)
4
  RUN apt-get update && apt-get install -y python3 python3-pip socat && \
5
  pip3 install --no-cache-dir huggingface_hub && \
6
  rm -rf /var/lib/apt/lists/*
7
 
8
  WORKDIR /app
9
 
10
- # 创建备份脚本
11
  RUN cat > /usr/local/bin/backup.sh << 'EOF'
12
  #!/bin/bash
13
  set -e
14
 
15
- # 环境变量检查
16
  if [ -z "$HF_DATASET" ] || [ -z "$HF_TOKEN" ]; then
17
  echo "❌ 缺少 HF_DATASET 或 HF_TOKEN 环境变量,跳过备份"
18
  exit 0
@@ -20,11 +19,8 @@ fi
20
 
21
  echo "$(date): 📦 开始备份 omnibox 数据..."
22
 
23
- # 创建临时打包目录
24
  mkdir -p /tmp/omnibox_backup
25
 
26
- # 复制需要备份的数据(根据你的实际数据路径修改)
27
- # 注意:omnibox 的数据通常位于 /app/data 目录下(包含数据库、订阅、配置等)
28
  if [ -d /app/data ]; then
29
  cp -r /app/data /tmp/omnibox_backup/
30
  echo "✅ 已复制 /app/data"
@@ -32,20 +28,14 @@ else
32
  echo "⚠️ 未找到 /app/data 目录,跳过数据复制"
33
  fi
34
 
35
- # 你也可以备份其他目录,例如 /app/config、/app/db 等
36
- # cp -r /app/config /tmp/omnibox_backup/ 2>/dev/null || true
37
-
38
- # 打包
39
  cd /tmp
40
  tar -czf omnibox_backup.tar.gz omnibox_backup
41
  BACKUP_FILE="/tmp/omnibox_backup.tar.gz"
42
 
43
- # 生成带时间戳的备份文件名(避免覆盖)
44
  TIMESTAMP=$(date +%Y%m%d_%H%M%S)
45
  REMOTE_PATH="omnibox_backup_${TIMESTAMP}.tar.gz"
46
 
47
- # 使用 Python 上传到 Hugging Face Dataset
48
- python3 <<EOF
49
  from huggingface_hub import HfApi
50
  import os
51
 
@@ -66,24 +56,23 @@ try:
66
  print(f"✅ 备份上传成功: {remote_path}")
67
  except Exception as e:
68
  print(f"❌ 备份上传失败: {e}")
69
- EOF
70
 
71
- # 清理临时文件
72
  rm -rf /tmp/omnibox_backup /tmp/omnibox_backup.tar.gz
73
  echo "$(date): 🎉 备份流程完成"
74
  EOF
75
 
76
  RUN chmod +x /usr/local/bin/backup.sh
77
 
78
- # 修改启动脚本:先尝试恢复最新备份,再启动服务,同时启动定时备份
79
  RUN cat > /usr/local/bin/start.sh << 'EOF'
80
  #!/bin/bash
81
  set -e
82
 
83
- # 1. 尝试恢复最新备份(如果有)
84
  if [ -n "$HF_DATASET" ] && [ -n "$HF_TOKEN" ]; then
85
  echo "🔄 检查是否存在可恢复的备份..."
86
- python3 <<EOF
87
  from huggingface_hub import HfApi, hf_hub_download
88
  import os, tarfile, glob, re
89
 
@@ -92,13 +81,11 @@ token = os.environ.get("HF_TOKEN")
92
  api = HfApi()
93
 
94
  try:
95
- # 获取数据集中的所有备份文件
96
  files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
97
  backup_files = [f for f in files if f.startswith("omnibox_backup_") and f.endswith(".tar.gz")]
98
  if not backup_files:
99
  print("📭 未找到历史备份文件")
100
  else:
101
- # 按时间戳排序,取最新的一个
102
  backup_files.sort(reverse=True)
103
  latest = backup_files[0]
104
  print(f"📥 发现最新备份: {latest},正在下载...")
@@ -109,31 +96,28 @@ try:
109
  token=token,
110
  local_dir="/tmp/restore"
111
  )
112
- # 解压到 /app
113
  with tarfile.open(path, "r:gz") as tar:
114
  tar.extractall(path="/tmp/restore_data")
115
- # 将恢复的数据复制到 /app/data(根据你的实际路径调整)
116
  if os.path.exists("/tmp/restore_data/omnibox_backup/data"):
117
  rm -rf /app/data
118
  cp -r /tmp/restore_data/omnibox_backup/data /app/
119
  echo "✅ 数据恢复成功"
120
  else:
121
  echo "⚠️ 备份文件中未找到 /data 目录,跳过恢复"
122
- # 清理
123
  rm -rf /tmp/restore /tmp/restore_data
124
  except Exception as e:
125
  print(f"⚠️ 恢复过程出现异常: {e}")
126
- EOF
127
  fi
128
 
129
- # 2. 启动服务(后台运行)
130
  echo "🚀 启动 Omnibox 主服务..."
131
  ./main &
132
  MAIN_PID=$!
133
  socat TCP-LISTEN:7860,fork TCP:127.0.0.1:7023 &
134
  SOCAT_PID=$!
135
 
136
- # 3. 启动定时备份(每30分钟)
137
  echo "⏰ 启动自动备份(每30分钟)..."
138
  (
139
  while true; do
@@ -143,10 +127,8 @@ echo "⏰ 启动自动备份(每30分钟)..."
143
  ) &
144
  BACKUP_PID=$!
145
 
146
- # 4. 容器退出时执行一次备份
147
  trap 'echo "🛑 容器停止,执行最后一次备份..."; /usr/local/bin/backup.sh; kill $MAIN_PID $SOCAT_PID $BACKUP_PID 2>/dev/null' EXIT
148
 
149
- # 5. 保持前台进程
150
  wait $MAIN_PID
151
  EOF
152
 
 
1
  FROM lampon/omnibox:latest
2
 
3
+ # 安装 Python3、pip 和 huggingface_hub
4
  RUN apt-get update && apt-get install -y python3 python3-pip socat && \
5
  pip3 install --no-cache-dir huggingface_hub && \
6
  rm -rf /var/lib/apt/lists/*
7
 
8
  WORKDIR /app
9
 
10
+ # 创建备份脚本(使用 heredoc 避免解析问题)
11
  RUN cat > /usr/local/bin/backup.sh << 'EOF'
12
  #!/bin/bash
13
  set -e
14
 
 
15
  if [ -z "$HF_DATASET" ] || [ -z "$HF_TOKEN" ]; then
16
  echo "❌ 缺少 HF_DATASET 或 HF_TOKEN 环境变量,跳过备份"
17
  exit 0
 
19
 
20
  echo "$(date): 📦 开始备份 omnibox 数据..."
21
 
 
22
  mkdir -p /tmp/omnibox_backup
23
 
 
 
24
  if [ -d /app/data ]; then
25
  cp -r /app/data /tmp/omnibox_backup/
26
  echo "✅ 已复制 /app/data"
 
28
  echo "⚠️ 未找到 /app/data 目录,跳过数据复制"
29
  fi
30
 
 
 
 
 
31
  cd /tmp
32
  tar -czf omnibox_backup.tar.gz omnibox_backup
33
  BACKUP_FILE="/tmp/omnibox_backup.tar.gz"
34
 
 
35
  TIMESTAMP=$(date +%Y%m%d_%H%M%S)
36
  REMOTE_PATH="omnibox_backup_${TIMESTAMP}.tar.gz"
37
 
38
+ python3 <<PYEOF
 
39
  from huggingface_hub import HfApi
40
  import os
41
 
 
56
  print(f"✅ 备份上传成功: {remote_path}")
57
  except Exception as e:
58
  print(f"❌ 备份上传失败: {e}")
59
+ PYEOF
60
 
 
61
  rm -rf /tmp/omnibox_backup /tmp/omnibox_backup.tar.gz
62
  echo "$(date): 🎉 备份流程完成"
63
  EOF
64
 
65
  RUN chmod +x /usr/local/bin/backup.sh
66
 
67
+ # 创建启动脚本
68
  RUN cat > /usr/local/bin/start.sh << 'EOF'
69
  #!/bin/bash
70
  set -e
71
 
72
+ # 恢复备份
73
  if [ -n "$HF_DATASET" ] && [ -n "$HF_TOKEN" ]; then
74
  echo "🔄 检查是否存在可恢复的备份..."
75
+ python3 <<PYEOF
76
  from huggingface_hub import HfApi, hf_hub_download
77
  import os, tarfile, glob, re
78
 
 
81
  api = HfApi()
82
 
83
  try:
 
84
  files = api.list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
85
  backup_files = [f for f in files if f.startswith("omnibox_backup_") and f.endswith(".tar.gz")]
86
  if not backup_files:
87
  print("📭 未找到历史备份文件")
88
  else:
 
89
  backup_files.sort(reverse=True)
90
  latest = backup_files[0]
91
  print(f"📥 发现最新备份: {latest},正在下载...")
 
96
  token=token,
97
  local_dir="/tmp/restore"
98
  )
 
99
  with tarfile.open(path, "r:gz") as tar:
100
  tar.extractall(path="/tmp/restore_data")
 
101
  if os.path.exists("/tmp/restore_data/omnibox_backup/data"):
102
  rm -rf /app/data
103
  cp -r /tmp/restore_data/omnibox_backup/data /app/
104
  echo "✅ 数据恢复成功"
105
  else:
106
  echo "⚠️ 备份文件中未找到 /data 目录,跳过恢复"
 
107
  rm -rf /tmp/restore /tmp/restore_data
108
  except Exception as e:
109
  print(f"⚠️ 恢复过程出现异常: {e}")
110
+ PYEOF
111
  fi
112
 
113
+ # 启动服务
114
  echo "🚀 启动 Omnibox 主服务..."
115
  ./main &
116
  MAIN_PID=$!
117
  socat TCP-LISTEN:7860,fork TCP:127.0.0.1:7023 &
118
  SOCAT_PID=$!
119
 
120
+ # 定时备份
121
  echo "⏰ 启动自动备份(每30分钟)..."
122
  (
123
  while true; do
 
127
  ) &
128
  BACKUP_PID=$!
129
 
 
130
  trap 'echo "🛑 容器停止,执行最后一次备份..."; /usr/local/bin/backup.sh; kill $MAIN_PID $SOCAT_PID $BACKUP_PID 2>/dev/null' EXIT
131
 
 
132
  wait $MAIN_PID
133
  EOF
134