mirror of
https://github.com/wolfydw/backup_OBS.git
synced 2026-05-08 06:37:02 +08:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c5b9eec0d | |||
| 1b1c6518ea |
@@ -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 多机发布流程
|
||||||
|
|
||||||
推荐流程:
|
推荐流程:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+36
-17
@@ -11,9 +11,40 @@ tg_code_block() {
|
|||||||
printf '```text\n%s\n```' "$text"
|
printf '```text\n%s\n```' "$text"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TG_LAST_RESPONSE=""
|
||||||
|
|
||||||
|
tg_post_with_retry() {
|
||||||
|
local api_url="$1"
|
||||||
|
local api_label="$2"
|
||||||
|
local message="$3"
|
||||||
|
local response="" attempt
|
||||||
|
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
response="$(curl -sS -X POST "$api_url" \
|
||||||
|
--connect-timeout 5 \
|
||||||
|
--max-time 10 \
|
||||||
|
--data-urlencode "chat_id=${TG_USER_ID}" \
|
||||||
|
--data-urlencode "parse_mode=MarkdownV2" \
|
||||||
|
--data-urlencode "disable_web_page_preview=true" \
|
||||||
|
--data-urlencode "text=${message}" 2>&1 || true)"
|
||||||
|
|
||||||
|
if echo "$response" | grep -q '"ok":true'; then
|
||||||
|
TG_LAST_RESPONSE="$response"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( attempt < 3 )); then
|
||||||
|
log "WARN" "Telegram ${api_label} 第 ${attempt} 次发送失败,将重试: $response"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
TG_LAST_RESPONSE="$response"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
tg_send_message() {
|
tg_send_message() {
|
||||||
local message="${1-}"
|
local message="${1-}"
|
||||||
local response primary_api fallback_api
|
local primary_api fallback_api
|
||||||
|
|
||||||
if [[ -z "${TG_BOT_TOKEN:-}" || -z "${TG_USER_ID:-}" ]]; then
|
if [[ -z "${TG_BOT_TOKEN:-}" || -z "${TG_USER_ID:-}" ]]; then
|
||||||
log "INFO" "未配置Telegram通知,跳过发送"
|
log "INFO" "未配置Telegram通知,跳过发送"
|
||||||
@@ -21,18 +52,12 @@ tg_send_message() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
primary_api="https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage"
|
primary_api="https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage"
|
||||||
response="$(curl -sS -X POST "$primary_api" \
|
if tg_post_with_retry "$primary_api" "official" "$message"; then
|
||||||
--data-urlencode "chat_id=${TG_USER_ID}" \
|
|
||||||
--data-urlencode "parse_mode=MarkdownV2" \
|
|
||||||
--data-urlencode "disable_web_page_preview=true" \
|
|
||||||
--data-urlencode "text=${message}" 2>&1 || true)"
|
|
||||||
|
|
||||||
if echo "$response" | grep -q '"ok":true'; then
|
|
||||||
log "INFO" "Telegram通知发送成功(official)"
|
log "INFO" "Telegram通知发送成功(official)"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "WARN" "Telegram官方API发送失败: $response"
|
log "WARN" "Telegram官方API发送失败: $TG_LAST_RESPONSE"
|
||||||
|
|
||||||
if [[ -z "${TG_API_BASE_FALLBACK:-}" ]]; then
|
if [[ -z "${TG_API_BASE_FALLBACK:-}" ]]; then
|
||||||
log "WARN" "未配置Telegram备用API,通知发送失败"
|
log "WARN" "未配置Telegram备用API,通知发送失败"
|
||||||
@@ -40,18 +65,12 @@ tg_send_message() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
fallback_api="${TG_API_BASE_FALLBACK%/}/bot${TG_BOT_TOKEN}/sendMessage"
|
fallback_api="${TG_API_BASE_FALLBACK%/}/bot${TG_BOT_TOKEN}/sendMessage"
|
||||||
response="$(curl -sS -X POST "$fallback_api" \
|
if tg_post_with_retry "$fallback_api" "fallback" "$message"; then
|
||||||
--data-urlencode "chat_id=${TG_USER_ID}" \
|
|
||||||
--data-urlencode "parse_mode=MarkdownV2" \
|
|
||||||
--data-urlencode "disable_web_page_preview=true" \
|
|
||||||
--data-urlencode "text=${message}" 2>&1 || true)"
|
|
||||||
|
|
||||||
if echo "$response" | grep -q '"ok":true'; then
|
|
||||||
log "INFO" "Telegram通知发送成功(fallback)"
|
log "INFO" "Telegram通知发送成功(fallback)"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "WARN" "Telegram备用API发送失败: $response"
|
log "WARN" "Telegram备用API发送失败: $TG_LAST_RESPONSE"
|
||||||
log "WARN" "Telegram通知发送失败"
|
log "WARN" "Telegram通知发送失败"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
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 checkout "${TARGET_REF}"
|
||||||
git pull --ff-only origin "${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 \
|
||||||
|
|||||||
Reference in New Issue
Block a user