Update start.sh
Browse files
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 |
-
|
| 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 |
-
|
|
|
|
| 56 |
while true; do
|
| 57 |
-
|
| 58 |
if [ -d "$DATA_DIR" ] && [ -n "$(ls -A $DATA_DIR)" ]; then
|
| 59 |
-
echo "[Backup Loop]
|
|
|
|
| 60 |
|
| 61 |
-
|
| 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] 检测到数据变化,
|
|
|
|
| 71 |
|
| 72 |
-
# 使用
|
| 73 |
-
if curl --fail -
|
| 74 |
-
echo "[Backup Loop] WebDAV 备份上传成功。"
|
| 75 |
-
# 上传成功后,用新的校验和文件覆盖旧的
|
| 76 |
mv "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE"
|
| 77 |
else
|
| 78 |
-
|
| 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] 等待
|
| 94 |
-
sleep
|
| 95 |
done
|
| 96 |
-
) &
|
| 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 主服务已停止。"
|
|
|