File size: 4,598 Bytes
93409a3
30b021f
54a3e04
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
96645ff
 
54a3e04
 
 
96645ff
54a3e04
96645ff
 
d0a963e
96645ff
 
d0a963e
 
 
 
 
 
 
 
 
93409a3
d0a963e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93409a3
d0a963e
 
96645ff
93409a3
 
d0a963e
93409a3
96645ff
54a3e04
d0a963e
 
96645ff
 
 
54a3e04
96645ff
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/bash

# 检查必要的环境变量
if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
    echo "缺少必要的环境变量 G_NAME 或 G_TOKEN"
    exit 1
fi

# 解析仓库名和用户名
IFS='/' read -r GITHUB_USER GITHUB_REPO <<< "$G_NAME"

# 构建 GitHub 仓库的克隆 URL,包含令牌
REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
mkdir -p  ./data/github_data
# 克隆仓库
echo "正在克隆仓库……"
git clone "$REPO_URL" ./data/github_data || {
    echo "克隆失败,请检查 G_NAME 和 G_TOKEN 是否正确。"
    exit 1
}

if [ -f ./data/github_data/webui.db ]; then
    cp ./data/github_data/webui.db ./data/webui.db
    echo "从 GitHub 仓库中拉取成功"
else
    echo "GitHub 仓库中未找到 webui.db,将在同步时推送"
fi

# 定义同步函数,要求在北京时间每天 08:00~24:00 每逢整点执行同步
sync_data() {
    while true; do
        # 计算下一个整点的候选同步时间(按照北京时间 Asia/Shanghai)
        # 先取当前北京时间整点后加 1 小时
        candidate=$(TZ=Asia/Shanghai date -d "$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:00:00') +1 hour" +%s)
        # 获取候选时间对应的“小时”(去掉前导0)
        candidate_hour=$(TZ=Asia/Shanghai date -d "@$candidate" +%H | sed 's/^0*//')
        # 若候选时间处于凌晨 1~7 点(即北京时间 01:00~07:00),则调整为下一天 08:00
        if [ -n "$candidate_hour" ] && [ "$candidate_hour" -ge 1 ] && [ "$candidate_hour" -le 7 ]; then
            candidate=$(TZ=Asia/Shanghai date -d 'tomorrow 08:00:00' +%s)
        fi

        # 计算等待的秒数
        now=$(date +%s)
        sleep_seconds=$((candidate - now))
        if [ $sleep_seconds -le 0 ]; then 
            sleep_seconds=1 
        fi
        echo "等待 ${sleep_seconds} 秒到达下一个同步时间(北京时间 $(TZ=Asia/Shanghai date -d "@$candidate" '+%Y-%m-%d %H:%M:%S'))..."
        sleep $sleep_seconds

        echo "开始同步操作,当前北京时间:$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')"
        
        # 1. 同步到 GitHub
        echo "正在开始 GitHub 同步"
        # 进入仓库目录
        cd ./data/github_data || exit 1
        # 配置 Git 用户信息
        git config user.name "AutoSync Bot"
        git config user.email "[email protected]"

        # 确保在正确的分支
        git checkout main 2>/dev/null || git checkout master

        # 复制最新的数据库文件
        if [ -f "../webui.db" ]; then  
            cp ../webui.db ./webui.db  
        else  
            echo "数据库尚未初始化"  
        fi 
        
        # 检查是否有变化
        if [[ -n $(git status -s) ]]; then
            # 添加所有变更
            git add webui.db

            # 提交变更
            git commit -m "Auto sync webui.db $(date '+%Y-%m-%d %H:%M:%S')"

            # 推送到远程仓库
            git push origin HEAD && {
                echo "GitHub 推送成功"
            }|| {
                echo "推送失败,等待重试..."
                sleep 10
                git push origin HEAD || {
                    echo "重试失败,放弃推送到 Github。"
                }
            }
        else
            echo "GitHub: 没有检测到数据库变化"
        fi
        
        # 返回上级目录
        cd - > /dev/null
        
        # 2. 同步到 WebDAV
        if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
            echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
        else
            echo "正在同步到 WebDAV..."
            FILENAME="webui_$(date +'%m_%d').db"
            if [ -f ./data/webui.db ]; then
                curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
                    echo "WebDAV 上传成功"
                } || {
                    echo "WebDAV 上传失败,等待重试..."
                    sleep 10
                    curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
                        echo "重试失败,放弃 WebDAV 上传。"
                    }
                }
            else
                echo "未找到 webui.db 文件,跳过 WebDAV 同步"
            fi
        fi

        echo "同步完成,等待下次同步……"
        # 由于同步结束后循环会重新计算下一次候选同步时间,因此无需统一的间隔设定
    done
}

# 后台启动同步进程
sync_data &