File size: 3,776 Bytes
45207aa cec9367 45207aa 2626ff5 45207aa cec9367 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 6e9bdd6 45207aa 6e9bdd6 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 b4b3fda 2626ff5 cec9367 45207aa 2626ff5 45207aa 2626ff5 45207aa 2626ff5 45207aa ddcbb93 45207aa ddcbb93 2626ff5 45207aa 2626ff5 45207aa ddcbb93 45207aa 2626ff5 45207aa 2626ff5 6319970 2626ff5 45207aa 2626ff5 45207aa 2626ff5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #!/bin/sh
set -e
echo "--- gpt-load WebDAV 启动与安全备份脚本 (V2.3 - 最终修正版) ---"
# --- 配置 ---
DATA_DIR="/app/data"
DB_FILE_PATH="${DATA_DIR}/gpt-load.db"
DB_BACKUP_PATH="/tmp/gpt-load.db.snapshot"
BACKUP_ARCHIVE="/tmp/gptload_backup.tar.gz"
REMOTE_ARCHIVE_FILENAME="gptload_backup.tar.gz"
# 关键修复 #1: 将 sha26 修正为 sha256
CHECKSUM_FILE="/app/data/gptload_backup.sha256"
# --- 函数定义 ---
restore_from_webdav() {
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
echo "[Supervisor] WebDAV 环境变量未完全配置,跳过恢复。"
return
fi
echo "[Supervisor] 正在从 WebDAV 检查并恢复数据..."
mkdir -p "$DATA_DIR"
if curl --fail --silent --show-error -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME" -o "$BACKUP_ARCHIVE"; then
echo "[Supervisor] 成功从 WebDAV 下载备份,正在解压..."
tar -xzf "$BACKUP_ARCHIVE" -C "$DATA_DIR" || true
rm "$BACKUP_ARCHIVE"
echo "[Supervisor] 数据恢复完成(已忽略权限错误)。"
else
echo "[Supervisor] WebDAV 上无可用备份文件。将使用本地数据或创建新数据。"
fi
}
start_backup_loop() {
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
echo "[Backup Loop] WebDAV 环境变量未配置,备份功能禁用。"
return
fi
(
sleep 300
while true; do
if [ -f "$DB_FILE_PATH" ] && [ -s "$DB_FILE_PATH" ]; then
echo "[Backup Loop] 正在检查数据变化..."
echo "[Backup Loop] 正在创建数据库的安全快照..."
sqlite3 "$DB_FILE_PATH" ".backup '$DB_BACKUP_PATH'"
(cd /tmp && mv gpt-load.db.snapshot gpt-load.db)
tar -czf "$BACKUP_ARCHIVE" -C "$DATA_DIR" $(ls -A "$DATA_DIR" | grep -v 'gpt-load.db' || true) -C /tmp gpt-load.db
rm "/tmp/gpt-load.db"
# 关键修复 #2: 将 sha25um 修正为 sha256sum
sha256sum "$BACKUP_ARCHIVE" > "${CHECKSUM_FILE}.new"
if ! cmp -s "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE" 2>/dev/null; then
echo "[Backup Loop] 检测到数据变化,开始上传到 WebDAV..."
if curl --fail --silent --show-error -L -T "$BACKUP_ARCHIVE" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$REMOTE_ARCHIVE_FILENAME"; then
echo "[Backup Loop] WebDAV 备份上传成功。"
mv "${CHECKSUM_FILE}.new" "$CHECKSUM_FILE"
else
echo "[Backup Loop] WebDAV 上传失败!"
rm -f "${CHECKSUM_FILE}.new"
fi
else
echo "[Backup Loop] 数据无变化,跳过本次上传。"
fi
rm -f "$BACKUP_ARCHIVE"
rm -f "${CHECKSUM_FILE}.new"
else
echo "[Backup Loop] 数据库文件不存在或为空,跳过本次备份。"
fi
echo "[Backup Loop] 等待 5 分钟..."
sleep 300
done
) &
}
# --- 主执行流程 (保持不变) ---
restore_from_webdav
echo "[Supervisor] 数据恢复阶段完成。正在后台启动 gpt-load 主服务..."
./gpt-load --port ${PORT:-7860} --host 0.0.0.0 &
GPTLOAD_PID=$!
echo "[Supervisor] gpt-load 服务已启动, PID: ${GPTLOAD_PID}"
start_backup_loop
echo "[Supervisor] 启动完成。脚本将等待主服务 (PID: ${GPTLOAD_PID}) 结束..."
wait $GPTLOAD_PID
echo "[Supervisor] gpt-load 主服务已停止,容器即将退出。" |