Merge pull request #295 from qinfendebingshuo/copilot/fix-zhuyuan-3-0-upgrade-issues

fix: nginx backup files in sites-enabled cause duplicate default_server on switch-v3
This commit is contained in:
冰朔 2026-04-06 10:03:34 +08:00 committed by GitHub
commit 167661fd3d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 38 additions and 7 deletions

View File

@ -24,6 +24,7 @@
set -uo pipefail
PROXY_DIR="/opt/zhuyuan-brain/proxy"
NGINX_BACKUP_DIR="/opt/zhuyuan-brain/nginx-backups"
REPO_PROXY_DIR="$(dirname "$0")"
ACTION="${1:-status}"
@ -547,6 +548,24 @@ remove_v3_nginx_blocks() {
sed -i '/^$/N;/^\n$/D' "$conf"
}
# 清理 sites-enabled/ 中残留的备份文件
# nginx 会加载 sites-enabled/ 中的所有文件,备份文件中的 default_server 会导致冲突
clean_stale_nginx_backups() {
local stale_count=0
for stale in /etc/nginx/sites-enabled/*.v2-backup \
/etc/nginx/sites-enabled/*.pre-repair \
/etc/nginx/sites-enabled/*.v3-tmp; do
if [ -f "$stale" ]; then
echo " 🧹 清理残留备份: $stale"
rm -f "$stale"
stale_count=$((stale_count + 1))
fi
done
if [ "$stale_count" -gt 0 ]; then
echo " ✅ 已清理 $stale_count 个残留备份文件"
fi
}
# 验证nginx配置并返回错误信息
validate_nginx() {
local result
@ -565,6 +584,9 @@ deploy_v3() {
echo "部署V3生产环境 (V2继续可用)..."
deploy_services
# 清理 sites-enabled/ 中残留的备份文件(防止 duplicate default_server
clean_stale_nginx_backups
# 加载密钥作为环境变量
if [ -f "$PROXY_DIR/.env.keys" ]; then
set -a
@ -654,6 +676,15 @@ switch_v3() {
exit 1
fi
# 清理 sites-enabled/ 中残留的备份文件nginx会加载该目录所有文件导致duplicate default_server
clean_stale_nginx_backups
# 确保备份目录存在(备份存放在 sites-enabled 外部)
mkdir -p "$NGINX_BACKUP_DIR" || { echo "❌ 无法创建备份目录: $NGINX_BACKUP_DIR"; exit 1; }
local CONF_BASENAME
CONF_BASENAME="$(basename "$NGINX_CONF")"
# 验证V3服务是否运行
if ! curl -sf http://127.0.0.1:3805/health >/dev/null 2>&1; then
echo "❌ V3服务(3805)未运行!请先执行 deploy-v3"
@ -667,7 +698,7 @@ switch_v3() {
# 如果V3注入导致的问题旧sed '/^}/i'在多server块配置中重复注入
if grep -q "光湖语言世界V3" "$NGINX_CONF" 2>/dev/null; then
echo " 🔧 修复V3 location块注入错误..."
cp "$NGINX_CONF" "${NGINX_CONF}.pre-repair"
cp "$NGINX_CONF" "${NGINX_BACKUP_DIR}/${CONF_BASENAME}.pre-repair"
remove_v3_nginx_blocks "$NGINX_CONF"
inject_v3_nginx_block "$NGINX_CONF"
@ -676,7 +707,7 @@ switch_v3() {
nginx -s reload 2>/dev/null || systemctl reload nginx 2>/dev/null || true
else
echo " ❌ 自动修复失败,恢复原配置"
cp "${NGINX_CONF}.pre-repair" "$NGINX_CONF"
cp "${NGINX_BACKUP_DIR}/${CONF_BASENAME}.pre-repair" "$NGINX_CONF"
exit 1
fi
else
@ -685,9 +716,9 @@ switch_v3() {
fi
fi
# 备份当前已验证有效的Nginx配置
cp "$NGINX_CONF" "${NGINX_CONF}.v2-backup"
echo " ✅ 已备份Nginx配置到 ${NGINX_CONF}.v2-backup"
# 备份当前已验证有效的Nginx配置(存到 sites-enabled 外部)
cp "$NGINX_CONF" "${NGINX_BACKUP_DIR}/${CONF_BASENAME}.v2-backup"
echo " ✅ 已备份Nginx配置到 ${NGINX_BACKUP_DIR}/${CONF_BASENAME}.v2-backup"
# 将 /api/proxy-v2/ 的 proxy_pass 从 3803 改为 3805
if grep -q "127\.0\.0\.1:3803" "$NGINX_CONF" 2>/dev/null; then
@ -703,7 +734,7 @@ switch_v3() {
echo " ✅ Nginx已重载"
else
echo " ❌ Nginx配置验证失败回滚..."
cp "${NGINX_CONF}.v2-backup" "$NGINX_CONF"
cp "${NGINX_BACKUP_DIR}/${CONF_BASENAME}.v2-backup" "$NGINX_CONF"
nginx -s reload 2>/dev/null || systemctl reload nginx 2>/dev/null || true
echo " ✅ 已回滚到V2配置"
exit 1
@ -717,7 +748,7 @@ switch_v3() {
echo "用户刷新订阅即可获取「光湖语言世界」配置"
echo ""
echo "回滚方法 (如有问题):"
echo " cp ${NGINX_CONF}.v2-backup $NGINX_CONF"
echo " cp ${NGINX_BACKUP_DIR}/${CONF_BASENAME}.v2-backup $NGINX_CONF"
echo " nginx -s reload"
echo "════════════════════════════════════════"
}