#!/usr/bin/env bash # ════════════════════════════════════════════════════════════════ # 光湖 · MCP Server 一键部署脚本 # 在 CVM 服务器上直接运行此脚本完成部署 # ════════════════════════════════════════════════════════════════ # # 用法: bash deploy-mcp.sh # # 此脚本完成以下操作: # 1. 拉取最新代码 # 2. 安装 MCP Server 依赖 # 3. 注入 Gitea 令牌 # 4. 启动 MCP Server (PM2) # 5. 更新 Nginx 配置 # 6. 验证部署 # # 签发: 铸渊 · ICE-GL-ZY001 · TCS-0002∞ # ════════════════════════════════════════════════════════════════ set -e REPO_DIR="/data/guanghulab/repo" MCP_DIR="$REPO_DIR/server/mcp-server" NGINX_CONF_SRC="$REPO_DIR/server/nginx/guanghulab-cvm.conf" echo "═══════════════════════════════════════" echo " 铸渊 MCP Server 一键部署" echo " $(date '+%Y-%m-%d %H:%M:%S')" echo "═══════════════════════════════════════" # 1. 拉取最新代码 echo "" echo "── 1. 拉取最新代码 ──" cd "$REPO_DIR" git fetch origin git reset --hard origin/main echo "✅ 代码已同步: $(git log --oneline -1)" # 2. 安装依赖 echo "" echo "── 2. 安装依赖 ──" cd "$MCP_DIR" npm install --production echo "✅ 依赖已安装" # 3. 注入 Gitea 令牌 echo "" echo "── 3. 注入 Gitea 令牌 ──" # 从 Vault 获取(如果 Vault 在运行) TOKEN="" if curl -sf http://127.0.0.1:8080/internal/fetch/ZY_REPO_TOKEN > /dev/null 2>&1; then TOKEN=$(curl -s http://127.0.0.1:8080/internal/fetch/ZY_REPO_TOKEN | python3 -c "import json,sys;print(json.load(sys.stdin).get('value',''))" 2>/dev/null || "") fi if [ -z "$TOKEN" ]; then echo "⚠️ 无法从 Vault 获取令牌" echo " 请手动输入 Gitea 令牌(或按回车跳过,稍后手动配置):" read -r TOKEN fi if [ -n "$TOKEN" ]; then sed -i "s/GITEA_TOKEN: ''/GITEA_TOKEN: '$TOKEN'/" "$MCP_DIR/ecosystem.config.js" echo "✅ Gitea 令牌已注入" else echo "⚠️ 跳过令牌注入 — 请手动编辑 $MCP_DIR/ecosystem.config.js" fi # 4. 启动 MCP Server echo "" echo "── 4. 启动 MCP Server ──" mkdir -p /data/guanghulab/mcp-server /data/guanghulab/.runtime/logs if pm2 describe guanghulab-mcp-server &>/dev/null; then pm2 restart guanghulab-mcp-server echo "✅ MCP Server 已重启" else cd "$MCP_DIR" pm2 start ecosystem.config.js echo "✅ MCP Server 已启动" fi pm2 save # 5. 更新 Nginx 配置 echo "" echo "── 5. 更新 Nginx 配置 ──" # 找到当前使用的 Nginx 配置文件 NGINX_CONF="" for f in /etc/nginx/sites-enabled/guanghulab* /etc/nginx/conf.d/guanghulab*; do if [ -f "$f" ]; then NGINX_CONF="$f" break fi done if [ -z "$NGINX_CONF" ]; then echo "⚠️ 未找到现有 Nginx 配置文件" echo " 请手动将 $NGINX_CONF_SRC 中的 /mcp location 添加到 Nginx 配置中" else # 检查是否已有 /mcp 配置 if grep -q "location /mcp" "$NGINX_CONF"; then echo "✅ Nginx /mcp 代理已存在" else echo " 添加 /mcp 代理到 $NGINX_CONF ..." # 在 server 块末尾的 } 之前插入 sed -i '/^[[:space:]]*}$/i\ \ # ─── 铸渊 MCP Server (/mcp) ───\ location /mcp {\ proxy_pass http://127.0.0.1:8083;\ proxy_http_version 1.1;\ 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_set_header Connection '"'"''"'"';\ proxy_buffering off;\ proxy_cache off;\ proxy_read_timeout 86400s;\ proxy_send_timeout 86400s;\ }\ \ location = /mcp-health {\ proxy_pass http://127.0.0.1:8083/health;\ access_log off;\ }' "$NGINX_CONF" echo "✅ /mcp 代理已添加" fi # 测试并重载 if nginx -t 2>/dev/null; then nginx -s reload echo "✅ Nginx 已重载" else echo "❌ Nginx 配置测试失败,请手动检查" nginx -t fi fi # 6. 验证 echo "" echo "── 6. 验证部署 ──" sleep 2 # PM2 状态 if pm2 describe guanghulab-mcp-server &>/dev/null; then STATUS=$(pm2 jlist | python3 -c " import json,sys procs=json.load(sys.stdin) for p in procs: if p.get('name')=='guanghulab-mcp-server': print(p.get('pm2_env',{}).get('status','?')) " 2>/dev/null || echo "unknown") echo "PM2: $STATUS" else echo "❌ PM2 中未找到 guanghulab-mcp-server" fi # 健康检查 if curl -sf http://127.0.0.1:8083/health > /dev/null 2>&1; then echo "✅ MCP Server 健康检查通过" else echo "❌ MCP Server 健康检查失败" fi # 显示访问密钥 if [ -f "/data/guanghulab/mcp-server/.access-key" ]; then KEY=$(cat /data/guanghulab/mcp-server/.access-key) echo "" echo "═══════════════════════════════════════" echo " 🔑 MCP 连接信息" echo "═══════════════════════════════════════" echo "" echo " URL: https://guanghulab.com/mcp" echo " 密钥: $KEY" echo "" echo " WorkBuddy 配置:" echo ' {' echo ' "mcpServers": {' echo ' "guanghulab": {' echo ' "url": "https://guanghulab.com/mcp",' echo " \"headers\": { \"Authorization\": \"Bearer $KEY\" }" echo ' }' echo ' }' echo ' }' echo "" echo "═══════════════════════════════════════" fi echo "" echo "铸渊 MCP Server 部署完成 ✅" echo "ICE-GL-ZY001 · TCS-0002∞"