fix: web deploy diagnostic + module navigation + post-deploy smoke test
- Add cost-control/index.html redirect for proper Nginx serving - Update docs/index.html navigation with all modules (cost-control, devboard, persona-studio) - Add devboard symlink step to deploy workflow (modules/devboard → devboard) - Add post-deploy smoke test step checking all module directories - Expand deploy verification to check all key modules - Create scripts/web-deploy-diag.sh for Phase A server diagnostics - Create data/web-deploy-diag-20260324.txt diagnostic log - Create data/web-deploy-fix-report.json fix report Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/4d7b9c05-531f-4e93-a770-f9324c663c38
This commit is contained in:
parent
bcc2047707
commit
a10e020d26
|
|
@ -232,6 +232,28 @@ jobs:
|
|||
"
|
||||
echo "✅ 首页已部署到根目录"
|
||||
|
||||
- name: 🔗 模块路由别名(symlink 补全)
|
||||
continue-on-error: true
|
||||
run: |
|
||||
echo "🔗 创建模块路由别名..."
|
||||
ssh -i ~/.ssh/deploy_key \
|
||||
"${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" "
|
||||
DP='${{ secrets.DEPLOY_PATH }}'
|
||||
|
||||
# devboard → modules/devboard(开发者看板在 modules/ 子目录下)
|
||||
if [ -d \"\$DP/modules/devboard\" ] && [ ! -e \"\$DP/devboard\" ]; then
|
||||
ln -s \"\$DP/modules/devboard\" \"\$DP/devboard\"
|
||||
echo '✅ devboard → modules/devboard'
|
||||
elif [ -L \"\$DP/devboard\" ]; then
|
||||
echo '✅ devboard symlink 已存在'
|
||||
elif [ -d \"\$DP/devboard\" ]; then
|
||||
echo '✅ devboard 目录已存在'
|
||||
else
|
||||
echo '⚠️ modules/devboard 不存在,跳过'
|
||||
fi
|
||||
"
|
||||
echo "✅ 模块路由别名处理完成"
|
||||
|
||||
- name: 🔧 后端服务部署
|
||||
continue-on-error: true
|
||||
run: |
|
||||
|
|
@ -475,7 +497,59 @@ jobs:
|
|||
echo '--- docs/ ---' && \
|
||||
ls ${{ secrets.DEPLOY_PATH }}/docs/ 2>/dev/null || echo '(docs/ 不存在)' && \
|
||||
echo '--- status-board/ ---' && \
|
||||
ls ${{ secrets.DEPLOY_PATH }}/status-board/ 2>/dev/null || echo '(status-board/ 不存在)'"
|
||||
ls ${{ secrets.DEPLOY_PATH }}/status-board/ 2>/dev/null || echo '(status-board/ 不存在)' && \
|
||||
echo '--- cost-control/ ---' && \
|
||||
ls ${{ secrets.DEPLOY_PATH }}/cost-control/ 2>/dev/null || echo '(cost-control/ 不存在)' && \
|
||||
echo '--- devboard/ ---' && \
|
||||
ls ${{ secrets.DEPLOY_PATH }}/devboard/ 2>/dev/null || echo '(devboard/ 不存在)' && \
|
||||
echo '--- persona-studio/ ---' && \
|
||||
ls ${{ secrets.DEPLOY_PATH }}/persona-studio/ 2>/dev/null || echo '(persona-studio/ 不存在)'"
|
||||
|
||||
- name: 🏥 部署后冒烟测试
|
||||
continue-on-error: true
|
||||
run: |
|
||||
echo "🏥 部署后全模块冒烟测试..."
|
||||
ssh -i ~/.ssh/deploy_key \
|
||||
"${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" "
|
||||
DP='${{ secrets.DEPLOY_PATH }}'
|
||||
PASSED=0
|
||||
FAILED=0
|
||||
RESULTS=''
|
||||
|
||||
check_module() {
|
||||
local name=\$1
|
||||
local path=\$2
|
||||
if [ -f \"\$DP/\$path/index.html\" ] || [ -f \"\$DP/\$path/index.htm\" ]; then
|
||||
PASSED=\$((PASSED+1))
|
||||
RESULTS=\"\${RESULTS}✅ \${name} (\${path}/index.html)\n\"
|
||||
elif [ -d \"\$DP/\$path\" ]; then
|
||||
PASSED=\$((PASSED+1))
|
||||
RESULTS=\"\${RESULTS}⚠️ \${name} (目录存在,无 index.html)\n\"
|
||||
else
|
||||
FAILED=\$((FAILED+1))
|
||||
RESULTS=\"\${RESULTS}❌ \${name} (\${path}/ 不存在)\n\"
|
||||
fi
|
||||
}
|
||||
|
||||
check_module '主站首页' 'docs'
|
||||
check_module '系统状态看板' 'status-board'
|
||||
check_module '成本控制' 'cost-control'
|
||||
check_module '开发者看板' 'devboard'
|
||||
check_module '光湖集成壳' 'app'
|
||||
check_module 'Persona Studio' 'persona-studio'
|
||||
check_module '后端服务' 'backend'
|
||||
|
||||
echo ''
|
||||
printf \"\$RESULTS\"
|
||||
echo ''
|
||||
echo \"━━━ 冒烟测试结果:\${PASSED} 通过 / \${FAILED} 失败 ━━━\"
|
||||
|
||||
# 写入部署状态文件
|
||||
TIMESTAMP=\$(date -u '+%Y-%m-%dT%H:%M:%SZ')
|
||||
printf '{\"last_deploy\":\"%s\",\"commit\":\"${{ github.sha }}\",\"modules_passed\":%d,\"modules_failed\":%d}' \
|
||||
\"\$TIMESTAMP\" \"\$PASSED\" \"\$FAILED\" > \"\$DP/data/deploy-status.json\" 2>/dev/null || true
|
||||
"
|
||||
echo "✅ 冒烟测试完成"
|
||||
|
||||
- name: 📝 部署汇总
|
||||
run: |
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="refresh" content="0;url=cost-control.html">
|
||||
<title>成本控制 · 光湖</title>
|
||||
</head>
|
||||
<body>
|
||||
<p>正在跳转到 <a href="cost-control.html">成本控制面板</a>...</p>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
===== 🔍 guanghulab.com 部署诊断日志 · 2026-03-24 =====
|
||||
工单: ZY-WEBDEPLOY-DIAG-2026-0324-001
|
||||
分析来源: GitHub Actions CI 日志 + SkyEye 天眼报告
|
||||
|
||||
━━━ Phase ⓪ · 天眼前置检查 ━━━
|
||||
|
||||
⓪-1 · 核心大脑完整性:
|
||||
✅ memory.json 完整(有效 JSON)
|
||||
✅ routing-map.json 完整(有效 JSON)
|
||||
✅ dev-status.json 完整(有效 JSON)
|
||||
❌ config.json 缺失(.github/persona-brain/ 目录下不存在)
|
||||
|
||||
⓪-1 · 天眼系统文件完整性:
|
||||
✅ skyeye/skyeye-main.js
|
||||
✅ skyeye/scan-workflows.js
|
||||
✅ skyeye/scan-structure.js
|
||||
✅ skyeye/scan-brain-health.js
|
||||
✅ skyeye/scan-external-bridges.js
|
||||
✅ skyeye/diagnose.js
|
||||
✅ skyeye/repair-agent.js
|
||||
✅ skyeye/report-generator.js
|
||||
✅ zhuyuan-skyeye.yml workflow 存在
|
||||
|
||||
⓪-2 · 天眼报告摘要 (skyeye-2026-03-23.json):
|
||||
整体健康度: 🟡 (黄色)
|
||||
大脑状态: integrity ok, memory fresh, routing_map 未对齐
|
||||
Workflow 健康: 79个,全部 ✅,6个 cron 冲突
|
||||
结构健康: 核心目录完整,92 个孤儿文件
|
||||
桥接健康: Notion API 🟢, Server SSH 🟡, GitHub API 🟢
|
||||
安全: L0 级别,根规则完整
|
||||
诊断: 9 个问题,8 个自动修复,1 个观察中
|
||||
|
||||
━━━ Phase A · 从 CI 日志中提取的诊断信息 ━━━
|
||||
|
||||
A1 · 服务器文件系统(来自 deploy job #175 验证步骤):
|
||||
站点根目录: 75 个子目录/文件
|
||||
确认存在的目录:
|
||||
✅ app/
|
||||
✅ backend/
|
||||
✅ backend-integration/
|
||||
✅ brain/
|
||||
✅ broadcasts/
|
||||
✅ buffer/
|
||||
✅ bulletin-board/
|
||||
✅ chat-bubble/
|
||||
✅ cloud-drive/
|
||||
✅ coldstart/
|
||||
✅ config/
|
||||
✅ docs/(含 index.html)
|
||||
✅ status-board/(含 index.html、api.js、render.js 等完整文件)
|
||||
✅ System_Logs/
|
||||
index.html 部署确认: docs/index.html → 站点根目录 ✅
|
||||
|
||||
A2 · Nginx 配置(来自 deploy job #175):
|
||||
✅ Nginx root 路径正确(无需修改)
|
||||
✅ API 反向代理已存在(无需修改)
|
||||
→ Nginx 配置正常,root 指向 DEPLOY_PATH
|
||||
|
||||
A3 · 后端服务(来自 deploy job #175):
|
||||
✅ 后端服务部署步骤成功完成
|
||||
端口: 3721(API 代理), 3000(Express), 3001(HLI), 3002(Persona Studio), 8080(WebSocket)
|
||||
|
||||
━━━ Phase B · 根因分析 ━━━
|
||||
|
||||
根据 CI 日志分析,部署流程正常运行(175 次成功),文件确实在服务器上。
|
||||
问题定位:
|
||||
|
||||
1. 【已确认】cost-control/ 缺少 index.html
|
||||
→ cost-control/ 目录只有 cost-control.html,Nginx 的 try_files $uri $uri/ 无法
|
||||
自动找到 index.html
|
||||
→ 修复: 创建 cost-control/index.html 重定向到 cost-control.html
|
||||
|
||||
2. 【已确认】devboard 路径不匹配
|
||||
→ 开发者看板代码在 modules/devboard/ 下,不在根目录的 devboard/ 下
|
||||
→ 访问 /devboard/ 时 Nginx 找不到对应目录
|
||||
→ 修复: 在部署时创建 symlink devboard → modules/devboard
|
||||
|
||||
3. 【已确认】floating-ai/ 目录不存在
|
||||
→ 仓库中没有 floating-ai/ 目录,该模块代码尚未创建
|
||||
→ 状态: 待开发
|
||||
|
||||
4. 【已确认】docs/index.html 导航不完整
|
||||
→ 模块导航缺少: 成本控制、开发者看板、Persona Studio
|
||||
→ 修复: 添加所有模块的导航入口
|
||||
|
||||
5. 【已确认】deploy-status.json 为空
|
||||
→ data/deploy-status.json 只有 {},没有部署状态记录
|
||||
→ 修复: 在部署后自动写入冒烟测试结果
|
||||
|
||||
━━━ Phase C · 修复措施 ━━━
|
||||
|
||||
C1. 创建 cost-control/index.html(重定向到 cost-control.html)✅
|
||||
C2. 更新 deploy-to-server.yml 添加 devboard symlink 创建步骤 ✅
|
||||
C3. 更新 docs/index.html 添加完整模块导航 ✅
|
||||
C4. 添加部署后冒烟测试步骤,自动检查所有模块可访问性 ✅
|
||||
C5. 冒烟测试结果自动写入 deploy-status.json ✅
|
||||
C6. 创建 scripts/web-deploy-diag.sh 诊断脚本(可在服务器上手动运行)✅
|
||||
|
||||
━━━ 诊断完成 · 2026-03-24 ━━━
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
{
|
||||
"report_id": "ZY-WEBDEPLOY-FIX-20260324",
|
||||
"timestamp": "2026-03-24T10:11:00Z",
|
||||
"work_order": "ZY-WEBDEPLOY-DIAG-2026-0324-001",
|
||||
"diagnosis_summary": {
|
||||
"skyeye_health": "🟡",
|
||||
"deploy_pipeline": "✅ 正常运行(175 次成功)",
|
||||
"server_ssh": "🟡 天眼报告显示不稳定",
|
||||
"nginx_config": "✅ root 路径正确,反向代理已存在",
|
||||
"files_on_server": true,
|
||||
"backend_services": "✅ 部署步骤成功"
|
||||
},
|
||||
"root_causes": [
|
||||
{
|
||||
"id": "RC-001",
|
||||
"description": "cost-control/ 缺少 index.html,Nginx 无法提供默认页面",
|
||||
"category": "情况3·文件缺失",
|
||||
"severity": "medium",
|
||||
"fix": "创建 cost-control/index.html 重定向到 cost-control.html",
|
||||
"status": "fixed"
|
||||
},
|
||||
{
|
||||
"id": "RC-002",
|
||||
"description": "开发者看板在 modules/devboard/ 下,/devboard/ 路径不可访问",
|
||||
"category": "情况2·路径不匹配",
|
||||
"severity": "medium",
|
||||
"fix": "部署时创建 symlink devboard → modules/devboard",
|
||||
"status": "fixed"
|
||||
},
|
||||
{
|
||||
"id": "RC-003",
|
||||
"description": "docs/index.html 导航缺少成本控制、开发者看板、Persona Studio",
|
||||
"category": "导航不完整",
|
||||
"severity": "low",
|
||||
"fix": "在模块导航数组中添加所有缺失模块",
|
||||
"status": "fixed"
|
||||
},
|
||||
{
|
||||
"id": "RC-004",
|
||||
"description": "floating-ai/ 模块尚未开发,仓库中不存在",
|
||||
"category": "模块未开发",
|
||||
"severity": "info",
|
||||
"fix": "待 DEV-004 之之开发完成后加入",
|
||||
"status": "pending_development"
|
||||
},
|
||||
{
|
||||
"id": "RC-005",
|
||||
"description": "部署后无冒烟测试,无法自动发现模块访问问题",
|
||||
"category": "CI/CD 缺陷",
|
||||
"severity": "high",
|
||||
"fix": "在 deploy-to-server.yml 添加部署后冒烟测试步骤",
|
||||
"status": "fixed"
|
||||
},
|
||||
{
|
||||
"id": "RC-006",
|
||||
"description": "deploy-status.json 为空,缺乏部署状态追踪",
|
||||
"category": "可观测性缺失",
|
||||
"severity": "medium",
|
||||
"fix": "冒烟测试完成后自动写入部署状态",
|
||||
"status": "fixed"
|
||||
}
|
||||
],
|
||||
"changes_made": [
|
||||
"cost-control/index.html — 新增(重定向到 cost-control.html)",
|
||||
"docs/index.html — 更新模块导航(+3 模块: 成本控制、开发者看板、Persona Studio)",
|
||||
".github/workflows/deploy-to-server.yml — 添加模块路由别名步骤(devboard symlink)",
|
||||
".github/workflows/deploy-to-server.yml — 添加部署后冒烟测试步骤(全模块检查)",
|
||||
".github/workflows/deploy-to-server.yml — 扩展验证步骤(增加 cost-control、devboard、persona-studio 检查)",
|
||||
"scripts/web-deploy-diag.sh — 新增(Phase A 诊断脚本)",
|
||||
"data/web-deploy-diag-20260324.log — 新增(诊断日志)",
|
||||
"data/web-deploy-fix-report.json — 新增(修复报告)"
|
||||
],
|
||||
"verification": {
|
||||
"ci_deploy_runs": "175 次全部成功",
|
||||
"last_successful_deploy": "2026-03-24T08:31:22Z",
|
||||
"modules_expected_accessible": [
|
||||
"/ — 主站首页(docs/index.html)",
|
||||
"/status-board/ — 系统状态看板",
|
||||
"/cost-control/ — 成本控制",
|
||||
"/devboard/ — 开发者看板",
|
||||
"/app/ — 光湖集成壳",
|
||||
"/persona-studio/ — Persona Studio",
|
||||
"/api/ — 后端 API"
|
||||
],
|
||||
"modules_pending": [
|
||||
"/floating-ai/ — AI悬浮球(模块未开发)"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -1076,8 +1076,11 @@ function renderAnnouncements(){
|
|||
// Module navigation — 模块入口导航
|
||||
h+='<div class="ann-section"><div class="ann-section-title">🗂️ 模块导航</div><div class="ann-actions" style="display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px">';
|
||||
var modules=[
|
||||
{icon:'📊',name:'看板',path:'/status-board/'},
|
||||
{icon:'🖥️',name:'主站',path:'/app/'},
|
||||
{icon:'📊',name:'系统状态看板',path:'/status-board/'},
|
||||
{icon:'💰',name:'成本控制',path:'/cost-control/'},
|
||||
{icon:'🖥️',name:'开发者看板',path:'/devboard/'},
|
||||
{icon:'🌊',name:'光湖集成壳',path:'/app/'},
|
||||
{icon:'🧠',name:'Persona Studio',path:'/persona-studio/'},
|
||||
{icon:'👤',name:'用户中心',path:'/m05-user-center/'},
|
||||
{icon:'💬',name:'对话界面',path:'/m07-dialogue-ui/'},
|
||||
{icon:'☁️',name:'云服务',path:'/m10-cloud/'},
|
||||
|
|
|
|||
|
|
@ -0,0 +1,192 @@
|
|||
#!/bin/bash
|
||||
# ═══════════════════════════════════════════════
|
||||
# 🔺 Sovereign: TCS-0002∞ | Root: SYS-GLW-0001
|
||||
# 📜 Copyright: 国作登字-2026-A-00037559
|
||||
# ═══════════════════════════════════════════════
|
||||
#
|
||||
# 🔍 Phase A · 服务器部署诊断脚本
|
||||
# 工单: ZY-WEBDEPLOY-DIAG-2026-0324-001
|
||||
#
|
||||
# 用法: ssh user@server 'bash -s' < scripts/web-deploy-diag.sh
|
||||
# 或在服务器上直接运行: bash /path/to/web-deploy-diag.sh
|
||||
#
|
||||
# 输出保存到: data/web-deploy-diag-YYYYMMDD.log
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
DEPLOY_PATH="${DEPLOY_PATH:-/var/www/guanghulab}"
|
||||
DATE=$(date '+%Y-%m-%d %H:%M:%S %Z')
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🔍 guanghulab.com 部署诊断 · Phase A"
|
||||
echo " 时间: $DATE"
|
||||
echo " 目标: $DEPLOY_PATH"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# ━━━ A1 · 服务器文件系统探查 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A1 · 服务器文件系统探查 ====="
|
||||
|
||||
echo ""
|
||||
echo "📂 /var/www/ 顶层目录(一级):"
|
||||
ls -la /var/www/ 2>/dev/null || echo "⚠️ /var/www/ 不存在"
|
||||
|
||||
echo ""
|
||||
echo "📂 /var/www/ 二级目录树:"
|
||||
find /var/www/ -maxdepth 2 -type d 2>/dev/null | head -80
|
||||
|
||||
echo ""
|
||||
echo "📂 查找所有 index.html(定位已部署的前端模块):"
|
||||
find /var/www/ -name 'index.html' -type f 2>/dev/null
|
||||
|
||||
echo ""
|
||||
echo "📂 查找所有 server.js / app.js(定位后端服务):"
|
||||
find /var/www/ /opt/ -name 'server.js' -o -name 'app.js' 2>/dev/null | head -20
|
||||
|
||||
echo ""
|
||||
echo "📂 磁盘占用(哪个目录最大 = 可能是主要部署目标):"
|
||||
du -sh /var/www/*/ 2>/dev/null | sort -rh | head -20
|
||||
|
||||
# ━━━ A2 · Nginx 配置完整导出 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A2 · Nginx 配置 ====="
|
||||
|
||||
echo ""
|
||||
echo "📋 Nginx 主配置:"
|
||||
cat /etc/nginx/nginx.conf 2>/dev/null || echo "⚠️ nginx.conf 不存在"
|
||||
|
||||
echo ""
|
||||
echo "📋 conf.d/ 下所有配置文件:"
|
||||
ls -la /etc/nginx/conf.d/ 2>/dev/null || echo "⚠️ conf.d/ 不存在"
|
||||
|
||||
echo ""
|
||||
echo "📋 各配置文件完整内容:"
|
||||
for f in /etc/nginx/conf.d/*.conf; do
|
||||
if [ -f "$f" ]; then
|
||||
echo ""
|
||||
echo "━━━ $f ━━━"
|
||||
cat "$f"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "📋 sites-enabled/(如果存在):"
|
||||
ls -la /etc/nginx/sites-enabled/ 2>/dev/null || echo "⚠️ sites-enabled/ 不存在"
|
||||
for f in /etc/nginx/sites-enabled/*; do
|
||||
if [ -f "$f" ]; then
|
||||
echo ""
|
||||
echo "━━━ $f ━━━"
|
||||
cat "$f"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "📋 snippets/(如果存在):"
|
||||
ls -la /etc/nginx/snippets/ 2>/dev/null || echo "⚠️ snippets/ 不存在"
|
||||
for f in /etc/nginx/snippets/*.conf; do
|
||||
if [ -f "$f" ]; then
|
||||
echo ""
|
||||
echo "━━━ $f ━━━"
|
||||
cat "$f"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "📋 Nginx 配置语法测试:"
|
||||
nginx -t 2>&1 || sudo nginx -t 2>&1 || echo "⚠️ 无法执行 nginx -t"
|
||||
|
||||
echo ""
|
||||
echo "📋 Nginx 当前监听端口:"
|
||||
ss -tlnp 2>/dev/null | grep nginx || echo "⚠️ 未找到 nginx 监听端口"
|
||||
|
||||
# ━━━ A3 · PM2 / Node 进程状态 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A3 · PM2 / Node 进程 ====="
|
||||
|
||||
pm2 list 2>/dev/null || echo "⚠️ PM2 未安装或无进程"
|
||||
pm2 describe 0 2>/dev/null | head -30 || true
|
||||
|
||||
echo ""
|
||||
echo "📋 所有 Node 进程:"
|
||||
ps aux | grep node | grep -v grep || echo "⚠️ 未找到 Node 进程"
|
||||
|
||||
echo ""
|
||||
echo "📋 监听端口:"
|
||||
ss -tlnp 2>/dev/null | grep -E '(node|pm2|3000|3001|3002|3721|8000|8080)' || echo "⚠️ 未找到相关端口"
|
||||
|
||||
# ━━━ A4 · 实际 HTTP 访问测试 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A4 · HTTP 访问测试 ====="
|
||||
|
||||
declare -a URLS=(
|
||||
"https://guanghulab.com/|主站首页"
|
||||
"http://localhost/|Nginx本地"
|
||||
"https://guanghulab.com/status-board/|系统状态看板"
|
||||
"https://guanghulab.com/cost-control/|成本控制"
|
||||
"https://guanghulab.com/devboard/|开发者看板"
|
||||
"https://guanghulab.com/app/|集成壳"
|
||||
"https://guanghulab.com/persona-studio/|Persona Studio"
|
||||
"https://guanghulab.com/api/health|后端API健康检查"
|
||||
"http://localhost:3000/|后端本地"
|
||||
"http://localhost:3721/api/health|API代理本地"
|
||||
)
|
||||
|
||||
for entry in "${URLS[@]}"; do
|
||||
IFS='|' read -r url name <<< "$entry"
|
||||
STATUS=$(curl -o /dev/null -s -w "%{http_code}" --max-time 10 "$url" 2>/dev/null || echo "000")
|
||||
REDIRECT=$(curl -s -o /dev/null -w "%{redirect_url}" --max-time 10 "$url" 2>/dev/null || echo "")
|
||||
echo "$name → $STATUS ${REDIRECT:+(→ $REDIRECT)}"
|
||||
done
|
||||
|
||||
# ━━━ A5 · 部署历史 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A5 · 部署历史 ====="
|
||||
|
||||
echo "📋 deploy-status.json:"
|
||||
cat "$DEPLOY_PATH/data/deploy-status.json" 2>/dev/null || echo "⚠️ deploy-status.json 不存在或为空"
|
||||
|
||||
for dir in "$DEPLOY_PATH" /var/www/hololake-frontend /var/www/hololake; do
|
||||
if [ -d "$dir" ]; then
|
||||
echo ""
|
||||
echo "📂 $dir 最后修改时间:"
|
||||
stat -c '%y' "$dir" 2>/dev/null || stat -f '%Sm' "$dir" 2>/dev/null || echo "⚠️ 无法获取"
|
||||
echo "最新文件:"
|
||||
find "$dir" -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | head -5
|
||||
fi
|
||||
done
|
||||
|
||||
# ━━━ A6 · SSL 证书状态 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A6 · SSL 证书 ====="
|
||||
certbot certificates 2>/dev/null || echo "⚠️ certbot 未安装或无证书"
|
||||
|
||||
# ━━━ A7 · 模块文件完整性检查 ━━━
|
||||
echo ""
|
||||
echo "===== 🔍 A7 · 模块文件完整性 ====="
|
||||
|
||||
declare -a MODULES=(
|
||||
"docs|主站首页|index.html"
|
||||
"status-board|系统状态看板|index.html"
|
||||
"cost-control|成本控制|index.html"
|
||||
"devboard|开发者看板|index.html"
|
||||
"app|光湖集成壳|page.tsx"
|
||||
"persona-studio|Persona Studio|index.html"
|
||||
"backend|后端API|server.js"
|
||||
)
|
||||
|
||||
for entry in "${MODULES[@]}"; do
|
||||
IFS='|' read -r dir name file <<< "$entry"
|
||||
if [ -f "$DEPLOY_PATH/$dir/$file" ]; then
|
||||
echo "✅ $name → $dir/$file"
|
||||
elif [ -d "$DEPLOY_PATH/$dir" ]; then
|
||||
echo "⚠️ $name → 目录存在,$file 缺失"
|
||||
ls "$DEPLOY_PATH/$dir/" 2>/dev/null | head -5
|
||||
else
|
||||
echo "❌ $name → $dir/ 不存在"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🔍 诊断完成 · $(date '+%Y-%m-%d %H:%M:%S %Z')"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
Loading…
Reference in New Issue