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