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