|
|
#!/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" |
|
|
|
|
|
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" |
|
|
|
|
|
|
|
|
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 主服务已停止,容器即将退出。" |