rytfh commited on
Commit
ddcbb93
·
verified ·
1 Parent(s): 219baf3

Update start.sh

Browse files
Files changed (1) hide show
  1. start.sh +36 -70
start.sh CHANGED
@@ -1,122 +1,88 @@
1
  #!/bin/sh
2
- # 确保任何命令失败时,脚本都会立即退出
3
  set -e
4
 
5
- echo "--- gpt-load WebDAV 启动与备份脚本 ---"
6
 
7
  # --- 配置 ---
8
- # gpt-load 的数据目录
9
  DATA_DIR="/app/data"
10
- # 本地临时备份文件的路径
11
  BACKUP_ARCHIVE="/tmp/gptload_backup.tar.gz"
12
- # 上传到 WebDAV 的远程文件名
13
  REMOTE_ARCHIVE_FILENAME="gptload_backup.tar.gz"
14
- # 用于比较文件变化的校验和文件,存储在数据目录中,以便一同备份和恢复
15
  CHECKSUM_FILE="/app/data/gptload_backup.sha256"
16
 
17
- # --- 函数定义 ---
18
-
19
- # 函数1: 从 WebDAV 恢复数据 (同步执行,必须在应用启动前完成)
20
  restore_from_webdav() {
21
- # 检查 WebDAV 环境变量是否设置
22
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
23
- echo "[Supervisor] WebDAV 环境变量未完全配置,跳过恢复。"
24
  return
25
  fi
26
-
27
- echo "[Supervisor] 正在从 WebDAV 检查并恢复数据..."
28
- # 确保数据目录存在
29
  mkdir -p "$DATA_DIR"
30
-
31
- # 尝试下载备份文件
32
- if curl --fail --silent --show-error -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME" -o "$BACKUP_ARCHIVE"; then
33
- echo "[Supervisor] 成功从 WebDAV 下载备份,正在解压..."
34
- # 解压到 /app/data 目录,这将恢复 gpt-load.db 和其他可能的数据
35
- # -C "$DATA_DIR" 表示解压前先切换到该目录
36
  tar -xzf "$BACKUP_ARCHIVE" -C "$DATA_DIR"
37
  rm "$BACKUP_ARCHIVE"
38
- echo "[Supervisor] 数据恢复完成。"
39
  else
40
- echo "[Supervisor] WebDAV 上无可用备份文件或下载失败。将使用本地数据或创建新数据。"
41
  fi
42
  }
43
 
44
- # 函数2: 启动后台定时备份循环 (异步执行)
45
  start_backup_loop() {
46
- # 再次检查 WebDAV 环境变量
47
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
48
- echo "[Backup Loop] WebDAV 环境变量未配置,备份功能禁用。"
49
  return
50
  fi
51
-
52
- # 使用子 shell 在后台运行循环
53
  (
54
- # 初始延迟,避免启动时立即备份
55
- sleep 300
 
56
  while true; do
57
- # 检查数据目录是否非空
58
  if [ -d "$DATA_DIR" ] && [ -n "$(ls -A $DATA_DIR)" ]; then
59
- echo "[Backup Loop] 正在检查数据变化..."
 
60
 
61
- # 将整个 /app/data 目录(包含 gpt-load.db 等)打包
62
- # 使用 . 表示当前目录的内容,-C 切换到数据目录,避免在压缩包中包含 app/data 路径
63
  tar -czf "$BACKUP_ARCHIVE" -C "$DATA_DIR" .
64
 
65
- # 计算新备份的校验和
66
  sha256sum "$BACKUP_ARCHIVE" > "${CHECKSUM_FILE}.new"
67
 
68
- # 比较新旧校验和,如果不同或旧校验和文件不存在,则上传
69
  if ! cmp -s "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE" 2>/dev/null; then
70
- echo "[Backup Loop] 检测到数据变化,开始上传到 WebDAV..."
 
71
 
72
- # 使用 curl 上传。-T 表示上传文件。
73
- if curl --fail --silent --show-error -L -T "$BACKUP_ARCHIVE" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME"; then
74
- echo "[Backup Loop] WebDAV 备份上传成功。"
75
- # 上传成功后,用新的校验和文件覆盖旧的
76
  mv "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE"
77
  else
78
- echo "[Backup Loop] WebDAV 上传失败!"
79
- # 上传失败,删除新的校验和文件,下次会重试
80
- rm -f "${CHECKSUM_FILE}.new"
81
  fi
82
  else
83
- echo "[Backup Loop] 数据无变化,跳过本次上传。"
84
  fi
85
-
86
- # 清理临时文件
87
- rm "$BACKUP_ARCHIVE"
88
- # 如果 .new 文件因为比较相同而没被 mv,也删掉
89
  rm -f "${CHECKSUM_FILE}.new"
 
 
90
  fi
91
 
92
- # 等待下一个循环
93
- echo "[Backup Loop] 等待 5 分钟..."
94
- sleep 300
95
  done
96
- ) & # & 符号让整个子 shell 在后台运行
97
  }
98
 
99
  # --- 主执行流程 ---
100
-
101
- # 1. **执行数据恢复**,并等待它完成
102
  restore_from_webdav
103
-
104
- # 2. **在后台启动 gpt-load 主服务**
105
- echo "[Supervisor] 数据恢复阶段完成。正在后台启动 gpt-load 主服务..."
106
- # Hugging Face Spaces 会提供 $PORT 环境变量
107
- # 如果没有就默认 7860
108
- # 必须绑定 0.0.0.0 才能在 Space 中被访问
109
  ./gpt-load --port ${PORT:-7860} --host 0.0.0.0 &
110
  GPTLOAD_PID=$!
111
- echo "[Supervisor] gpt-load 服务已启动, PID: ${GPTLOAD_PID}"
112
-
113
- # 3. **启动后台备份循环**
114
- echo "[Supervisor] 正在启动后台 WebDAV 备份循环..."
115
  start_backup_loop
116
-
117
- # 4. **等待主服务进程结束**
118
- # 这是让容器保持运行的关键。当 gpt-load 进程退出时,wait 命令会结束,脚本也会随之结束,容器停止。
119
- echo "[Supervisor] 启动完成。脚本将等待主服务 (PID: ${GPTLOAD_PID}) 结束..."
120
  wait $GPTLOAD_PID
121
-
122
- echo "[Supervisor] gpt-load 主服务已停止,容器即将退出。"
 
1
  #!/bin/sh
 
2
  set -e
3
 
4
+ echo "--- gpt-load WebDAV 启动与备份脚本 (调试模式) ---"
5
 
6
  # --- 配置 ---
 
7
  DATA_DIR="/app/data"
 
8
  BACKUP_ARCHIVE="/tmp/gptload_backup.tar.gz"
 
9
  REMOTE_ARCHIVE_FILENAME="gptload_backup.tar.gz"
 
10
  CHECKSUM_FILE="/app/data/gptload_backup.sha256"
11
 
12
+ # (恢复函数不变)
 
 
13
  restore_from_webdav() {
 
14
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
15
+ echo "[Supervisor-Debug] WebDAV 环境变量未完全配置,跳过恢复。"
16
  return
17
  fi
18
+ echo "[Supervisor-Debug] 正在从 WebDAV 恢复数据..."
 
 
19
  mkdir -p "$DATA_DIR"
20
+ echo "[Supervisor-Debug] 尝试下载: $WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME"
21
+ if curl --fail -v -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME" -o "$BACKUP_ARCHIVE"; then
22
+ echo "[Supervisor-Debug] 下载成功,正在解压..."
 
 
 
23
  tar -xzf "$BACKUP_ARCHIVE" -C "$DATA_DIR"
24
  rm "$BACKUP_ARCHIVE"
25
+ echo "[Supervisor-Debug] 恢复完成。"
26
  else
27
+ echo "[Supervisor-Debug] WebDAV 上无备份或下载失败。将使用本地数据。"
28
  fi
29
  }
30
 
 
31
  start_backup_loop() {
 
32
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
33
+ echo "[Backup Loop-Debug] WebDAV 环境变量未配置,备份禁用。"
34
  return
35
  fi
 
 
36
  (
37
+ # 调试模式:缩短初始等待时间为 60 秒
38
+ echo "[Backup Loop-Debug] 等待 60 秒后开始第一次备份..."
39
+ sleep 60
40
  while true; do
41
+ echo "[Backup Loop-Debug] 开始新一轮备份检查..."
42
  if [ -d "$DATA_DIR" ] && [ -n "$(ls -A $DATA_DIR)" ]; then
43
+ echo "[Backup Loop-Debug] 数据目录非空,准备打包。目录内容:"
44
+ ls -la "$DATA_DIR"
45
 
46
+ echo "[Backup Loop-Debug] 打包命令: tar -czf $BACKUP_ARCHIVE -C $DATA_DIR ."
 
47
  tar -czf "$BACKUP_ARCHIVE" -C "$DATA_DIR" .
48
 
 
49
  sha256sum "$BACKUP_ARCHIVE" > "${CHECKSUM_FILE}.new"
50
 
 
51
  if ! cmp -s "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE" 2>/dev/null; then
52
+ echo "[Backup Loop-Debug] 检测到数据变化,准备上传..."
53
+ echo "[Backup Loop-Debug] Curl 命令将执行: curl -v -T $BACKUP_ARCHIVE --user 'USER:PASS' $WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME"
54
 
55
+ # 使用 -v (verbose) 参数打印详细的连接和服务器响应信息
56
+ if curl --fail -v -L -T "$BACKUP_ARCHIVE" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME"; then
57
+ echo "[Backup Loop-Debug] WebDAV 备份上传成功。"
 
58
  mv "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE"
59
  else
60
+ # curl --fail 会在 HTTP 错误时返回非零退出码,触发这里
61
+ echo "[Backup Loop-Debug] !!! WebDAV 上传失败 !!! 请检查上面的 curl 详细输出,查看 HTTP 状态码 (如 401, 403, 404) 和服务器错误信息。"
 
62
  fi
63
  else
64
+ echo "[Backup Loop-Debug] 数据无变化,跳过上传。"
65
  fi
66
+ rm -f "$BACKUP_ARCHIVE"
 
 
 
67
  rm -f "${CHECKSUM_FILE}.new"
68
+ else
69
+ echo "[Backup Loop-Debug] 数据目录 /app/data 为空,跳过本次备份。"
70
  fi
71
 
72
+ # 调试模式:缩短循环时间为 2 分钟
73
+ echo "[Backup Loop-Debug] 等待 120 秒..."
74
+ sleep 120
75
  done
76
+ ) &
77
  }
78
 
79
  # --- 主执行流程 ---
 
 
80
  restore_from_webdav
81
+ echo "[Supervisor-Debug] 正在后台启动 gpt-load 主服务..."
 
 
 
 
 
82
  ./gpt-load --port ${PORT:-7860} --host 0.0.0.0 &
83
  GPTLOAD_PID=$!
84
+ echo "[Supervisor-Debug] gpt-load 服务已启动, PID: ${GPTLOAD_PID}"
 
 
 
85
  start_backup_loop
86
+ echo "[Supervisor-Debug] 启动完成。等待主服务结束..."
 
 
 
87
  wait $GPTLOAD_PID
88
+ echo "[Supervisor-Debug] gpt-load 主服务已停止。"