#!/usr/bin/env bash # upgrade.sh — XuqmGroup 私有化部署一键升级脚本 # # 用法一(推荐,先下载再审查): # curl -fsSL https://xuqinmin.com/xuqmGroup/XuqmGroup-PrivateDeploy/raw/branch/main/upgrade.sh \ # -o upgrade.sh && bash upgrade.sh # # 用法二(直接执行,保留终端交互): # bash <(curl -fsSL https://xuqinmin.com/xuqmGroup/XuqmGroup-PrivateDeploy/raw/branch/main/upgrade.sh) # # 环境变量(可选): # INSTALL_DIR 安装目录(默认自动检测,优先 /opt/xuqm-private) # XUQM_BRANCH Gitea 分支(默认 main) # # 升级内容: # 1. 下载最新部署包(更新脚本、配置模板、docker-compose 文件) # 2. 保留全部数据目录和现有配置(.env / secrets.env / xuqm.env 不被覆盖) # 3. 修复已知配置问题(SDK 地址残留公网 URL 等) # 4. 可选拉取最新镜像 # 5. 重启受影响容器并运行全量验证 set -euo pipefail # 若 stdin 不是终端(curl | bash),强制从 /dev/tty 读取用户输入 if [ ! -t 0 ]; then exec bash "$0" "$@" &2; exit 1; } # --------------------------------------------------------------------------- # Banner # --------------------------------------------------------------------------- printf '\n%b══════════════════════════════════════════════════%b\n' "$CYAN" "$RESET" printf '%b XuqmGroup 私有化部署 — 一键升级%b\n' "$BOLD" "$RESET" printf '%b══════════════════════════════════════════════════%b\n\n' "$CYAN" "$RESET" # --------------------------------------------------------------------------- # 检测安装目录 # --------------------------------------------------------------------------- if [ ! -f "$INSTALL_DIR/.env" ]; then for _d in /opt/xuqm /root/xuqm-private; do if [ -f "$_d/.env" ] && [ -f "$_d/docker-compose.yml" ]; then INSTALL_DIR="$_d" break fi done fi if [ ! -f "$INSTALL_DIR/.env" ]; then read -rp " 请输入部署目录路径(如 /opt/xuqm-private): " INSTALL_DIR [ -f "$INSTALL_DIR/docker-compose.yml" ] || \ fail "$INSTALL_DIR 下未找到 docker-compose.yml,请先执行 install.sh 完成初始部署" [ -f "$INSTALL_DIR/.env" ] || \ fail "$INSTALL_DIR 下未找到 .env,请先执行 install.sh 完成初始部署" fi printf ' 安装目录: %b%s%b\n' "$BOLD" "$INSTALL_DIR" "$RESET" # --------------------------------------------------------------------------- # 前置检查 # --------------------------------------------------------------------------- command -v docker >/dev/null 2>&1 || fail "Docker 未安装" command -v python3 >/dev/null 2>&1 || fail "python3 未安装" docker info >/dev/null 2>&1 || fail "Docker daemon 未运行,请执行: systemctl start docker" [ -f "$INSTALL_DIR/config/secrets.env" ] || fail "未找到 config/secrets.env,请先执行 install.sh 完成初始部署" [ -f "$INSTALL_DIR/config/xuqm.env" ] || fail "未找到 config/xuqm.env,请先执行 install.sh 完成初始部署" ok "前置检查通过" # --------------------------------------------------------------------------- # 下载最新部署包 # --------------------------------------------------------------------------- printf '\n' info "下载最新版本 ${ARCHIVE_URL} ..." TMP_PKG="$(mktemp /tmp/xuqm-upgrade-XXXXXX.tar.gz)" _BACKUP_DIR="$(mktemp -d /tmp/xuqm-backup-XXXXXX)" trap 'rm -f "$TMP_PKG"; rm -rf "$_BACKUP_DIR"' EXIT curl -fsSL --progress-bar "$ARCHIVE_URL" -o "$TMP_PKG" \ || fail "下载失败,请检查网络或 Gitea 是否可达: $ARCHIVE_URL" # --------------------------------------------------------------------------- # 备份关键配置 → 解压 → 恢复 # --------------------------------------------------------------------------- for _cf in .env config/secrets.env config/xuqm.env; do [ -f "$INSTALL_DIR/$_cf" ] && \ cp "$INSTALL_DIR/$_cf" "$_BACKUP_DIR/$(basename "$_cf").bak" done tar -xzf "$TMP_PKG" -C "$INSTALL_DIR" --strip-components=1 --exclude='*/data' chmod +x "$INSTALL_DIR/scripts/"*.sh \ "$INSTALL_DIR/install.sh" \ "$INSTALL_DIR/upgrade.sh" 2>/dev/null || true ok "脚本和配置模板已更新" for _cf in .env config/secrets.env config/xuqm.env; do _bak="$_BACKUP_DIR/$(basename "$_cf").bak" [ -f "$_bak" ] && cp "$_bak" "$INSTALL_DIR/$_cf" done ok "已恢复现有配置文件" # --------------------------------------------------------------------------- # 执行升级(修复配置 + 重启 + 验证) # --------------------------------------------------------------------------- printf '\n%b → 进入升级流程 ...%b\n\n' "$GREEN" "$RESET" cd "$INSTALL_DIR" exec bash scripts/update.sh