diff --git a/README.md b/README.md index d664d97..c4793fe 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ cp exclude.user.list.example exclude.user.list - `BACKUP_DIRS`:要备份的目录,使用多行格式,每行一个目录 - `TG_BOT_TOKEN` / `TG_USER_ID`:Telegram 通知配置,可留空 - `TG_API_BASE_FALLBACK`:可选,自建 Telegram API 地址;官方失败时自动回退 +- `GIT_REMOTE_FALLBACK`:可选,`origin` 不可访问时使用的公开 Git 镜像地址 `BACKUP_DIRS` 示例: @@ -138,6 +139,7 @@ crontab -l 它会执行: - `git fetch --tags origin` +- 如果 `origin` 不可用且配置了 `GIT_REMOTE_FALLBACK`,自动回退到备用仓库 - 默认更新 `stable` 分支,或切换到你指定的 tag / 分支 - 修正脚本执行权限 @@ -157,6 +159,14 @@ crontab -l - `systemd timer`:负责定时执行 `./update.sh stable` - `cron`:负责每天 `03:00` 执行一次 `./backup.sh` +如果你有国内镜像仓库,可以在 `env.conf` 中配置: + +```bash +GIT_REMOTE_FALLBACK="https://gitea.ydw.cool/wolfydw/backup_OBS.git" +``` + +这样 `update.sh` 会优先从 GitHub 的 `origin` 更新,失败后自动回退到这个公开 Gitea 仓库。 + ## GitHub 多机发布流程 推荐流程: diff --git a/env.conf.example b/env.conf.example index 628a391..d3c2974 100644 --- a/env.conf.example +++ b/env.conf.example @@ -8,6 +8,9 @@ TG_BOT_TOKEN="" # 留空表示不启用 TG_USER_ID="" # 留空表示不启用 TG_API_BASE_FALLBACK="" # 可选:官方失败时使用的自建Telegram API地址 +# 更新仓库备用地址 +GIT_REMOTE_FALLBACK="" # 可选:origin 无法访问时使用的公开 Git 镜像地址 + # 备份目录,使用多行格式;每行一个目录 BACKUP_DIRS=$(cat <<'EOF' /root/data diff --git a/update.sh b/update.sh index 96def82..e79ef35 100755 --- a/update.sh +++ b/update.sh @@ -4,6 +4,12 @@ set -Eeuo pipefail SCRIPT_PATH="${BASH_SOURCE[0]:-$0}" SCRIPT_DIR="$(cd "$(dirname -- "$SCRIPT_PATH")" && pwd -P)" cd "$SCRIPT_DIR" +CONF_FILE="${SCRIPT_DIR}/env.conf" + +if [[ -f "$CONF_FILE" ]]; then + # shellcheck disable=SC1090 + source "$CONF_FILE" +fi usage() { cat <<'USAGE' @@ -13,6 +19,7 @@ usage() { 说明: - 不带参数时,默认更新 stable 分支 - 带参数时,可以切换到指定分支或 tag + - 默认从 origin 更新;如果失败且配置了 GIT_REMOTE_FALLBACK,则自动回退到备用仓库 USAGE } @@ -32,17 +39,46 @@ need_cmd git need_cmd bash TARGET_REF="${1:-}" +UPDATE_SOURCE="origin" if [[ -z "$TARGET_REF" ]]; then TARGET_REF="stable" fi -git fetch --tags origin +fetch_from_origin() { + git fetch --tags origin +} + +fetch_from_fallback() { + [[ -n "${GIT_REMOTE_FALLBACK:-}" ]] || return 1 + git fetch --tags "${GIT_REMOTE_FALLBACK}" \ + "+refs/heads/*:refs/remotes/fallback/*" \ + "+refs/tags/*:refs/tags/*" +} + +if fetch_from_origin; then + UPDATE_SOURCE="origin" +elif fetch_from_fallback; then + UPDATE_SOURCE="fallback" + echo "origin 更新失败,已回退到备用仓库:${GIT_REMOTE_FALLBACK}" +else + echo "更新失败:origin 不可用,且备用仓库也不可用" >&2 + exit 2 +fi if git show-ref --verify --quiet "refs/tags/${TARGET_REF}"; then git checkout "${TARGET_REF}" else - git checkout "${TARGET_REF}" - git pull --ff-only origin "${TARGET_REF}" + if ! git show-ref --verify --quiet "refs/remotes/${UPDATE_SOURCE}/${TARGET_REF}"; then + echo "未找到目标分支:${TARGET_REF}(来源:${UPDATE_SOURCE})" >&2 + exit 2 + fi + + if git show-ref --verify --quiet "refs/heads/${TARGET_REF}"; then + git checkout "${TARGET_REF}" + git merge --ff-only "refs/remotes/${UPDATE_SOURCE}/${TARGET_REF}" + else + git checkout -B "${TARGET_REF}" "refs/remotes/${UPDATE_SOURCE}/${TARGET_REF}" + fi fi chmod 755 \