File size: 3,207 Bytes
1164e9a
 
 
 
 
 
 
 
 
 
 
420c7cb
1164e9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
420c7cb
 
 
 
1164e9a
420c7cb
 
 
 
1164e9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
420c7cb
1164e9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
420c7cb
1164e9a
 
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
#!/bin/bash
set -e

echo "--- [$(date)] Background Backup Service Initializing ---"

# --- 初始启动延迟 ---
echo "--- [$(date)] Initial startup delay. Waiting 90 seconds before starting backup cycles... ---"
sleep 90

# --- 主循环 ---
while true; do
    # 将环境变量传递给flock内部
    flock -n /tmp/backup.lock bash -c '
        set -e
        echo "--- [$(date)] Starting Scheduled Backup ---"

        # --- 变量与暂存区定义 ---
        LIVE_DATA_DIR="/app/server/storage"
        LIVE_DB_FILE="/app/server/anythingllm.db"
        STAGE_DIR="/tmp/backup_stage"
        
        # --- 步骤 1: 清理并创建干净的暂存区 ---
        echo "[Backup] Preparing a clean staging area at ${STAGE_DIR}..."
        rm -rf "${STAGE_DIR}"
        mkdir -p "${STAGE_DIR}/storage"

        # --- 步骤 2: 安全地创建数据库快照并复制到暂存区 ---
        echo "[Backup] Creating a safe snapshot of the SQLite database..."
        if [ ! -f "${LIVE_DB_FILE}" ]; then
            echo "[Error] Database file not found: ${LIVE_DB_FILE}"
            exit 1
        fi
        sqlite3 "${LIVE_DB_FILE}" ".backup '${STAGE_DIR}/anythingllm.db'"
        if [ $? -ne 0 ]; then
            echo "[Error] Failed to create database backup"
            exit 1
        fi

        # --- 步骤 3: 将线上数据目录同步到暂存区 ---
        echo "[Backup] Syncing live data to the staging area..."
        rsync -a --delete "${LIVE_DATA_DIR}/" "${STAGE_DIR}/storage/"

        # --- 步骤 4: 从隔离的暂存区执行备份 ---
        # --- 4a. WebDAV 备份 ---
        if [ -n "${WEBDAV_URL}" ]; then
            echo "[Backup] Syncing from staging area to WebDAV..."
            rclone sync "${STAGE_DIR}/" "webdav:anythingllm_backup/" --create-empty-src-dirs
            echo "[Backup] WebDAV sync completed."
        fi

        # --- 4b. GitHub 备份 ---
        if [ -n "${GITHUB_REPO}" ]; then
            echo "[Backup] Pushing from staging area to GitHub..."
            cd "${STAGE_DIR}"
            if [ ! -d ".git" ]; then
                git init -b main
                git config --global user.email "backup-bot@example.com"
                git config --global user.name "Backup Bot"
                git remote add origin https://${GITHUB_TOKEN}@github.com/${GITHUB_REPO}
            fi
            git add .
            if ! git diff-index --quiet HEAD --; then
                git commit -m "Automated backup: $(date -u)"
                git push -u origin main -f
                echo "[Backup] Pushed changes to GitHub."
            else
                echo "[Backup] No changes to commit to GitHub."
            fi
        fi

        # --- 步骤 5: 清理暂存区 ---
        echo "[Backup] Cleaning up staging area..."
        rm -rf "${STAGE_DIR}"

        # --- 步骤 6: 发送成功心跳 ---
        if [ -n "${HEALTHCHECK_URL}" ]; then
            echo "[Backup] Sending success ping..."
            curl -fsS -m 10 --retry 3 ${HEALTHCHECK_URL} > /dev/null || echo "[Warning] Health check ping failed."
        fi

        echo "--- [$(date)] Backup Finished ---"
    ' "${BACKUP_INTERVAL:-3600}"
    sleep ${BACKUP_INTERVAL:-3600}
done