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