229 lines
9.0 KiB
YAML
229 lines
9.0 KiB
YAML
# ═══════════════════════════════════════════════════════════
|
||
# MCP 自适应更新工作流
|
||
# ═══════════════════════════════════════════════════════════
|
||
#
|
||
# 什么场景用?
|
||
# 1. 你换了新账号 → 打开仓库 → 仓库 .workbuddy/mcp.json 自动加载
|
||
# 2. CVM 关机后重新开机 → 服务可能没恢复
|
||
# 3. 点 MCP 连接不成功 → 来 Actions 里手动触发这个工作流
|
||
#
|
||
# 这个工作流做什么?
|
||
# 1. 检测 CVM 当前环境(主机名、网络、服务状态)
|
||
# 2. 确保 MCP Server 在 8083 端口运行
|
||
# 3. 如果没运行 → 自动拉起(npm install + pm2 start)
|
||
# 4. 输出当前 MCP 访问密钥
|
||
# 5. 验证 Nginx → /mcp → 8083 整条链路
|
||
# 6. 输出中文状态报告
|
||
#
|
||
# 守护:铸渊 · ICE-GL-ZY001 · 版权:国作登字-2026-A-00037559
|
||
# ═══════════════════════════════════════════════════════════
|
||
|
||
name: MCP 自适应更新
|
||
run-name: MCP自适应检测 - ${{ github.actor }}
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
force_reset_key:
|
||
description: '强制重置 MCP 访问密钥(一般不勾)'
|
||
type: boolean
|
||
default: false
|
||
required: false
|
||
|
||
jobs:
|
||
detect-and-repair:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
# ─── 1. 环境检测 ──────────────────────────────────────
|
||
- name: 检测当前环境
|
||
id: detect
|
||
run: |
|
||
echo "═══════════════════════════"
|
||
echo "MCP 自适应检测 开始"
|
||
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
||
echo "═══════════════════════════"
|
||
echo ""
|
||
|
||
echo "── 1. 系统环境 ──"
|
||
echo "主机名: $(hostname)"
|
||
echo "系统: $(uname -srm)"
|
||
echo "公网IP: $(curl -sf --connect-timeout 5 https://ifconfig.me 2>/dev/null || echo '检测超时')"
|
||
echo ""
|
||
|
||
echo "── 2. 存储盘 ──"
|
||
df -h /data/guanghulab/ 2>/dev/null | tail -1 | awk '{print "数据盘: " $2 " 总量, " $4 " 可用"}'
|
||
echo ""
|
||
|
||
# ─── 2. MCP Server 状态 ────────────────────────────────
|
||
- name: 检查 MCP Server 状态
|
||
id: check_mcp
|
||
continue-on-error: true
|
||
run: |
|
||
echo "── 3. MCP Server 健康状况 ──"
|
||
HEALTH=$(curl -sf http://127.0.0.1:8083/health 2>/dev/null)
|
||
if [ -n "$HEALTH" ]; then
|
||
echo "✅ MCP Server: 正常运行"
|
||
echo " $HEALTH" | head -3
|
||
echo "has_mcp=true" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "❌ MCP Server: 未响应"
|
||
echo "has_mcp=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
echo ""
|
||
|
||
echo "── 4. Nginx 到 MCP 链路 ──"
|
||
NGINX_OK=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/mcp-health 2>/dev/null)
|
||
if [ "$NGINX_OK" = "200" ]; then
|
||
echo "✅ Nginx 到 MCP 链路: 正常 ($NGINX_OK)"
|
||
else
|
||
echo "❌ Nginx 到 MCP 链路: 异常 (返回 $NGINX_OK)"
|
||
fi
|
||
echo ""
|
||
|
||
echo "── 5. MCP 访问密钥 ──"
|
||
KEY_PATH="/data/guanghulab/mcp-server/.access-key"
|
||
if [ -f "$KEY_PATH" ]; then
|
||
KEY=$(cat "$KEY_PATH")
|
||
echo "✅ 密钥文件存在"
|
||
echo " 密钥: $KEY"
|
||
echo "mcp_key=$KEY" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "❌ 密钥文件不存在(首次启动时会自动生成)"
|
||
echo "mcp_key=未生成" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
# ─── 3. 自动修复 ──────────────────────────────────────
|
||
- name: 自动修复 MCP Server
|
||
if: steps.check_mcp.outputs.has_mcp == 'false'
|
||
run: |
|
||
echo ""
|
||
echo "═══ 开始自动修复 ═══"
|
||
echo ""
|
||
|
||
echo "第1步: 进入 MCP Server 目录"
|
||
cd /data/guanghulab/repo/server/mcp-server
|
||
echo "当前目录: $(pwd)"
|
||
echo ""
|
||
|
||
echo "第2步: 安装依赖"
|
||
npm install --production 2>&1 | tail -3
|
||
echo ""
|
||
|
||
echo "第3步: 启动 MCP Server (PM2)"
|
||
pm2 start ecosystem.config.cjs --update-env 2>&1
|
||
pm2 save
|
||
echo ""
|
||
|
||
echo "第4步: 等待启动"
|
||
sleep 3
|
||
echo ""
|
||
|
||
echo "第5步: 验证"
|
||
curl -sf http://127.0.0.1:8083/health && echo "" && echo "✅ 修复成功" || echo "❌ 修复失败"
|
||
echo ""
|
||
|
||
# ─── 4. 完整验证 ──────────────────────────────────────
|
||
- name: 全链路验证
|
||
run: |
|
||
echo ""
|
||
echo "═══════════════════════════"
|
||
echo "MCP 全链路验证"
|
||
echo "═══════════════════════════"
|
||
echo ""
|
||
|
||
PASS=0
|
||
FAIL=0
|
||
|
||
# 检测1: MCP 直达
|
||
if curl -sf http://127.0.0.1:8083/health > /dev/null 2>&1; then
|
||
echo "✅ [1/4] MCP Server 直达: 正常"
|
||
PASS=$((PASS+1))
|
||
else
|
||
echo "❌ [1/4] MCP Server 直达: 异常"
|
||
FAIL=$((FAIL+1))
|
||
fi
|
||
|
||
# 检测2: 通过 Nginx
|
||
STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/mcp-health 2>/dev/null)
|
||
if [ "$STATUS" = "200" ]; then
|
||
echo "✅ [2/4] Nginx → MCP 链路: 正常"
|
||
PASS=$((PASS+1))
|
||
else
|
||
echo "❌ [2/4] Nginx → MCP 链路: 异常 (HTTP $STATUS)"
|
||
FAIL=$((FAIL+1))
|
||
fi
|
||
|
||
# 检测3: MCP 密钥
|
||
KEY_PATH="/data/guanghulab/mcp-server/.access-key"
|
||
if [ -f "$KEY_PATH" ] && [ "$(cat "$KEY_PATH" | wc -c)" -ge 32 ]; then
|
||
echo "✅ [3/4] MCP 密钥文件: 正常"
|
||
PASS=$((PASS+1))
|
||
else
|
||
echo "❌ [3/4] MCP 密钥文件: 异常"
|
||
FAIL=$((FAIL+1))
|
||
fi
|
||
|
||
# 检测4: PM2 进程
|
||
if pm2 describe guanghulab-mcp-server > /dev/null 2>&1; then
|
||
STATUS=$(pm2 describe guanghulab-mcp-server 2>/dev/null | grep "status" | head -1 | awk '{print $NF}')
|
||
if [ "$STATUS" = "online" ]; then
|
||
echo "✅ [4/4] PM2 进程: online"
|
||
PASS=$((PASS+1))
|
||
else
|
||
echo "❌ [4/4] PM2 进程: $STATUS"
|
||
FAIL=$((FAIL+1))
|
||
fi
|
||
else
|
||
echo "❌ [4/4] PM2 进程: 不存在"
|
||
FAIL=$((FAIL+1))
|
||
fi
|
||
|
||
echo ""
|
||
echo "─── 结果 ───"
|
||
if [ "$FAIL" -eq 0 ]; then
|
||
echo "✅ 全部通过 ($PASS/4)"
|
||
else
|
||
echo "⚠️ $FAIL 项异常 ($PASS/4 通过)"
|
||
fi
|
||
|
||
# ─── 5. MCP 连接指南 ─────────────────────────────────
|
||
- name: MCP 连接指南
|
||
run: |
|
||
echo ""
|
||
echo "═══════════════════════════"
|
||
echo "MCP 连接配置"
|
||
echo "═══════════════════════════"
|
||
echo ""
|
||
|
||
KEY_PATH="/data/guanghulab/mcp-server/.access-key"
|
||
if [ -f "$KEY_PATH" ]; then
|
||
KEY=$(cat "$KEY_PATH")
|
||
else
|
||
KEY="(密钥未生成,请检查 MCP Server 状态)"
|
||
fi
|
||
|
||
echo "把你的 ~/.workbuddy/mcp.json 设为以下内容:"
|
||
echo ""
|
||
echo "=================================================="
|
||
echo '{'
|
||
echo ' "mcpServers": {'
|
||
echo ' "guanghulab": {'
|
||
echo ' "url": "https://guanghulab.com/mcp",'
|
||
echo ' "headers": {'
|
||
echo ' "Authorization": "Bearer '"$KEY"'"'
|
||
echo ' }'
|
||
echo ' }'
|
||
echo ' }'
|
||
echo '}'
|
||
echo "=================================================="
|
||
echo ""
|
||
echo "⚠️ 仓库里 .workbuddy/mcp.json 已配好这个值。"
|
||
echo " 换号后打开仓库,WorkBuddy 会自动读取这个配置。"
|
||
echo " 如果连不上,来这里跑一次检测即可。"
|
||
echo ""
|
||
echo "─────────────────────────"
|
||
echo "铸渊 · ICE-GL-ZY001"
|
||
echo "═══════════════════════════"
|