hequ commited on
Commit
9cf6ba2
·
verified ·
1 Parent(s): 5bfb40b

Update tools/hf-backup.sh

Browse files
Files changed (1) hide show
  1. tools/hf-backup.sh +83 -14
tools/hf-backup.sh CHANGED
@@ -1,21 +1,90 @@
1
- #!/usr/bin/env sh
 
2
  set -e
3
 
4
- if [ -z "${HF_TOKEN:-}" ] || [ -z "${DATASET_ID:-}" ]; then
5
- echo "[backup] HF_TOKEN/DATASET_ID 未设置,跳过备份功能"
6
- exit 0
7
- fi
 
8
 
9
  SYNC_INTERVAL="${SYNC_INTERVAL:-3600}"
10
- export HF_TOKEN DATASET_ID MAX_BACKUPS BACKUP_PATHS BACKUP_PREFIX
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
- python3 /app/tools/hf_backup.py restore || true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- trap 'echo "[backup] 收到停止信号,执行最后一次备份"; python3 /app/tools/hf_backup.py backup || true; exit 0' TERM INT
 
 
 
 
 
 
 
 
 
15
 
16
- while true; do
17
- echo "[backup] 执行备份..."
18
- python3 /app/tools/hf_backup.py backup || true
19
- echo "[backup] 休眠 ${SYNC_INTERVAL}s"
20
- sleep "${SYNC_INTERVAL}"
21
- done
 
1
+ #!/bin/sh
2
+
3
  set -e
4
 
5
+ TS(){ date "+%Y-%m-%d %H:%M:%S"; }
6
+ log(){ echo "[$(TS)] [hf-backup] $*"; }
7
+
8
+ HF_TOKEN="${HF_TOKEN:-}"
9
+ DATASET_ID="${DATASET_ID:-}"
10
 
11
  SYNC_INTERVAL="${SYNC_INTERVAL:-3600}"
12
+ MAX_BACKUPS="${MAX_BACKUPS:-10}"
13
+ BACKUP_PREFIX="${BACKUP_PREFIX:-crs_backup}"
14
+ BACKUP_PATHS="${BACKUP_PATHS:-/app/data}"
15
+ BACKUP_EXCLUDE="${BACKUP_EXCLUDE:-/app/data/init.json,/app/data/users.json,*.db}"
16
+
17
+ HF_PY="/app/tools/hf_backup.py"
18
+ TMP_DIR="/tmp/crs_backup"
19
+ mkdir -p "${TMP_DIR}"
20
+
21
+ need_hf() {
22
+ if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_ID" ]; then
23
+ log "HF_TOKEN/DATASET_ID 缺失,无法使用备份功能"; exit 1
24
+ fi
25
+ }
26
+
27
+ mk_archive() {
28
+ ts="$(date +%Y%m%d_%H%M%S)"
29
+ archive="${TMP_DIR}/${BACKUP_PREFIX}_${ts}.tar.gz"
30
+
31
+ EX=#
32
+ IFS=','; for x in $BACKUP_EXCLUDE; do EX="$EX --exclude=$x"; done; unset IFS
33
+
34
+ IFS=','; set -- $BACKUP_PATHS; unset IFS
35
+
36
+ log "创建归档:$archive"
37
+ # 使用 -C / 以绝对路径打包,解压时可直接 -C / 还原
38
+ # shellcheck disable=SC2086
39
+ tar -czf "$archive" $EX -C / "$@"
40
+ echo "$archive"
41
+ }
42
+
43
+ cmd_upload_once() {
44
+ need_hf
45
+ archive="$(mk_archive)"
46
+ log "上传:$archive"
47
+ python3 "$HF_PY" upload \
48
+ --token "$HF_TOKEN" \
49
+ --repo "$DATASET_ID" \
50
+ --file "$archive" \
51
+ --prefix "$BACKUP_PREFIX" \
52
+ --max "$MAX_BACKUPS"
53
+ rm -f "$archive" || true
54
+ log "上传完成"
55
+ }
56
 
57
+ cmd_restore() {
58
+ need_hf
59
+ out="$(python3 "$HF_PY" restore --token "$HF_TOKEN" --repo "$DATASET_ID" --prefix "$BACKUP_PREFIX" 2>/dev/null || true)"
60
+ if [ -z "$out" ]; then
61
+ log "未找到可恢复的备份,跳过。"
62
+ exit 0
63
+ fi
64
+ # python 仅输出本地文件路径
65
+ latest_file="$out"
66
+ if [ ! -f "$latest_file" ]; then
67
+ log "本地文件不存在:$latest_file"; exit 1
68
+ fi
69
+ log "解压:$latest_file -> /"
70
+ tar -xzf "$latest_file" -C /
71
+ log "恢复完成"
72
+ }
73
 
74
+ cmd_daemon() {
75
+ need_hf
76
+ while :; do
77
+ log "开始周期备份(间隔 ${SYNC_INTERVAL}s,前缀 ${BACKUP_PREFIX},保留 ${MAX_BACKUPS})"
78
+ if ! cmd_upload_once; then
79
+ log "本轮备份失败(忽略,等待下次循环)"
80
+ fi
81
+ sleep "$SYNC_INTERVAL"
82
+ done
83
+ }
84
 
85
+ case "${1:-}" in
86
+ restore) cmd_restore ;;
87
+ once) cmd_upload_once ;;
88
+ daemon) cmd_daemon ;;
89
+ *) echo "用法: $0 {restore|once|daemon}"; exit 1 ;;
90
+ esac