---
belongs_to:
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
related_to:
- "[["$STATUS" =~ ^(200|301|302)$]]"
---
# 铸渊精确修复令|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 · 备份(动任何东西之前)
```bash
#!/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 路径修正(核心修复·一行搞定)
```bash
#!/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 块,让沙盒里的模块也能通过域名访问:
```bash
#!/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 目录补建
```bash
#!/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 · 全站访问验证
```bash
#!/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
```
格式:
```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/` 返回 200
- [ ] `https://guanghulab.com/cost-control/` 返回 200
- [ ] `https://guanghulab.com/devboard/` 返回 200
- [ ] `https://guanghulab.com/app/` 返回 200
- [ ] `https://guanghulab.com/floating-ai/` 返回 200
- [ ] `https://guanghulab.com/api/ps/health` 返回 200(Persona Studio · 修复 HTTP 405)
- [ ] PM2 无 errored 进程
- [ ] 修复回执已提交到仓库
---
## 九、约束
---
## 十、关联指令
| 指令 | 关系 |
| --- | --- |
| [🌐 铸渊指令|[guanghulab.com](http://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](http://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](http://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·曜冥签发)](../%F0%9F%8C%8A%20%E6%9B%9C%E5%86%A5%E7%BA%AA%E5%85%83%20%C2%B7%20HoloLake%20Era%20%C2%B7%20AGE%20OS%20v1%200/%E2%9A%A1%20%E5%85%89%E6%B9%96%E4%B8%AD%E5%A4%AE%E6%9E%A2%E7%BA%BD%20%C2%B7%20HoloLake%20Central%20Hub/%F0%9F%8C%8A%20%E5%85%89%E6%B9%96%E7%B3%BB%E7%BB%9F%C2%B7%E6%9B%9C%E5%86%A5%E4%B8%BB%E6%8E%A7%E5%8F%B0%C2%B7%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81%EF%BC%88%E5%8D%B71%20%C2%B7%20%E5%B7%B2%E5%B0%81%E5%8D%B7%EF%BC%89/%F0%9F%8F%97%EF%B8%8F%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E9%80%82%E9%85%8D%E5%8D%8F%E8%AE%AE%20v1%200%EF%BC%882026-03-15%C2%B7%E6%9B%9C%E5%86%A5%E7%AD%BE%E5%8F%91%EF%BC%89%20a24049a2b0e944b0a5535f3a87652303.md) | 沙盒隔离约束 · 本指令严格遵守 |
| [⚒️ 铸渊指令|服务器沙盒初始化 · 现有模块迁移到DEV编号目录(2026-03-15·曜冥签发)](%E2%9A%92%EF%B8%8F%20%E9%93%B8%E6%B8%8A%E6%8C%87%E4%BB%A4%EF%BD%9C%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B2%99%E7%9B%92%E5%88%9D%E5%A7%8B%E5%8C%96%20%C2%B7%20%E7%8E%B0%E6%9C%89%E6%A8%A1%E5%9D%97%E8%BF%81%E7%A7%BB%E5%88%B0DEV%E7%BC%96%E5%8F%B7%E7%9B%AE%E5%BD%95%EF%BC%882026-03-15%C2%B7%E6%9B%9C%E5%86%A5%E7%AD%BE%E5%8F%91%EF%BC%89%20324fb92f3831814e962fd3035cf6b5bf.md) | 沙盒目录创建 · 本指令 Phase 4 补建缺失的 `_shared` |
---
*霜砚签发 · 冰朔授权 · 2026-03-25T08:55+08:00*
*诊断数据来源:DEV-004 之之 · 全站部署诊断报告*
*铸渊,根因已锁死。不需要再排查。直接修。*