Add fallback Git remote for updates

This commit is contained in:
Codex
2026-03-17 13:37:59 +08:00
parent 1b1c6518ea
commit 8c5b9eec0d
3 changed files with 52 additions and 3 deletions
+10
View File
@@ -23,6 +23,7 @@ cp exclude.user.list.example exclude.user.list
- `BACKUP_DIRS`:要备份的目录,使用多行格式,每行一个目录 - `BACKUP_DIRS`:要备份的目录,使用多行格式,每行一个目录
- `TG_BOT_TOKEN` / `TG_USER_ID`Telegram 通知配置,可留空 - `TG_BOT_TOKEN` / `TG_USER_ID`Telegram 通知配置,可留空
- `TG_API_BASE_FALLBACK`:可选,自建 Telegram API 地址;官方失败时自动回退 - `TG_API_BASE_FALLBACK`:可选,自建 Telegram API 地址;官方失败时自动回退
- `GIT_REMOTE_FALLBACK`:可选,`origin` 不可访问时使用的公开 Git 镜像地址
`BACKUP_DIRS` 示例: `BACKUP_DIRS` 示例:
@@ -138,6 +139,7 @@ crontab -l
它会执行: 它会执行:
- `git fetch --tags origin` - `git fetch --tags origin`
- 如果 `origin` 不可用且配置了 `GIT_REMOTE_FALLBACK`,自动回退到备用仓库
- 默认更新 `stable` 分支,或切换到你指定的 tag / 分支 - 默认更新 `stable` 分支,或切换到你指定的 tag / 分支
- 修正脚本执行权限 - 修正脚本执行权限
@@ -157,6 +159,14 @@ crontab -l
- `systemd timer`:负责定时执行 `./update.sh stable` - `systemd timer`:负责定时执行 `./update.sh stable`
- `cron`:负责每天 `03:00` 执行一次 `./backup.sh` - `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 多机发布流程 ## GitHub 多机发布流程
推荐流程: 推荐流程:
+3
View File
@@ -8,6 +8,9 @@ TG_BOT_TOKEN="" # 留空表示不启用
TG_USER_ID="" # 留空表示不启用 TG_USER_ID="" # 留空表示不启用
TG_API_BASE_FALLBACK="" # 可选:官方失败时使用的自建Telegram API地址 TG_API_BASE_FALLBACK="" # 可选:官方失败时使用的自建Telegram API地址
# 更新仓库备用地址
GIT_REMOTE_FALLBACK="" # 可选:origin 无法访问时使用的公开 Git 镜像地址
# 备份目录,使用多行格式;每行一个目录 # 备份目录,使用多行格式;每行一个目录
BACKUP_DIRS=$(cat <<'EOF' BACKUP_DIRS=$(cat <<'EOF'
/root/data /root/data
+39 -3
View File
@@ -4,6 +4,12 @@ set -Eeuo pipefail
SCRIPT_PATH="${BASH_SOURCE[0]:-$0}" SCRIPT_PATH="${BASH_SOURCE[0]:-$0}"
SCRIPT_DIR="$(cd "$(dirname -- "$SCRIPT_PATH")" && pwd -P)" SCRIPT_DIR="$(cd "$(dirname -- "$SCRIPT_PATH")" && pwd -P)"
cd "$SCRIPT_DIR" cd "$SCRIPT_DIR"
CONF_FILE="${SCRIPT_DIR}/env.conf"
if [[ -f "$CONF_FILE" ]]; then
# shellcheck disable=SC1090
source "$CONF_FILE"
fi
usage() { usage() {
cat <<'USAGE' cat <<'USAGE'
@@ -13,6 +19,7 @@ usage() {
说明: 说明:
- 不带参数时,默认更新 stable 分支 - 不带参数时,默认更新 stable 分支
- 带参数时,可以切换到指定分支或 tag - 带参数时,可以切换到指定分支或 tag
- 默认从 origin 更新;如果失败且配置了 GIT_REMOTE_FALLBACK,则自动回退到备用仓库
USAGE USAGE
} }
@@ -32,17 +39,46 @@ need_cmd git
need_cmd bash need_cmd bash
TARGET_REF="${1:-}" TARGET_REF="${1:-}"
UPDATE_SOURCE="origin"
if [[ -z "$TARGET_REF" ]]; then if [[ -z "$TARGET_REF" ]]; then
TARGET_REF="stable" TARGET_REF="stable"
fi 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 if git show-ref --verify --quiet "refs/tags/${TARGET_REF}"; then
git checkout "${TARGET_REF}" git checkout "${TARGET_REF}"
else else
git checkout "${TARGET_REF}" if ! git show-ref --verify --quiet "refs/remotes/${UPDATE_SOURCE}/${TARGET_REF}"; then
git pull --ff-only origin "${TARGET_REF}" 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 fi
chmod 755 \ chmod 755 \