XuqmGroup-PrivateDeploy/upgrade.sh
徐勤民 a327a262dd feat(deploy): 移除 ops-web、修复 SDK URL 注入、新增一键升级
核心变更:
- 完全移除 ops-web 容器(私有化部署无需运营后台)
- nginx sub_filter 替换前端 JS bundle 中的公网 SDK URL
- deploy.sh 写入正确的 SDK_IM_WS_URL / SDK_IM_API_URL / SDK_FILE_SERVICE_URL
- 新增 scripts/update.sh:热更新脚本,修复配置 + 可选拉镜像 + 重启 + 验证
- 新增 upgrade.sh:一键升级入口,curl 下载后直接执行,流程同 install.sh
- install.sh 检测已有部署(.env 存在),自动路由到 update.sh 而非重跑向导
- 关键配置文件(.env / secrets.env / xuqm.env)在 tarball 解压前备份后恢复

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 18:25:12 +08:00

128 行
5.6 KiB
Bash

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

#!/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" "$@" </dev/tty
fi
# ---------------------------------------------------------------------------
# 配置
# ---------------------------------------------------------------------------
GITEA_BASE="https://xuqinmin.com/xuqmGroup/XuqmGroup-PrivateDeploy"
XUQM_BRANCH="${XUQM_BRANCH:-main}"
ARCHIVE_URL="${GITEA_BASE}/archive/${XUQM_BRANCH}.tar.gz"
INSTALL_DIR="${INSTALL_DIR:-/opt/xuqm-private}"
# ---------------------------------------------------------------------------
# 工具函数
# ---------------------------------------------------------------------------
BOLD='\033[1m'; RESET='\033[0m'
CYAN='\033[1;36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[1;31m'
info() { printf "${CYAN}${RESET} %s\n" "$*"; }
ok() { printf "${GREEN}${RESET} %s\n" "$*"; }
warn() { printf "${YELLOW}${RESET} %s\n" "$*"; }
fail() { printf "${RED}\nERROR: %s${RESET}\n" "$*" >&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