quality-inspection-platform/docs/deploy_server.md
qihongkun f5143aee09 feat: 添加 Docker 部署支持和 MCP 原生集成
- 添加 Dockerfile、docker-compose.yml 和 Jenkins 流水线配置
- 新增 MCP 原生集成模块 (mcp_native.py)
- 移除旧的 mcp_bridge.py,更新依赖和文档
- 添加部署文档 (Docker 和服务器部署指南)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-25 14:21:43 +08:00

482 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 服务器部署完整步骤Linux
本文假设在 **一台内网 Linux 服务器** 上从零部署,所有命令均在服务器上执行(通过 SSH 登录)。
- 部署目录示例:`/opt/quality-inspection-platform`
- 运行用户示例:`qip`(可改成你的业务用户)
- 监听端口:`8000`(也可用 Nginx 反代 80/443
**CentOS 7 用户**
- **推荐**:用 Docker无需在宿主机装 Python 3.11 → **[deploy_docker.md](./deploy_docker.md)**
- 裸机部署:系统自带 Python 3.6 不够用 → **[§1B CentOS 7](#1b-安装系统依赖-centos-7)**,再从 [§2](#2-创建运行用户与目录) 继续
---
## 0. 部署前确认
| 项目 | 要求 |
|------|------|
| 系统 | **CentOS 7**(见 §1B或 Ubuntu 20.04+ / Debian 11+(见 §1A |
| Python | **3.10+**(必须,用于 `mcp` / FastAPI |
| Node | **18+**(仅构建 `frontend-admin` 时需要) |
| 权限 | 能 `sudo` 安装软件、创建用户 |
| 网络 | 能访问内网 Git`npm` / `pip` 可用(或本机构建 `dist` 后上传) |
| 磁盘 | 预留 ≥2GB |
**交付能力(一个 `uvicorn` 进程)**
- Web 管理端:`http://<服务器>:8000/`
- API`/api/*`
- MCPCursor/Codex`http://<服务器>:8000/mcp`
- 数据文件:项目根目录 `ai_test.db`SQLite需备份
---
## 1A. 安装系统依赖Ubuntu / Debian
```bash
sudo apt update
sudo apt install -y git curl ca-certificates \
python3 python3-venv python3-pip \
nodejs npm
```
检查版本:
```bash
python3 --version # 须 >= 3.10
node --version # 建议 >= 18
```
`python3` 低于 3.10,请安装更新的 Python 后再继续。
`nodejs` 过旧,改用 [NodeSource](https://github.com/nodesource/distributions) 安装 18+。
---
## 1B. 安装系统依赖CentOS 7
CentOS 7 默认 `python3` 为 3.6**无法直接运行本项目**。推荐用 **IUS 的 Python 3.11** + **NodeSource 18**
### 1B.1 基础工具与编译依赖
```bash
sudo yum install -y epel-release
sudo yum install -y git curl ca-certificates gcc make \
openssl-devel bzip2-devel libffi-devel zlib-devel \
readline-devel sqlite-devel
```
### 1B.2 安装 Python 3.11IUS
```bash
# 若服务器不能访问外网,请改用内网 yum 源或在本机构好 wheel 再上传
sudo yum install -y https://repo.ius.io/ius-release-el7.rpm
sudo yum install -y python311 python311-pip python311-devel
python3.11 --version # 应显示 3.11.x
```
后续所有 `python3` / `pip` 命令在 CentOS 7 上请写成 **`python3.11`** / **`python3.11 -m pip`**。
### 1B.3 安装 Node.js 18构建前端
```bash
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
node --version # 应 >= v18
npm --version
```
**无法访问 NodeSource 时**:在开发机 `npm run build` 后,只把 `frontend-admin/dist/` 上传到服务器,可跳过 Node 安装(见 §5 说明)。
### 1B.4(可选)用 SCL Python 3.8 的说明
部分环境只有 `rh-python38`3.8),可能装不上新版 `mcp` 包。**不推荐** CentOS 7 用 3.8 跑本仓库;请优先 3.11。
---
## 2. 创建运行用户与目录
```bash
sudo useradd -r -m -d /opt/qip -s /bin/bash qip 2>/dev/null || true
sudo mkdir -p /opt/quality-inspection-platform
sudo chown -R qip:qip /opt/quality-inspection-platform
```
后续命令用 `qip` 执行(或你自己的用户):
```bash
sudo -iu qip
cd /opt/quality-inspection-platform
```
---
## 3. 获取代码
**方式 AGit推荐**
```bash
cd /opt/quality-inspection-platform
git clone <你的内网仓库地址> .
# 或指定分支git clone -b main <url> .
```
**方式 B上传压缩包**
在本机打包后 `scp` 到服务器,再解压:
```bash
cd /opt/quality-inspection-platform
tar xzf quality-inspection-platform.tar.gz --strip-components=1
```
---
## 4. 安装 Python 依赖
```bash
cd /opt/quality-inspection-platform
# Ubuntu / Debian
python3 -m venv .venv
# CentOS 7IUS
# python3.11 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
# 验证关键包
python -c "import fastapi, mcp, uvicorn; print('python deps ok')"
```
> CentOS 7 若 `pip install` 编译失败,确认已执行 §1B.1 的 `gcc` 与 `*-devel` 包;或在内网配置 pip 镜像源。
---
## 5. 构建前端(生产必做)
```bash
cd /opt/quality-inspection-platform/frontend-admin
npm install
npm run build
cd ..
ls -la frontend-admin/dist/index.html
```
必须存在 `frontend-admin/dist/index.html`,否则浏览器访问 `/` 会提示前端未构建。
**CentOS 7 未装 Node 时**:在开发机构建后只上传 `dist`
```bash
cd frontend-admin && npm install && npm run build
scp -r dist qip@<服务器>:/opt/quality-inspection-platform/frontend-admin/
```
**可选**:构建完成后删除 `node_modules` 节省空间(以后升级需重新 `npm install`
```bash
rm -rf /opt/quality-inspection-platform/frontend-admin/node_modules
```
---
## 6. 配置环境变量
```bash
cd /opt/quality-inspection-platform
mkdir -p data/ssh-scripts
cat > /opt/quality-inspection-platform/.env <<'EOF'
# 生产务必修改下面三项
AUTH_TOKEN_SECRET=请替换为随机长字符串
DEFAULT_SUPERADMIN_USERNAME=admin
DEFAULT_SUPERADMIN_PASSWORD=请替换为强密码
# MCP强制所有工具带 API Key
MCP_REQUIRE_API_KEY=true
# 同事从其它机器用 Cursor 连 MCP 时,若连不上可开启:
QIP_MCP_DISABLE_DNS_PROTECTION=true
# 或精确白名单(二选一):
# QIP_MCP_ALLOWED_HOSTS=10.0.0.5:8000,qip.internal:8000
# QIP_MCP_ALLOWED_ORIGINS=http://10.0.0.5:8000
# 可选Loki 日志探索
# GENERAL_LOKI_EXPLORE_URL=https://grafana.example/explore
EOF
chmod 600 .env
```
> `.env` 已在 `.gitignore` 中,不会进 Git。
> `uvicorn` 默认**不会**自动读 `.env`;下面 systemd 示例用 `EnvironmentFile` 加载。
---
## 7. 首次试跑(前台)
```bash
cd /opt/quality-inspection-platform
source .venv/bin/activate
set -a
source .env
set +a
uvicorn app.main:app --host 0.0.0.0 --port 8000
```
**另开一个 SSH 窗口**自检:
```bash
curl -s http://127.0.0.1:8000/health
# 期望:{"ok":true}
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8000/
# 期望200
```
浏览器访问:`http://<服务器IP>:8000/`
使用 `.env` 里的 `DEFAULT_SUPERADMIN_USERNAME` / `DEFAULT_SUPERADMIN_PASSWORD` 登录。
确认无误后,在前台试跑窗口 `Ctrl+C` 停止,进入第 8 步配置 systemd。
---
## 8. 配置 systemd 常驻
```bash
sudo tee /etc/systemd/system/quality-inspection-platform.service <<'EOF'
[Unit]
Description=Quality Inspection Platform
After=network.target
[Service]
Type=simple
User=qip
Group=qip
WorkingDirectory=/opt/quality-inspection-platform
EnvironmentFile=/opt/quality-inspection-platform/.env
Environment=PATH=/opt/quality-inspection-platform/.venv/bin:/usr/bin:/bin
ExecStart=/opt/quality-inspection-platform/.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable quality-inspection-platform
sudo systemctl start quality-inspection-platform
sudo systemctl status quality-inspection-platform
```
查看日志:
```bash
journalctl -u quality-inspection-platform -f
```
---
## 9. 防火墙(按需)
**CentOS 7firewalld** — 仅内网访问 8000
```bash
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port protocol="tcp" port="8000" accept'
sudo firewall-cmd --reload
```
若用 Nginx 对外 80
```bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
```
**Ubuntuufw**
```bash
sudo ufw allow from 10.0.0.0/8 to any port 8000 proto tcp
sudo ufw reload
```
若前面有 Nginx 对外 80/443则只开放 80/443**不要**把 8000 暴露到公网。
---
## 10. Nginx 反向代理(可选)
适用于希望用域名访问、或只暴露 80/443 的场景。
```bash
# Ubuntu / Debian
sudo apt install -y nginx
# CentOS 7
sudo yum install -y nginx
sudo systemctl enable nginx
```
```bash
sudo tee /etc/nginx/sites-available/quality-inspection-platform <<'EOF'
server {
listen 80;
server_name qip.internal; # 改成你的域名或 IP
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:8000;
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;
# MCP Streamable HTTP 可能需要较长连接
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
EOF
sudo ln -sf /etc/nginx/sites-available/quality-inspection-platform /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
```
此时访问地址变为:`http://qip.internal/`
MCP URL`http://qip.internal/mcp`
可将 systemd 里 uvicorn 改为只监听本机:
```ini
ExecStart=.../uvicorn app.main:app --host 127.0.0.1 --port 8000
```
---
## 11. 同事配置 MCP不在服务器装 Python
每人本机 Cursor `~/.cursor/mcp.json`
```json
{
"mcpServers": {
"quality-inspection-platform": {
"url": "http://qip.internal/mcp",
"headers": {
"Authorization": "Bearer sto-个人API密钥"
}
}
}
}
```
- `sto-` Key登录 Web → 个人中心创建
- 详细说明:[mcp_install.md](./mcp_install.md)
---
## 12. 数据备份
数据库与上传的 SSH 脚本目录:
```bash
# 示例:每日备份 cron
0 2 * * * qip cp /opt/quality-inspection-platform/ai_test.db /opt/qip/backup/ai_test.db.$(date +\%Y\%m\%d)
```
**升级代码时不要覆盖** 已有 `ai_test.db`
---
## 13. 版本升级流程
```bash
sudo systemctl stop quality-inspection-platform
sudo -iu qip
cd /opt/quality-inspection-platform
# 备份
cp -a ai_test.db ai_test.db.bak.$(date +%Y%m%d)
# 拉代码
git pull
source .venv/bin/activate
pip install -r requirements.txt
cd frontend-admin
npm install
npm run build
cd ..
exit
sudo systemctl start quality-inspection-platform
curl -s http://127.0.0.1:8000/health
```
---
## 14. 验收清单
| # | 检查 | 命令/操作 |
|---|------|-----------|
| 1 | 服务运行 | `systemctl is-active quality-inspection-platform` |
| 2 | 健康检查 | `curl -s http://127.0.0.1:8000/health` |
| 3 | Web 首页 | 浏览器打开 `/`,能登录 |
| 4 | API 文档 | `http://<主机>:8000/docs` |
| 5 | MCP 工具列表 | `curl -s http://127.0.0.1:8000/mcp/tools -H "Authorization: Bearer sto-xxx"` |
| 6 | 改密 | 登录后修改超管密码API Key 仅个人保管 |
| 7 | 防火墙 | 仅内网可达 |
---
## 15. 常见问题
| 现象 | 处理 |
|------|------|
| 访问 `/` 提示 frontend dist not found | 重新执行第 5 步 `npm run build`,或上传 `frontend-admin/dist` |
| `ModuleNotFoundError: mcp` | 第 4 步 `pip install -r requirements.txt`CentOS 7 须用 3.11 的 venv |
| CentOS 7 `python3` 是 3.6 | 不要用系统 `python3`,改用 `python3.11` 建 venv |
| `pip` 编译卡住 / 失败 | `yum install` §1B.1 开发包;配置内网 pip 镜像 |
| IUS / NodeSource 无法访问 | 内网 yum 镜像;或本机构建 `dist` + 离线 wheel 装 Python 包 |
| MCP 在 Cursor 里连不上 | `.env``QIP_MCP_DISABLE_DNS_PROTECTION=true` 或配置 `QIP_MCP_ALLOWED_HOSTS` |
| 401 / 无 Key | Web 个人中心创建 `sto-` Key或设 `MCP_REQUIRE_API_KEY` 后请求头带 Bearer |
| 端口被占用 | `ss -lntp \| grep 8000` 查占用进程 |
| 权限错误 | 确认 `ai_test.db`、`data/` 目录属主为 `qip` |
| SELinux 拦截CentOS | 临时:`sudo setenforce 0` 排查;长期:`setsebool -P httpd_can_network_connect 1` 或按策略放行 |
---
## 16. 相关文档
| 文档 | 内容 |
|------|------|
| [mcp_install.md](./mcp_install.md) | MCP / Cursor / 内网排障 |
| [mcp_tools_for_ai.md](./mcp_tools_for_ai.md) | AI 工具能力与 Recipe |
| [mcp_quickstart.md](./mcp_quickstart.md) | curl / HTTP 网关示例 |
---
## 快速命令抄录(已装好环境后)
```bash
cd /opt/quality-inspection-platform && source .venv/bin/activate
git pull && pip install -r requirements.txt
cd frontend-admin && npm install && npm run build && cd ..
sudo systemctl restart quality-inspection-platform
```