Update tools/hf-backup.sh
Browse files- tools/hf-backup.sh +12 -11
tools/hf-backup.sh
CHANGED
|
@@ -4,20 +4,20 @@
|
|
| 4 |
set -e
|
| 5 |
|
| 6 |
TS(){ date "+%Y-%m-%d %H:%M:%S"; }
|
| 7 |
-
log(){ echo "[$(TS)] [hf-backup] $*"; }
|
| 8 |
|
| 9 |
HF_TOKEN="${HF_TOKEN:-}"
|
| 10 |
DATASET_ID="${DATASET_ID:-}"
|
| 11 |
|
| 12 |
-
# 备份
|
| 13 |
SYNC_INTERVAL="${SYNC_INTERVAL:-3600}"
|
| 14 |
MAX_BACKUPS="${MAX_BACKUPS:-10}"
|
| 15 |
BACKUP_PREFIX="${BACKUP_PREFIX:-crs_backup}"
|
| 16 |
|
| 17 |
-
#
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
BACKUP_EXCLUDE="${BACKUP_EXCLUDE:-app/data/init.json,app/data/users.json,*.
|
| 21 |
|
| 22 |
HF_PY="/app/tools/hf_backup.py"
|
| 23 |
TMP_DIR="/tmp/crs_backup"
|
|
@@ -33,10 +33,10 @@ mk_archive() {
|
|
| 33 |
ts="$(date +%Y%m%d_%H%M%S)"
|
| 34 |
archive="${TMP_DIR}/${BACKUP_PREFIX}_${ts}.tar.gz"
|
| 35 |
|
| 36 |
-
# 构造 tar 参数
|
| 37 |
set -- -czf "$archive"
|
| 38 |
|
| 39 |
-
# --exclude
|
| 40 |
IFS=','; for x in $BACKUP_EXCLUDE; do
|
| 41 |
[ -z "$x" ] && continue
|
| 42 |
case "$x" in /*) x=${x#/} ;; esac
|
|
@@ -46,7 +46,7 @@ mk_archive() {
|
|
| 46 |
# 切到根目录
|
| 47 |
set -- "$@" -C /
|
| 48 |
|
| 49 |
-
#
|
| 50 |
IFS=','; for p in $BACKUP_PATHS; do
|
| 51 |
[ -z "$p" ] && continue
|
| 52 |
case "$p" in /*) p=${p#/} ;; esac
|
|
@@ -60,7 +60,8 @@ mk_archive() {
|
|
| 60 |
|
| 61 |
cmd_upload_once() {
|
| 62 |
need_hf
|
| 63 |
-
archive="$(mk_archive)"
|
|
|
|
| 64 |
log "上传:$archive"
|
| 65 |
python3 "$HF_PY" upload \
|
| 66 |
--token "$HF_TOKEN" \
|
|
@@ -103,5 +104,5 @@ case "${1:-}" in
|
|
| 103 |
restore) cmd_restore ;;
|
| 104 |
once) cmd_upload_once ;;
|
| 105 |
daemon) cmd_daemon ;;
|
| 106 |
-
*) echo "用法: $0 {restore|once|daemon}"; exit 1 ;;
|
| 107 |
esac
|
|
|
|
| 4 |
set -e
|
| 5 |
|
| 6 |
TS(){ date "+%Y-%m-%d %H:%M:%S"; }
|
| 7 |
+
log(){ echo "[$(TS)] [hf-backup] $*" >&2; } # 日志走 stderr,避免污染命令替换
|
| 8 |
|
| 9 |
HF_TOKEN="${HF_TOKEN:-}"
|
| 10 |
DATASET_ID="${DATASET_ID:-}"
|
| 11 |
|
| 12 |
+
# 备份配置(相对路径更稳,和 -C / 配合)
|
| 13 |
SYNC_INTERVAL="${SYNC_INTERVAL:-3600}"
|
| 14 |
MAX_BACKUPS="${MAX_BACKUPS:-10}"
|
| 15 |
BACKUP_PREFIX="${BACKUP_PREFIX:-crs_backup}"
|
| 16 |
|
| 17 |
+
# 建议默认:数据目录 +(如有)redis 数据目录
|
| 18 |
+
BACKUP_PATHS="${BACKUP_PATHS:-app/data,app/data/redis}"
|
| 19 |
+
# 公开/半公开 dataset 可以更激进地排除敏感文件
|
| 20 |
+
BACKUP_EXCLUDE="${BACKUP_EXCLUDE:-app/data/init.json,app/data/users.json,*.tmp,*.cache,**/.DS_Store}"
|
| 21 |
|
| 22 |
HF_PY="/app/tools/hf_backup.py"
|
| 23 |
TMP_DIR="/tmp/crs_backup"
|
|
|
|
| 33 |
ts="$(date +%Y%m%d_%H%M%S)"
|
| 34 |
archive="${TMP_DIR}/${BACKUP_PREFIX}_${ts}.tar.gz"
|
| 35 |
|
| 36 |
+
# 构造 tar 参数(安全,不受空格/通配影响)
|
| 37 |
set -- -czf "$archive"
|
| 38 |
|
| 39 |
+
# --exclude
|
| 40 |
IFS=','; for x in $BACKUP_EXCLUDE; do
|
| 41 |
[ -z "$x" ] && continue
|
| 42 |
case "$x" in /*) x=${x#/} ;; esac
|
|
|
|
| 46 |
# 切到根目录
|
| 47 |
set -- "$@" -C /
|
| 48 |
|
| 49 |
+
# 打包路径
|
| 50 |
IFS=','; for p in $BACKUP_PATHS; do
|
| 51 |
[ -z "$p" ] && continue
|
| 52 |
case "$p" in /*) p=${p#/} ;; esac
|
|
|
|
| 60 |
|
| 61 |
cmd_upload_once() {
|
| 62 |
need_hf
|
| 63 |
+
archive="$(mk_archive)" # 只捕获 stdout 的“文件路径”这一行
|
| 64 |
+
[ -f "$archive" ] || { log "归档不存在:$archive"; return 1; }
|
| 65 |
log "上传:$archive"
|
| 66 |
python3 "$HF_PY" upload \
|
| 67 |
--token "$HF_TOKEN" \
|
|
|
|
| 104 |
restore) cmd_restore ;;
|
| 105 |
once) cmd_upload_once ;;
|
| 106 |
daemon) cmd_daemon ;;
|
| 107 |
+
*) echo "用法: $0 {restore|once|daemon}" >&2; exit 1 ;;
|
| 108 |
esac
|