fix: move nginx backup files out of sites-enabled to prevent duplicate default_server conflict

Root cause: switch_v3() created backup files (.v2-backup, .pre-repair) inside
/etc/nginx/sites-enabled/. Nginx loads ALL files in sites-enabled/, so backup
files declaring 'listen 80 default_server' caused duplicate default_server errors.

Fix:
- Add NGINX_BACKUP_DIR=/opt/zhuyuan-brain/nginx-backups for storing backups
  outside sites-enabled/
- Add clean_stale_nginx_backups() to remove any residual backup files from
  sites-enabled/ before nginx operations
- Both deploy_v3() and switch_v3() now call cleanup on entry

Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/55e3ada6-8ce8-4123-8f45-d20f6b369037

Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-04-06 01:43:42 +00:00 committed by GitHub
parent db8d90fa4a
commit 4052b7a4b0
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 "════════════════════════════════════════"
}