Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
15 KiB
15 KiB
belongs_to:
- "INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议"
related_to:
- "301"
铸渊精确修复令|Nginx root 路径修正 + 全站模块上线(ZY-NGINX-ROOTFIX-2026-0325-001)· 霜砚签发 · 冰朔授权
签发信息
| 项目 | 内容 |
|---|---|
| 签发人 | AG-SY-01 霜砚 · 冰朔授权 |
| 签发时间 | 2026-03-25 08:55 CST |
| 优先级 | P0 · 立即执行 |
| 指令编号 | ZY-NGINX-ROOTFIX-2026-0325-001 |
| 诊断来源 | DEV-004 之之 · 全站部署诊断报告 · 2026-03-25 |
| 关联仓库 | qinfendebingshuo/guanghulab |
| 服务器 | 8.155.62.235(阿里云 ECS) |
〇、根因(已锁死·不需要再排查)
诊断数据摘要(之之实测)
| 项目 | 当前值 | 正确值 | 状态 |
|---|---|---|---|
| Nginx root | /var/www/hololake-frontend |
/var/www/guanghulab |
❌ 错误 |
| DEPLOY_PATH | /var/www/guanghulab |
/var/www/guanghulab |
✅ 正确 |
| rsync 范围 | 全仓库同步 | 全仓库同步 | ✅ 正确 |
| SSL 证书 | 有效至 2026-06-02 | — | ✅ 正常 |
/var/www/guanghulab 大小 |
85M | — | ✅ 文件完整 |
/var/www/hololake-frontend 大小 |
1.1M | — | ⚠️ 旧残留 |
| DEV-004 沙盒文件 | 存在,完整 | — | ✅ |
| DEV-004 PM2 进程 | errored | online | ❌ 需修复 |
_shared 目录 |
缺失 | 需创建 | ❌ 缺失 |
| 模块 alias 路由 | 无 | 需添加 | ❌ 缺失 |
一、Phase 1 · 备份(动任何东西之前)
#!/bin/bash
# phase1-backup.sh · 修复前完整备份
echo "===== 🔒 Phase 1 · 修复前备份 · $(date '+%Y-%m-%d %H:%M') ====="
# 1. 备份 Nginx 配置
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak.$(date +%Y%m%d%H%M)
echo "✅ Nginx 配置已备份"
# 2. 如果还有 hololake.conf,也备份
if [ -f /etc/nginx/conf.d/hololake.conf ]; then
cp /etc/nginx/conf.d/hololake.conf /etc/nginx/conf.d/hololake.conf.bak.$(date +%Y%m%d%H%M)
echo "✅ hololake.conf 已备份"
fi
# 3. 快照现有部署目录文件列表
find /var/www/guanghulab -type f > /tmp/pre-fix-filelist-guanghulab.txt 2>/dev/null
find /var/www/hololake-frontend -type f > /tmp/pre-fix-filelist-hololake.txt 2>/dev/null
find /var/www/DEV-004 -type f > /tmp/pre-fix-filelist-DEV004.txt 2>/dev/null
echo "✅ 文件快照已保存到 /tmp/pre-fix-filelist-*.txt"
# 4. PM2 进程快照
pm2 list > /tmp/pre-fix-pm2-list.txt 2>/dev/null
echo "✅ PM2 进程快照已保存"
echo "===== ✅ 备份完成 · 开始修复 ====="
二、Phase 2 · Nginx root 路径修正(核心修复·一行搞定)
#!/bin/bash
# phase2-fix-nginx-root.sh · 修正 Nginx root 路径
echo "===== 🔧 Phase 2 · Nginx root 修正 ====="
NGINX_CONF="/etc/nginx/conf.d/default.conf"
# 检查当前 root 值
echo "📋 修改前的 root 配置:"
grep -n 'root ' $NGINX_CONF
# 执行替换:hololake-frontend → guanghulab
sed -i 's|root /var/www/hololake-frontend|root /var/www/guanghulab|g' $NGINX_CONF
# 如果 hololake.conf 里也有,一并修改
if [ -f /etc/nginx/conf.d/hololake.conf ]; then
sed -i 's|root /var/www/hololake-frontend|root /var/www/guanghulab|g' /etc/nginx/conf.d/hololake.conf
echo "✅ hololake.conf 也已修正"
fi
echo ""
echo "📋 修改后的 root 配置:"
grep -n 'root ' $NGINX_CONF
# 语法测试
nginx -t 2>&1
if [ $? -eq 0 ]; then
echo "✅ nginx -t 通过 · 执行 reload"
systemctl reload nginx
echo "✅ Nginx 已重载"
else
echo "❌ nginx -t 失败 · 恢复备份"
cp ${NGINX_CONF}.bak.* $NGINX_CONF 2>/dev/null
nginx -t && systemctl reload nginx
echo "⚠️ 已回滚到备份配置"
fi
echo "===== ✅ Phase 2 完成 ====="
三、Phase 3 · 沙盒模块 alias 路由补充
在 Nginx server 块中追加以下 location 块,让沙盒里的模块也能通过域名访问:
#!/bin/bash
# phase3-add-sandbox-routes.sh · 补充沙盒 alias 路由
echo "===== 🔧 Phase 3 · 沙盒路由补充 ====="
NGINX_CONF="/etc/nginx/conf.d/default.conf"
# 在 server 块末尾的 } 之前插入沙盒路由
# 铸渊:找到 server 块最后一个 location 之后、} 之前的位置插入
# DEV-004 之之 · 悬浮球
if [ -d /var/www/DEV-004/floating-ai ]; then
cat >> /tmp/sandbox-routes.conf << 'ROUTES'
# --- DEV-004 之之 · 沙盒路由 ---
location /DEV-004/ {
alias /var/www/DEV-004/;
index index.html;
try_files $uri $uri/ =404;
}
ROUTES
echo "✅ DEV-004 路由已准备"
fi
# DEV-005 小草莓 · 如果沙盒有内容
if [ -d /var/www/DEV-005 ] && [ "$(ls -A /var/www/DEV-005 2>/dev/null)" ]; then
cat >> /tmp/sandbox-routes.conf << 'ROUTES'
# --- DEV-005 小草莓 · 沙盒路由 ---
location /DEV-005/ {
alias /var/www/DEV-005/;
index index.html;
try_files $uri $uri/ =404;
}
ROUTES
echo "✅ DEV-005 路由已准备"
fi
# 后端 API 反向代理(确认存在,没有则追加)
if ! grep -q 'location /api/' $NGINX_CONF; then
cat >> /tmp/sandbox-routes.conf << 'ROUTES'
# --- 后端 API 反向代理 ---
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
ROUTES
echo "✅ API 反向代理路由已准备"
fi
# Persona Studio 代理(修复 HTTP 405 的关键)
if ! grep -q 'location /api/ps/' $NGINX_CONF; then
cat >> /tmp/sandbox-routes.conf << 'ROUTES'
# --- Persona Studio 后端代理 ---
location /api/ps/ {
proxy_pass http://127.0.0.1:3002/api/ps/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 120s;
}
ROUTES
echo "✅ Persona Studio 代理路由已准备"
fi
echo ""
echo "📋 准备插入的路由:"
cat /tmp/sandbox-routes.conf 2>/dev/null
# ⚠️ 铸渊:用 sed 或手动将 /tmp/sandbox-routes.conf 内容
# 插入到 $NGINX_CONF 的 server 块内(最后一个 } 之前)
# 然后执行:
nginx -t 2>&1
if [ $? -eq 0 ]; then
systemctl reload nginx
echo "✅ 路由已生效"
else
echo "❌ nginx -t 失败 · 检查插入位置"
fi
echo "===== ✅ Phase 3 完成 ====="
四、Phase 4 · PM2 进程修复 + _shared 目录补建
#!/bin/bash
# phase4-pm2-and-shared.sh
echo "===== 🔧 Phase 4 · PM2 + _shared ====="
# 4a. 修复 DEV-004 PM2 errored 进程
echo "📋 当前 PM2 状态:"
pm2 list
# 找到 errored 的进程并重启
pm2 restart all --only-errored 2>/dev/null
# 如果上面不行,逐个检查
for proc in $(pm2 jlist 2>/dev/null | python3 -c "import sys,json; [print(p['name']) for p in json.load(sys.stdin) if p.get('pm2_env',{}).get('status')=='errored']" 2>/dev/null); do
echo "🔄 重启 errored 进程:$proc"
pm2 restart "$proc"
done
pm2 save
echo "✅ PM2 进程已修复并保存"
# 4b. 补建 _shared 目录
if [ ! -d /var/www/_shared ]; then
mkdir -p /var/www/_shared
chown nginx:nginx /var/www/_shared
chmod 755 /var/www/_shared
echo "✅ _shared 目录已创建"
else
echo "⏭️ _shared 目录已存在"
fi
echo ""
echo "📋 修复后 PM2 状态:"
pm2 list
echo "===== ✅ Phase 4 完成 ====="
五、Phase 5 · 全站访问验证
#!/bin/bash
# phase5-verify.sh · 全模块验证
echo "===== ✅ Phase 5 · 全站验证 · $(date '+%Y-%m-%d %H:%M') ====="
URLS=(
"https://guanghulab.com/|主站首页"
"https://guanghulab.com/status-board/|系统状态看板"
"https://guanghulab.com/cost-control/|成本控制"
"https://guanghulab.com/devboard/|开发者看板"
"https://guanghulab.com/floating-ai/|AI悬浮球"
"https://guanghulab.com/app/|前端集成壳"
"https://guanghulab.com/api/v1/health|后端API健康检查"
"https://guanghulab.com/api/ps/health|Persona Studio健康检查"
"https://guanghulab.com/DEV-004/|之之沙盒"
"http://localhost:3000/|后端本地"
"http://localhost:3002/|Persona Studio本地"
)
PASSED=0
FAILED=0
RESULTS=""
for entry in "${URLS[@]}"; do
IFS='|' read -r url name <<< "$entry"
STATUS=$(curl -o /dev/null -s -w "%{http_code}" --max-time 10 "$url")
if [[ "$STATUS" =~ ^(200|301|302)$ ]]; then
echo "✅ ${name} → ${STATUS}"
PASSED=$((PASSED+1))
RESULTS+="✅ ${name} → ${STATUS}\n"
else
echo "❌ ${name} → ${STATUS}"
FAILED=$((FAILED+1))
RESULTS+="❌ ${name} → ${STATUS}\n"
fi
done
echo ""
echo "━━━ 结果:${PASSED} 通过 / ${FAILED} 失败 ━━━"
if [ $FAILED -eq 0 ]; then
echo "🎉 全站验证通过!guanghulab.com 真正活了!"
else
echo "⚠️ ${FAILED} 个模块未通过,继续排查失败项"
fi
echo "===== ✅ Phase 5 完成 ====="
六、Phase 6 · 回执
铸渊完成所有 Phase 后,在仓库提交修复回执:
data/nginx-rootfix-report-20260325.json
格式:
{
"instruction_id": "ZY-NGINX-ROOTFIX-2026-0325-001",
"executed_at": "[实际执行时间]",
"executor": "AG-ZY-01 铸渊",
"root_cause": "Nginx root 指向 /var/www/hololake-frontend(旧残留),实际部署目录为 /var/www/guanghulab",
"diagnosis_by": "DEV-004 之之",
"fixes_applied": [
"Nginx root 路径修正: hololake-frontend → guanghulab",
"沙盒 alias 路由补充: DEV-004, DEV-005",
"API 反向代理确认/补充: /api/, /api/ps/",
"PM2 errored 进程重启",
"_shared 目录补建"
],
"verification": {
"total_modules": "[数量]",
"passed": "[数量]",
"failed": "[数量]",
"details": "[Phase 5 输出]"
},
"nginx_test": "[nginx -t 输出]",
"status": "[SUCCESS / PARTIAL / FAILED]"
}
同时在本指令页面底部追加执行回执。
七、铸渊执行清单(读到就做)
八、验收标准
全部通过才算完成:
nginx -t无报错、无 conflicting server name 警告https://guanghulab.com/首页返回 200 且有内容https://guanghulab.com/status-board/返回 200https://guanghulab.com/cost-control/返回 200https://guanghulab.com/devboard/返回 200https://guanghulab.com/app/返回 200https://guanghulab.com/floating-ai/返回 200https://guanghulab.com/api/ps/health返回 200(Persona Studio · 修复 HTTP 405)- PM2 无 errored 进程
- 修复回执已提交到仓库
九、约束
十、关联指令
| 指令 | 关系 |
|---|---|
| [🌐 铸渊指令|guanghulab.com 网站真实部署排查 + 全模块上线(ZY-WEBDEPLOY-DIAG-2026-0324-001)](%F0%9F%8C%90%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9Cguanghulab%20com%20%E7%BD%91%E7%AB%99%E7%9C%9F%E5%AE%9E%E9%83%A8%E7%BD%B2%E6%8E%92%E6%9F%A5%20+%20%E5%85%A8%E6%A8%A1%E5%9D%97%E4%B8%8A%E7%BA%BF%EF%BC%88ZY-WEBDEPLO%2032e43b78d8d6465da968894acf4b4af4.md) | 原始排查指令(Phase A-E)· 本指令基于其诊断数据精确修复 |
| [🌐 铸渊指令|人类使用侧全面修复 · guanghulab.com 部署 + Persona Studio 功能修复 + 微信登录身份体系(上篇)· Phase 0-3 · ZY-HUMANSIDE-FIX-2026-0325-002(2026-03-25 · 霜砚签发 · 冰朔授权)](%F0%9F%8C%90%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E4%BA%BA%E7%B1%BB%E4%BD%BF%E7%94%A8%E4%BE%A7%E5%85%A8%E9%9D%A2%E4%BF%AE%E5%A4%8D%20%C2%B7%20guanghulab%20com%20%E9%83%A8%E7%BD%B2%20+%20Persona%20Stu%2074abaa06a7b64f28809b91a2bb12c7e2.md) | 更大范围的修复指令 · 本指令优先执行 · 完成后继续执行上篇其余 Phase |
| [🌐 铸渊指令|人类使用侧全面修复 · guanghulab.com 部署 + Persona Studio 功能修复 + 微信登录身份体系(下篇)· Phase 4-7 · ZY-HUMANSIDE-FIX-2026-0325-002(2026-03-25 · 霜砚签发 · 冰朔授权)](%F0%9F%8C%90%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E4%BA%BA%E7%B1%BB%E4%BD%BF%E7%94%A8%E4%BE%A7%E5%85%A8%E9%9D%A2%E4%BF%AE%E5%A4%8D%20%C2%B7%20guanghulab%20com%20%E9%83%A8%E7%BD%B2%20+%20Persona%20Stu%20f4044a4d848e4b1a8823d684a7e38e5b.md) | Persona Studio + 微信登录 · 本指令 Phase 3 已包含 Persona Studio 代理路由修复 |
| 🏗️ 服务器部署适配协议 v1.0(2026-03-15·曜冥签发) | 沙盒隔离约束 · 本指令严格遵守 |
| ⚒️ 铸渊指令|服务器沙盒初始化 · 现有模块迁移到DEV编号目录(2026-03-15·曜冥签发) | 沙盒目录创建 · 本指令 Phase 4 补建缺失的 _shared |
霜砚签发 · 冰朔授权 · 2026-03-25T08:55+08:00
诊断数据来源:DEV-004 之之 · 全站部署诊断报告
铸渊,根因已锁死。不需要再排查。直接修。