JerryZhouYG commited on
Commit
208e30b
·
verified ·
1 Parent(s): d0a963e

Update sync_data.sh

Browse files
Files changed (1) hide show
  1. sync_data.sh +61 -45
sync_data.sh CHANGED
@@ -1,4 +1,5 @@
1
  #!/bin/bash
 
2
 
3
  # 检查必要的环境变量
4
  if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
@@ -12,6 +13,7 @@ IFS='/' read -r GITHUB_USER GITHUB_REPO <<< "$G_NAME"
12
  # 构建 GitHub 仓库的克隆 URL,包含令牌
13
  REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
14
  mkdir -p ./data/github_data
 
15
  # 克隆仓库
16
  echo "正在克隆仓库……"
17
  git clone "$REPO_URL" ./data/github_data || {
@@ -26,79 +28,93 @@ else
26
  echo "GitHub 仓库中未找到 webui.db,将在同步时推送"
27
  fi
28
 
29
- # 定义同步函数,要求在北京时间每天 08:00~24:00 每逢整点执行同步
30
  sync_data() {
31
  while true; do
32
- # 计算下一个整点的候选同步时间(按照北京时间 Asia/Shanghai
33
- # 先取当前北京时间整点后加 1 小时
34
- candidate=$(TZ=Asia/Shanghai date -d "$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:00:00') +1 hour" +%s)
35
- # 获取候选时间对应的“小时”(去掉前导0)
36
- candidate_hour=$(TZ=Asia/Shanghai date -d "@$candidate" +%H | sed 's/^0*//')
37
- # 若候选时间处于凌晨 1~7 点(即北京时间 01:00~07:00),则调整为下一天 08:00
38
- if [ -n "$candidate_hour" ] && [ "$candidate_hour" -ge 1 ] && [ "$candidate_hour" -le 7 ]; then
39
- candidate=$(TZ=Asia/Shanghai date -d 'tomorrow 08:00:00' +%s)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  fi
41
 
42
- # 计算等待的秒数
43
- now=$(date +%s)
44
- sleep_seconds=$((candidate - now))
45
- if [ $sleep_seconds -le 0 ]; then
46
- sleep_seconds=1
47
  fi
48
- echo "等待 ${sleep_seconds} 秒到达下一个同步时间(北京时间 $(TZ=Asia/Shanghai date -d "@$candidate" '+%Y-%m-%d %H:%M:%S'))..."
49
- sleep $sleep_seconds
50
 
51
- echo "开始同步操作,当前北京时间:$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')"
52
-
 
 
 
 
53
  # 1. 同步到 GitHub
54
- echo "正在开始 GitHub 同步"
55
- # 进入仓库目录
56
- cd ./data/github_data || exit 1
57
- # 配置 Git 用户信息
58
  git config user.name "AutoSync Bot"
59
  git config user.email "[email protected]"
60
 
61
- # 确保在正确的分支
62
  git checkout main 2>/dev/null || git checkout master
63
 
64
- # 复制最新的数据库文件
65
  if [ -f "../webui.db" ]; then
66
  cp ../webui.db ./webui.db
67
  else
68
- echo "数据库尚未初始化"
69
  fi
70
-
71
  # 检查是否有变化
72
  if [[ -n $(git status -s) ]]; then
73
- # 添加所有变更
74
  git add webui.db
75
-
76
- # 提交变更
77
- git commit -m "Auto sync webui.db $(date '+%Y-%m-%d %H:%M:%S')"
78
-
79
- # 推送到远程仓库
80
  git push origin HEAD && {
81
  echo "GitHub 推送成功"
82
- }|| {
83
  echo "推送失败,等待重试..."
84
  sleep 10
85
  git push origin HEAD || {
86
- echo "重试失败,放弃推送到 Github。"
87
  }
88
  }
89
  else
90
- echo "GitHub: 没有检测到数据库变化"
91
  fi
92
-
93
- # 返回上级目录
94
- cd - > /dev/null
95
-
96
- # 2. 同步到 WebDAV
97
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
98
  echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
99
  else
100
- echo "正在同步到 WebDAV..."
101
- FILENAME="webui_$(date +'%m_%d').db"
102
  if [ -f ./data/webui.db ]; then
103
  curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
104
  echo "WebDAV 上传成功"
@@ -110,12 +126,12 @@ sync_data() {
110
  }
111
  }
112
  else
113
- echo "未找到 webui.db 文件,跳过 WebDAV 同步"
114
  fi
115
  fi
116
 
117
- echo "同步完成,等待下次同步……"
118
- # 由于同步结束后循环会重新计算下一次候选同步时间,因此无需统一的间隔设定
119
  done
120
  }
121
 
 
1
  #!/bin/bash
2
+ # 注意:确保脚本执行时系统中已安装 date、git、curl 等工具,并设置好 TZ 时区环境(可在每个 date 命令中临时指定时区)
3
 
4
  # 检查必要的环境变量
5
  if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
 
13
  # 构建 GitHub 仓库的克隆 URL,包含令牌
14
  REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
15
  mkdir -p ./data/github_data
16
+
17
  # 克隆仓库
18
  echo "正在克隆仓库……"
19
  git clone "$REPO_URL" ./data/github_data || {
 
28
  echo "GitHub 仓库中未找到 webui.db,将在同步时推送"
29
  fi
30
 
31
+ # 定义同步函数,按照北京时间 08:00~24:00(包含整点同步)的要求
32
  sync_data() {
33
  while true; do
34
+ # 使用 Asia/Shanghai 时区获取当前时间及其组成部分
35
+ CURRENT_TS=$(TZ=Asia/Shanghai date +%s)
36
+ CURRENT_DATE=$(TZ=Asia/Shanghai date '+%Y-%m-%d')
37
+ CURRENT_HOUR=$(TZ=Asia/Shanghai date +%H) # 00~23
38
+ CURRENT_MIN=$(TZ=Asia/Shanghai date +%M)
39
+ CURRENT_SEC=$(TZ=Asia/Shanghai date +%S)
40
+
41
+ # 计算下一次同步的目标时间戳(北京时间)
42
+ # 如果当前时间早于 08:00,则目标为今天 08:00
43
+ if [ "$CURRENT_HOUR" -lt 8 ]; then
44
+ TARGET_TS=$(TZ=Asia/Shanghai date -d "${CURRENT_DATE} 08:00:00" +%s)
45
+ # 如果在 08:00 至 22:59,则下一个整点在当日
46
+ elif [ "$CURRENT_HOUR" -ge 8 ] && [ "$CURRENT_HOUR" -lt 23 ]; then
47
+ # 如果正好在整点(秒与分都为 0)则立刻同步
48
+ if [ "$CURRENT_MIN" -eq 0 ] && [ "$CURRENT_SEC" -eq 0 ]; then
49
+ TARGET_TS=$CURRENT_TS
50
+ else
51
+ NEXT_HOUR=$((10#$CURRENT_HOUR + 1))
52
+ TARGET_TS=$(TZ=Asia/Shanghai date -d "${CURRENT_DATE} ${NEXT_HOUR}:00:00" +%s)
53
+ fi
54
+ # 如果当前时间处于 23:00~23:59,则下次目标为次日 00:00(也就是24:00同步)
55
+ else # CURRENT_HOUR == 23
56
+ if [ "$CURRENT_MIN" -eq 0 ] && [ "$CURRENT_SEC" -eq 0 ]; then
57
+ TARGET_TS=$CURRENT_TS
58
+ else
59
+ TOMORROW=$(TZ=Asia/Shanghai date -d "tomorrow" '+%Y-%m-%d')
60
+ TARGET_TS=$(TZ=Asia/Shanghai date -d "${TOMORROW} 00:00:00" +%s)
61
+ fi
62
  fi
63
 
64
+ # 计算等待时间(若正好同步时则 sleep_time 为 0)
65
+ SLEEP_TIME=$(( TARGET_TS - CURRENT_TS ))
66
+ if [ "$SLEEP_TIME" -gt 0 ]; then
67
+ echo "距离下一次同步还有 ${SLEEP_TIME} 秒(北京时间下次同步时间为 $(TZ=Asia/Shanghai date -d "@$TARGET_TS" '+%Y-%m-%d %H:%M:%S'))"
68
+ sleep "$SLEEP_TIME"
69
  fi
 
 
70
 
71
+ # 同步时输出当前北京时间
72
+ CURRENT_TIME=$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')
73
+ echo "当前时间 $CURRENT_TIME"
74
+
75
+ # ---- 开始同步流程 ----
76
+
77
  # 1. 同步到 GitHub
78
+ echo "开始执行 GitHub 同步……"
79
+ cd ./data/github_data || { echo "切换目录失败"; exit 1; }
 
 
80
  git config user.name "AutoSync Bot"
81
  git config user.email "[email protected]"
82
 
83
+ # 确保在 main 分支,如切换失败则尝试 master 分支
84
  git checkout main 2>/dev/null || git checkout master
85
 
86
+ # 将最新数据库文件复制到仓库目录下
87
  if [ -f "../webui.db" ]; then
88
  cp ../webui.db ./webui.db
89
  else
90
+ echo "数据库尚未初始化"
91
  fi
92
+
93
  # 检查是否有变化
94
  if [[ -n $(git status -s) ]]; then
 
95
  git add webui.db
96
+ git commit -m "Auto sync webui.db $(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')"
 
 
 
 
97
  git push origin HEAD && {
98
  echo "GitHub 推送成功"
99
+ } || {
100
  echo "推送失败,等待重试..."
101
  sleep 10
102
  git push origin HEAD || {
103
+ echo "重试失败,放弃推送到 GitHub。"
104
  }
105
  }
106
  else
107
+ echo "GitHub:没有检测到数据库变化"
108
  fi
109
+ # 返回主目录
110
+ cd ../..
111
+
112
+ # 2. 同步到 WebDAV(若环境变量配置完整)
 
113
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
114
  echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
115
  else
116
+ echo "开始执行 WebDAV 同步……"
117
+ FILENAME="webui_$(TZ=Asia/Shanghai date +'%m_%d').db"
118
  if [ -f ./data/webui.db ]; then
119
  curl -T ./data/webui.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
120
  echo "WebDAV 上传成功"
 
126
  }
127
  }
128
  else
129
+ echo "未找到 webui.db 文件,跳过 WebDAV 同步。"
130
  fi
131
  fi
132
 
133
+ # ---- 同步流程结束,下一轮循环会根据当前北京时间自动计算等待时长 ----
134
+
135
  done
136
  }
137