gptload / start.sh
rytfh's picture
Update start.sh
6319970 verified
#!/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 主服务已停止,容器即将退出。"