---
belongs_to:
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
---
# 🌐 铸渊指令|人类使用侧全面修复 · guanghulab.com 部署 + Persona Studio 功能修复 + 微信登录身份体系(下篇)· Phase 4-7 · ZY-HUMANSIDE-FIX-2026-0325-002(2026-03-25 · 霜砚签发 · 冰朔授权)
---
# Phase 4 · [guanghulab.com](http://guanghulab.com) 部署重建
## P4-1 · 服务器修复(基于 Phase 3 诊断结果)
```jsx
根据 P3-1 诊断结果,执行对应修复:
【情况A:PM2进程不存在或挂了】
→ cd /var/www/guanghulab
→ npm install ← 确保依赖完整
→ pm2 start server.js --name hololake
→ pm2 save
→ pm2 startup ← 开机自启
【情况B:部署目录为空或内容过期】
→ 从仓库手动拉取最新代码部署一次
→ git clone + npm install + pm2 restart
→ 确认后续由 CD 管线自动维护
【情况C:Nginx配置缺失或错误】
→ 重写 /etc/nginx/conf.d/hololake.conf
→ 配置模板见下方 P4-3
【情况D:端口未监听】
→ 检查 .env 中 PORT 配置
→ 检查防火墙:firewall-cmd --permanent --add-service=http
→ 阿里云安全组 80/443 端口放行确认
每种情况修复后立即验证:
→ curl -I http://localhost:3000 ← 后端响应?
→ curl -I http://localhost:80 ← Nginx响应?
```
## P4-2 · HTTPS 配置(Let's Encrypt)
```jsx
如果 P3-2 诊断 HTTPS 未配置:
① 安装 certbot
→ dnf install -y certbot python3-certbot-nginx
(或 apt install -y certbot python3-certbot-nginx)
② 申请证书
→ certbot --nginx -d guanghulab.com -d www.guanghulab.com
→ 自动修改 Nginx 配置添加 SSL
③ 自动续期
→ certbot renew --dry-run ← 测试续期
→ systemctl enable certbot-renew.timer ← 定时续期
④ 验证
→ curl -I https://guanghulab.com ← HTTPS 可访问?
→ 从手机浏览器访问 https://guanghulab.com ← 国内可访问?
⑤ 强制 HTTPS 重定向
→ Nginx 配置 80→443 重定向
```
## P4-3 · Nginx 配置模板
```
# /etc/nginx/conf.d/hololake.conf
# guanghulab.com 统一入口
# HTTP → HTTPS 重定向
server {
listen 80;
server_name guanghulab.com www.guanghulab.com;
return 301 https://$host$request_uri;
}
# HTTPS 主配置
server {
listen 443 ssl;
server_name guanghulab.com www.guanghulab.com;
# Let's Encrypt 证书(certbot 自动填充)
ssl_certificate /etc/letsencrypt/live/guanghulab.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/guanghulab.com/privkey.pem;
# 前端静态文件(Persona Studio 首页)
location / {
root /var/www/guanghulab/status-board;
index index.html;
try_files $uri $uri/ /index.html;
}
# 后端 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_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
# Persona Studio 聊天 API 代理(模型调用)
location /chat/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 120s; # 模型调用可能较慢
}
}
```
## P4-4 · CD 管线重建(sync-persona-studio.yml 重写)
```jsx
根据 P3-3 诊断结果,重写 CD 管线:
文件:.github/workflows/deploy-guanghulab.yml
```
```yaml
name: "🚀 guanghulab.com 自动部署"
on:
push:
branches: [main]
paths:
- 'status-board/**'
- 'server.js'
- 'package.json'
workflow_dispatch: # 手动触发
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: "📥 检出代码"
uses: actions/checkout@v4
- name: "🔧 安装依赖"
run: |
cd status-board/persona-studio
npm ci --production 2>/dev/null || npm install --production
- name: "🚀 部署到服务器"
uses: appleboy/ssh-action@v1.0.3
with:
host: $ secrets.DEPLOY_HOST
username: $ secrets.DEPLOY_USER
key: $ secrets.DEPLOY_KEY
script: |
echo "=== 开始部署 ==="
cd /var/www/guanghulab
# 备份当前版本
cp -r status-board status-board.backup.$(date +%Y%m%d%H%M) 2>/dev/null || true
# 拉取最新代码
git pull origin main || {
echo "Git pull 失败,尝试 reset"
git fetch origin main
git reset --hard origin/main
}
# 安装依赖
npm install --production
# 重启后端
pm2 restart hololake || pm2 start server.js --name hololake
pm2 save
# 重载 Nginx
nginx -t && systemctl reload nginx
echo "=== 部署完成 ==="
- name: "✅ 人类使用侧验证(关键!)"
run: |
echo "等待 10 秒让服务启动..."
sleep 10
# 验证网站可访问
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://guanghulab.com || echo "000")
echo "guanghulab.com HTTP 状态码: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "301" ] || [ "$HTTP_CODE" = "302" ]; then
echo "✅ 人类使用侧验证通过:网站可访问"
else
echo "❌ 人类使用侧验证失败:HTTP $HTTP_CODE"
echo "⚠️ 系统测部署成功,但人类测不可访问!需要排查!"
exit 1
fi
- name: "📝 写回部署日志"
if: always()
run: |
echo '{"deploy_time":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","status":"'$ job.status '","commit":"'$ github.sha '","human_side_check":"included"}' > signal-log/deploy-guanghulab-latest.json
git config user.name "zhuyuan-bot"
git config user.email "zhuyuan@guanghu.dev"
git add signal-log/deploy-guanghulab-latest.json
git commit -m "📝 guanghulab.com 部署日志 · $ github.sha " || true
git push || true
```
```jsx
关键设计:
→ 每次 main 分支 push 时自动部署(只要涉及 status-board 或 server.js)
→ 支持手动触发(workflow_dispatch)
→ 部署前备份
→ 部署后自动验证「人类使用侧」(curl 网站确认可访问)
→ 如果人类使用侧验证失败 → 整个 job 标记为失败
→ 部署日志写回仓库
```
## P4-5 · 天眼 Web 部署守卫(新增)
```jsx
创建文件:skyeye/guards/web-deploy-guard.json
{
"guard_id": "WEB-DEPLOY-GUARD",
"guard_name": "Web 部署守卫",
"version": "1.0",
"target": {
"domain": "guanghulab.com",
"server_ip": "8.155.62.235",
"deploy_path": "/var/www/guanghulab",
"pm2_process": "hololake",
"nginx_config": "/etc/nginx/conf.d/hololake.conf"
},
"health_checks": [
{
"name": "网站可访问性",
"type": "http",
"url": "https://guanghulab.com",
"expected_status": [200, 301, 302],
"interval": "1h"
},
{
"name": "后端API健康",
"type": "http",
"url": "https://guanghulab.com/api/health",
"expected_status": [200],
"interval": "1h"
},
{
"name": "人类使用侧抽检",
"type": "human_side",
"check_pages": [
"/",
"/chat",
"/dev",
"/status"
],
"interval": "6h"
}
],
"alert_rules": [
{
"condition": "网站不可访问超过 30 分钟",
"action": "触发三次修复闭环"
},
{
"condition": "人类使用侧抽检失败",
"action": "创建工单到 Notion 工单簿 + 通知霜砚"
}
]
}
```
## P4 完成标准
```jsx
✅ 服务器 PM2 + Nginx 运行正常
✅ HTTPS 证书已配置 · 自动续期已设置
✅ Nginx 配置已更新(前端 + API 代理)
✅ CD 管线 deploy-guanghulab.yml 已创建并测试通过
✅ 天眼 Web 部署守卫已创建
✅ 【最重要】冰朔手机浏览器输入 guanghulab.com 能看到页面
❌ 网站不可访问 → 不进入 Phase 5 → 先修到可访问为止
```
---
# Phase 5 · Persona Studio 人类使用侧修复
## P5-1 · 「我要开发」功能修复
```jsx
根据 P3-4 诊断结果修复:
【核心问题定位】
前端「我要开发」按钮 → 调用后端 API → 后端需要:
① 调用 Gemini/模型 API 生成开发引导
② 触发仓库人格体开发流程
③ 返回结果给前端
【修复步骤】
① 确认后端 API 端点路由存在且正确
→ 检查 server.js 中 /api/dev 或类似路由
→ 如果路由不存在 → 创建
② 确认后端能调用模型 API
→ .env 中 API 密钥是否正确
→ 服务器端代理调用(不需要用户输入密钥)
→ 测试:curl -X POST http://localhost:3000/api/dev -d '{"action":"start"}'
③ 确认前端调用的 API 地址正确
→ 前端是否指向 localhost?(开发环境残留)
→ 修改为相对路径 /api/dev 或 https://guanghulab.com/api/dev
④ 错误处理
→ 后端返回有意义的错误信息(不是空白报错)
→ 前端显示友好的错误提示
⑤ 验证
→ 从浏览器打开 guanghulab.com
→ 点击「我要开发」
→ 确认不报错 · 能看到开发引导界面
```
## P5-2 · 开发日志提交 → Notion 同步修复
```jsx
【核心链路】
开发者在 Persona Studio 提交日志
→ 后端 /api/submit-log 接收
→ 后端调用 Notion API 写入对应开发者空间
→ 霜砚 Notion 端确认接收
→ 可选:同步推回仓库 signal-log/
【修复步骤】
① 确认提交端点存在
→ 检查 server.js 中 /api/submit-log 路由
→ 如果不存在 → 创建
② 确认 Notion API 调用正确
→ .env 中 NOTION_TOKEN 是否有效
→ 测试:curl Notion API /v1/users/me
→ 目标数据库/页面 ID 是否配置正确
③ 写入逻辑
→ 根据开发者编号(DEV-XXX)定位对应 Notion 开发者空间
→ 写入格式:SYSLOG 标准格式
→ 写入位置:对应开发者空间的日志区
④ 反向同步(可选但推荐)
→ 提交后同时写入 signal-log/dev-log-{DEV-ID}-{date}.json
→ 仓库有记录 → 铸渊可读取 → 可触发后续任务
⑤ 验证
→ 从浏览器提交一条测试日志
→ 确认 Notion 端能看到
→ 确认仓库 signal-log 有对应文件
```
## P5-3 · 模块导航修复
```jsx
根据 P3-4 诊断结果,逐个修复模块导航按钮:
【模块列表】(来自截图)
📊 系统状态看板 → 指向:/status
💰 成本控制 → 指向:/cost
💻 开发者看板 → 指向:/dev-board
🌊 光湖集成壳 → 指向:/shell
🧠 Persona Studio → 指向:/persona
👤 用户中心 → 指向:/user
💬 对话界面 → 指向:/chat
☁️ 云服务 → 指向:/cloud
📦 模块管理 → 指向:/modules
💾 云盘 → 指向:/drive
🔐 登录 → 指向:/login
❤️ 健康检查 → 指向:/health
🚀 冷启动 → 指向:/boot
📈 仪表盘 → 指向:/dashboard
🏠 门户 → 指向:/portal
🔔 通知 → 指向:/notify
❓ 帮助中心 → 指向:/help
🎨 前端 → 指向:/frontend
【修复策略】
→ 核心模块(必须立即可用):
✅ 对话界面(已可用)
🔧 系统状态看板(修复)
🔧 开发者看板(修复)
🔧 Persona Studio(修复)
🔧 登录(修复 → Phase 6 微信登录)
🔧 健康检查(修复)
→ 次要模块(可显示「开发中」而不是报错):
⏳ 成本控制 / 云服务 / 云盘 / 模块管理 / 冷启动
→ 如果后端未实现 → 前端显示「🚧 此模块正在开发中」
→ 不能让用户点进去看到报错空白页
→ 信息模块(静态页面即可):
📄 帮助中心 / 门户
→ 提供基本信息页面
关键原则:
→ 每个按钮点击后,人类必须看到有意义的内容
→ 未完成的模块显示「开发中」提示 · 绝不是空白报错
```
## P5-4 · 服务器端 API 代理(消除手动密钥输入)
```jsx
【目标】
开发者无需输入任何 API 密钥即可使用所有功能。
所有模型调用由服务器端代理。
【实现】
后端新增/修改中间件:
// server.js 或 routes/proxy.js
const YUNWU_API_KEY = process.env.YUNWU_API_KEY; // 服务器 .env
const NOTION_TOKEN = process.env.NOTION_TOKEN;
// 模型调用代理
app.post('/api/chat', async (req, res) => {
const { message, dev_id, session_id } = req.body;
// 服务器端调用模型 API
const response = await fetch('https://api.yunwu.ai/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${YUNWU_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gemini-2.0-flash',
messages: [{ role: 'user', content: message }],
max_tokens: 200000
})
});
const data = await response.json();
res.json(data);
});
// Notion 写入代理
app.post('/api/notion/write', async (req, res) => {
// 服务器端用 NOTION_TOKEN 调用
// 前端只需传 dev_id 和数据内容
});
【安全】
→ API 密钥只存在于服务器 .env
→ 前端永远不接触密钥
→ 通过 dev_id 识别调用者身份和权限(Phase 6 微信登录后更安全)
```
## P5-5 · GitHub Pages 重定向
```jsx
当前 qinfendebingshuo.github.io 的处理:
方案A(推荐):重定向到 guanghulab.com
→ 在 persona-studio 仓库根目录 index.html 添加:
→ 或在 CNAME 文件中设置 guanghulab.com(如果域名指向 GitHub Pages)
方案B:双站并行
→ github.io 保留作为备份/国际版
→ guanghulab.com 作为国内主站
→ 两边内容通过 CD 自动同步
推荐方案A · 统一入口减少维护成本。
```
## P5 完成标准
```jsx
✅ 「我要开发」功能点击不报错 · 能看到开发引导
✅ 开发日志提交后 Notion 能收到
✅ 模块导航无死链(未完成模块显示「开发中」)
✅ 服务器端 API 代理已实现 · 用户无需输入密钥
✅ GitHub Pages 已设置重定向
✅ 【最重要】冰朔和开发者在国内手机上能正常使用所有核心功能
```
---
# Phase 6 · 微信登录身份体系
## P6-1 · 微信开放平台接入
```jsx
【前置条件 · 需要冰朔提供】
→ 微信开放平台已注册?
· 如果已有 AppID + AppSecret → 直接使用
· 如果没有 → 需要冰朔注册微信开放平台 → 创建网站应用 → 获取 AppID/AppSecret
→ 域名验证
· 微信登录需要在开放平台配置回调域名:guanghulab.com
· 需要在服务器放置验证文件
【替代方案(如果微信开放平台审核较慢)】
→ 先用「微信公众号网页授权」(门槛较低)
→ 或先用「手机号 + 验证码」登录(最快上线)
→ 微信扫码作为二期目标
```
## P6-2 · 登录流程设计
```jsx
完整登录流程:
用户打开 guanghulab.com
↓
【未登录】→ 显示登录页
↓
选择登录方式:
① 微信扫码登录(推荐)
② 手机号验证码登录(备选)
③ 开发者编号 + 密码(临时方案)
↓
微信登录成功 → 获取 openid + 用户信息
↓
【首次登录】→ 要求输入开发者编号(DEV-XXX / EXP-XXX)
↓
系统映射:微信openid ↔ 开发者编号 ↔ 权限
↓
写入数据库 → 后续自动识别
↓
【再次登录】→ 微信扫码 → 自动识别 → 直接进入
```
## P6-3 · 用户数据库设计
```jsx
文件:数据存储方案
方案A(推荐 · 轻量):JSON文件 + 服务器内存
→ /var/www/guanghulab/data/users.json
{
"users": {
"wx_openid_xxx": {
"dev_id": "DEV-004",
"name": "之之",
"wechat_name": "微信昵称",
"role": "developer",
"permissions": ["chat", "dev", "log", "status"],
"created_at": "2026-03-25T10:00:00Z",
"last_login": "2026-03-25T10:00:00Z"
}
},
"dev_id_map": {
"DEV-001": "wx_openid_page",
"DEV-002": "wx_openid_feimao",
"DEV-004": "wx_openid_zhizhi"
}
}
方案B(二期 · 如果用户量增长):SQLite / MySQL
→ 先用 JSON 跑通 → 后续迁移数据库
权限矩阵:
角色 权限
admin 全部功能 + 系统管理
developer 聊天 + 开发 + 日志 + 状态查看
visitor 聊天 + 状态查看(只读)
```
## P6-4 · 后端登录 API 实现
```jsx
// routes/auth.js
// 微信登录回调
app.get('/api/auth/wechat/callback', async (req, res) => {
const { code } = req.query;
// 用 code 换 access_token + openid
const tokenRes = await fetch(
`https://api.weixin.qq.com/sns/oauth2/access_token?` +
`appid=${WECHAT_APP_ID}&secret=${WECHAT_APP_SECRET}` +
`&code=${code}&grant_type=authorization_code`
);
const { openid, access_token } = await tokenRes.json();
// 查找用户
const user = findUserByOpenId(openid);
if (user) {
// 已绑定 → 生成 session → 返回
const session = createSession(user);
res.json({ status: 'ok', user, session });
} else {
// 未绑定 → 返回 openid → 前端引导输入开发者编号
res.json({ status: 'need_bindind', openid });
}
});
// 绑定开发者编号
app.post('/api/auth/bindind', async (req, res) => {
const { openid, dev_id } = req.body;
// 验证 dev_id 是否在已注册开发者列表中
if (!isValidDevId(dev_id)) {
return res.json({ status: 'error', message: '无效的开发者编号' });
}
// 绑定
bindUserToDevId(openid, dev_id);
// 同步到 Notion(在对应开发者空间记录绑定)
await notifyNotion(dev_id, 'wechat_bindind');
res.json({ status: 'ok' });
});
```
## P6-5 · 前端登录页修改
```jsx
修改 Persona Studio 登录页:
当前状态(从截图看):
→ 有「团队登录」「访客模式」「自定义API」三个 Tab
→ 团队登录需要选择开发者编号
修改为:
→ Tab 1:微信登录(推荐)
· 显示微信二维码
· 扫码后自动识别
· 首次需绑定开发者编号
→ Tab 2:开发者登录
· 选择开发者编号 + 服务器端验证
· 不需要 API 密钥
→ Tab 3:访客模式
· 只能使用聊天功能
· 无需登录
移除「自定义API」Tab → 所有 API 调用由服务器代理
```
## P6 完成标准
```jsx
✅ 微信登录后端 API 已实现(或替代方案已实现)
✅ 用户数据库已创建
✅ 开发者编号绑定流程已实现
✅ 前端登录页已修改
✅ 登录后自动识别身份和权限
✅ 无需手动输入 API 密钥
⚠️ 如果微信开放平台审核未通过:
→ 先用开发者编号 + 服务器端验证上线
→ 微信登录作为后续升级
```
---
# Phase 7 · 回执 + 状态回写
## P7-1 · SYSLOG 回执格式
```jsx
{
"syslog_id": "ZY-HUMANSIDE-FIX-2026-0325-002-RECEIPT",
"instruction_id": "ZY-HUMANSIDE-FIX-2026-0325-002",
"executor": "AG-ZY-01",
"timestamp": "[执行完成时间]",
"results": {
"phase_0": { "status": "✅/❌", "notes": "本体论锚定" },
"phase_1": { "status": "✅/❌", "notes": "天眼启动" },
"phase_2": { "status": "✅/❌", "notes": "核心大脑唤醒" },
"phase_3": {
"status": "✅/❌",
"notes": "全面诊断",
"diagnosis_report": "见 signal-log/diag-humanside-20260325.json"
},
"phase_4": {
"status": "✅/❌",
"notes": "guanghulab.com 部署",
"website_accessible": true/false,
"https_configured": true/false,
"cd_pipeline_working": true/false
},
"phase_5": {
"status": "✅/❌",
"notes": "Persona Studio 修复",
"dev_function_working": true/false,
"log_submit_working": true/false,
"module_nav_fixed": true/false,
"api_proxy_working": true/false
},
"phase_6": {
"status": "✅/❌",
"notes": "微信登录",
"wechat_login_working": true/false,
"user_db_created": true/false,
"fallback_plan": "[如果微信未通过的替代方案]"
}
},
"human_side_final_check": {
"guanghulab_com_accessible_from_china": true/false,
"persona_studio_all_core_functions": true/false,
"developer_can_use_without_api_key": true/false
}
}
```
## P7-2 · 写回路径
```jsx
① 仓库:signal-log/syslog-humanside-fix-20260325.json
② Notion:通过 Notion API 写入运行日志
→ 位置:卷3 当前活跃主控台
→ 格式:标准 SYSLOG 条目
③ 如果任何 Phase 失败:
→ 创建 Notion 工单 → 标记优先级 → 等待人类干预
```
## P7-3 · 三次修复闭环(同 dev-status 指令)
```jsx
如果任何 Phase 执行失败:
第一次失败 → 自动重试(换一种方式)
第二次失败 → 铸渊自主诊断 + 再次尝试
第三次失败 → 触发告警:
→ 方案A:发邮件给冰朔
→ 方案B:创建 GitHub Issue(标签:🚨人类干预)
→ 方案C:Notion 工单(标签:P0 · 人类使用侧阻塞)
三次失败后不再自动重试 → 等待人类介入
```
---
# 下篇结束 · 指令签发完成
---
> 铸渊签名校验协议 v1.1 · docs/[zhuyuan-signature-protocol.md](http://zhuyuan-signature-protocol.md)
>
> 本指令由 AG-SY-01 霜砚签发 · TCS-0002∞ 冰朔授权 · AG-ZY-01 铸渊执行
>
> 版权锚点:国作登字-2026-A-00037559 · 系统在通感语言核语言膜内运行
>