chore: initial baseline with P0-safety .gitignore
This commit is contained in:
@@ -0,0 +1,410 @@
|
||||
# 智能IT助手 — 正式环境独立部署架构方案
|
||||
|
||||
> **版本**: v1.1 | **日期**: 2026-06-03 | **编制**: 宋献(IT支持组组长)
|
||||
> **目标**: 以对现有正式环境影响最小、责任边界最清晰的方式,完成新系统正式环境部署
|
||||
|
||||
---
|
||||
|
||||
## 一、核心决策原则
|
||||
|
||||
基于以下四个约束条件,确立本次架构设计的决策原则:
|
||||
|
||||
| # | 约束 | 推导原则 |
|
||||
|---|------|---------|
|
||||
| 1 | 对现有正式环境架构影响最小 | **物理隔离 > 逻辑隔离**:能用独立资源就不用共享资源 |
|
||||
| 2 | 避免后续上线/变更影响现有服务 | **独立Nginx入口**:变更新系统反代规则时不影响旧系统 |
|
||||
| 3 | 减少服务影响和依赖 | **最小化外部依赖**:只依赖真正不可替代的外部服务 |
|
||||
| 4 | 避免混搭导致责任不清 | **独立数据库 + 独立Redis**:不共享存储层,运维边界清晰 |
|
||||
|
||||
> **一句话总结**:新系统作为**独立服务单元**部署,与现有智能IT数据平台(Django)在物理资源层面完全解耦,仅通过 HTTP API 调用共享 AI 能力(Dify/RAGFlow/Qwen)。
|
||||
|
||||
---
|
||||
|
||||
## 二、与复用评估的关键修正
|
||||
|
||||
原复用评估(团队沟通文档第7章)建议了部分资源共享方案。基于上述独立部署原则,修正如下:
|
||||
|
||||
| 原复用建议 | 修正方案 | 理由 |
|
||||
|-----------|---------|------|
|
||||
| 同机部署于 10.80.0.86 | **申请独立服务器/VM** | 避免端口冲突、资源争抢、变更互相影响 |
|
||||
| Redis 复用同实例(db=0/db=1) | **独立 Redis 容器** | db 号隔离不彻底(FLUSHDB 误操作、内存OOM互相影响) |
|
||||
| 使用旧系统 Nginx | **独立 Nginx 容器** | 变更新系统反代配置时不影响旧系统路由 |
|
||||
| 复用旧系统 PostgreSQL 实例 | **独立 PostgreSQL 容器** | 数据库是"责任边界"的核心——谁的数据谁负责 |
|
||||
| SSL 复用现有证书 | **可复用**(Nginx 层读取同一证书文件) | 证书是静态文件,只读访问无耦合风险 |
|
||||
|
||||
**仍然保持的复用(零耦合):**
|
||||
|
||||
| 资源 | 复用方式 | 耦合度 |
|
||||
|------|---------|--------|
|
||||
| 企微自建应用凭证 | 配置文件引用(同一个 CorpID/AgentID/Secret) | 零耦合(只读凭证) |
|
||||
| Dify Workflow API | HTTP 调用 `yw-dify.dc.servyou-it.com` | 外部依赖(HTTP) |
|
||||
| RAGFlow 知识库 | HTTP 调用 `10.80.0.85:8080` | 外部依赖(HTTP) |
|
||||
| Qwen3-30B 大模型 | HTTP 调用 `10.80.0.49:5000` | 外部依赖(HTTP) |
|
||||
| SSL 证书文件 | Nginx 挂载只读 | 零耦合(静态文件) |
|
||||
|
||||
---
|
||||
|
||||
## 三、资源申请清单
|
||||
|
||||
### 3.1 服务器
|
||||
|
||||
| 项目 | 申请内容 | 说明 |
|
||||
|------|---------|------|
|
||||
| 服务器数量 | **1 台 VM** | Docker Compose 单机部署,4 个容器运行在同一 Docker Engine |
|
||||
| 最低配置 | 4C8G + 100GB SSD | 预留 2 年增长空间 |
|
||||
| 推荐配置 | 8C16G + 200GB SSD | 考虑到 M2 阶段接入 AI 后的并发请求量 |
|
||||
| 操作系统 | CentOS 7.9+ / Rocky Linux 8+ / Ubuntu 22.04 LTS | 公司标准镜像 |
|
||||
| 网络域 | **OA 服务器网络** | 与现有 10.80.0.86 同域,办公网默认可达 |
|
||||
| Docker | 预装 Docker Engine 24+ + Docker Compose v2 | 基础运行环境 |
|
||||
|
||||
**为什么不在旧服务器上部署?**
|
||||
```
|
||||
10.80.0.86(现状):
|
||||
├── Django 3.2(智能IT数据平台)—— 生产运行中
|
||||
├── PostgreSQL 13(本地实例) —— 生产运行中
|
||||
└── Redis 7 —— 生产运行中
|
||||
│
|
||||
│ ❌ 不推荐:新系统 FastAPI 同机部署
|
||||
│ 风险1: 端口冲突(旧Django :8000, 新FastAPI也需要 :8000)
|
||||
│ 风险2: 内存竞争(Python进程内存开销大)
|
||||
│ 风险3: Docker 服务重启影响两个系统
|
||||
│ 风险4: 变更新系统 Nginx 配置时可能影响旧系统
|
||||
│
|
||||
▼
|
||||
新服务器(建议):
|
||||
├── Docker Engine
|
||||
│ ├── wecom_it_nginx —— 独立 Nginx 容器
|
||||
│ ├── wecom_it_backend —— FastAPI 后端
|
||||
│ ├── wecom_it_postgres —— PostgreSQL 16
|
||||
│ └── wecom_it_redis —— Redis 7
|
||||
└── 完全不接触旧系统资源
|
||||
```
|
||||
|
||||
### 3.2 域名
|
||||
|
||||
| 项目 | 申请内容 |
|
||||
|------|---------|
|
||||
| 域名 | `itdesk.dc.servyou-it.com`(建议) |
|
||||
| 解析目标 | 新服务器 IP(OA 网络) |
|
||||
| 用途 | Nginx 统一入口 + OAuth2 回调 + CORS |
|
||||
|
||||
> 备选域名:`itdesk-oa.servyou-it.com` 或沿用 `it-dataquery` 子域模式改为 `it-smartdesk`
|
||||
|
||||
### 3.3 防火墙/网络策略
|
||||
|
||||
| 方向 | 源 | 目标 | 端口 | 用途 |
|
||||
|------|-----|------|------|------|
|
||||
| 入站 | 办公网 | 新服务器 | 80/443 | 坐席浏览器访问工作台 |
|
||||
| 入站 | 企微服务器 | 新服务器 | 443 | 企微消息回调 |
|
||||
| 出站 | 新服务器 | `qyapi.weixin.qq.com` | 443 | 企微 API 调用 |
|
||||
| 出站 | 新服务器 | `yw-dify.dc.servyou-it.com` | 443 | Dify AI 调用(M2) |
|
||||
| 出站 | 新服务器 | `10.80.0.85` | 8080 | RAGFlow(M2) |
|
||||
| 出站 | 新服务器 | `10.80.0.49` | 5000 | Qwen3-30B(M2) |
|
||||
| 出站 | 新服务器 | NTP 服务器 | 123 | 时间同步 |
|
||||
|
||||
> **不需要开通**:新服务器 → 10.80.0.86(完全不需要访问旧系统)
|
||||
|
||||
---
|
||||
|
||||
## 四、架构设计
|
||||
|
||||
### 4.1 网络拓扑
|
||||
|
||||
```
|
||||
┌────────────────────────────┐
|
||||
│ 企微服务器(外部) │
|
||||
│ qyapi.weixin.qq.com │
|
||||
└──────────┬─────────────────┘
|
||||
│ HTTPS :443
|
||||
▼
|
||||
┌──────────────── 办公网络 ────────────────────────────────┐
|
||||
│ │
|
||||
│ ┌──────────┐ ┌──────────────────────────┐ │
|
||||
│ │ 坐席浏览器 │────────▶│ https://itdesk.dc. │ │
|
||||
│ │ (内网) │ HTTPS │ servyou-it.com │ │
|
||||
│ └──────────┘ └──────────┬───────────────┘ │
|
||||
│ │ │
|
||||
├────────────────── OA 服务器网络 ──┼───────────────────────┤
|
||||
│ │ │
|
||||
│ ┌───────▼──────────────┐ │
|
||||
│ │ 新服务器 (Docker) │ │
|
||||
│ │ │ │
|
||||
│ │ ┌────────────────┐ │ │
|
||||
│ │ │ Nginx :80/443 │ │ │
|
||||
│ │ │ 独立容器 │ │ │
|
||||
│ │ └───────┬────────┘ │ │
|
||||
│ │ │ │ │
|
||||
│ │ ┌───────▼────────┐ │ │
|
||||
│ │ │ FastAPI :8000 │ │ │
|
||||
│ │ │ 独立容器 │ │ │
|
||||
│ │ └───┬───────┬────┘ │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ ┌───▼──┐ ┌──▼───┐ │ │
|
||||
│ │ │ PG16 │ │Redis7│ │ │
|
||||
│ │ │独立容器│ │独立容器│ │ │
|
||||
│ │ └──────┘ └──────┘ │ │
|
||||
│ └──────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌────────▼──────────────┐ │
|
||||
│ │ 现有 AI 服务(外部依赖)│ │
|
||||
│ │ ├─ Dify (M2阶段调用) │ │
|
||||
│ │ ├─ RAGFlow (M2调用) │ │
|
||||
│ │ └─ Qwen3-30B (M2调用) │ │
|
||||
│ └───────────────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────┐ │
|
||||
│ │ 现有智能IT数据平台 (10.80.0.86) │ │
|
||||
│ │ Django + PG13 + Redis │ │
|
||||
│ │ ⚠️ 新系统不访问此服务器 │ │
|
||||
│ └─────────────────────────────────────────┘ │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 容器拓扑
|
||||
|
||||
```
|
||||
新服务器 Docker Engine
|
||||
│
|
||||
├── Docker Network: itdesk_net (bridge, internal)
|
||||
│ │
|
||||
│ ├── Container: wecom_it_postgres
|
||||
│ │ Image: postgres:16-alpine
|
||||
│ │ Volume: wecom_it_postgres_data
|
||||
│ │ Port: 5432 (仅 itdesk_net 内部)
|
||||
│ │
|
||||
│ ├── Container: wecom_it_redis
|
||||
│ │ Image: redis:7-alpine
|
||||
│ │ Volume: wecom_it_redis_data
|
||||
│ │ Port: 6379 (仅 itdesk_net 内部)
|
||||
│ │
|
||||
│ ├── Container: wecom_it_backend
|
||||
│ │ Image: wecom-it-desk-backend:latest
|
||||
│ │ Port: 8000 (仅 itdesk_net 内部)
|
||||
│ │ Env: DATABASE_URL, REDIS_URL, WECOM_*
|
||||
│ │ Healthcheck: GET /health
|
||||
│ │
|
||||
│ └── Container: wecom_it_nginx
|
||||
│ Image: nginx:1.27-alpine
|
||||
│ Port: 80:80, 443:443 (宿主机映射)
|
||||
│ Volumes: nginx.conf:ro, 前端dist:ro, SSL:ro
|
||||
│ Healthcheck: GET /health
|
||||
│
|
||||
└── Volumes (命名卷,持久化)
|
||||
├── wecom_it_postgres_data
|
||||
└── wecom_it_redis_data
|
||||
```
|
||||
|
||||
### 4.3 关键隔离策略
|
||||
|
||||
| 隔离层面 | 方案 | 隔离效果 |
|
||||
|---------|------|---------|
|
||||
| **服务器级** | 独立 VM,不共用宿主机 | 挂了不影响旧系统 |
|
||||
| **网络级** | Docker 内部网络 `itdesk_net`,PG/Redis 不暴露宿主机端口 | 外部无法直连数据库 |
|
||||
| **存储级** | 独立命名卷,不共用 Volume | 数据完全隔离 |
|
||||
| **域名级** | 独立子域名 + 独立 Nginx 容器 | 变更反代规则不影响旧系统 |
|
||||
| **认证级** | JWT + 独立 Redis,不依赖旧系统 Session | 账户体系独立 |
|
||||
| **依赖级** | 仅 HTTP 调用外部 AI 服务 | 外部服务故障只影响 M2 功能 |
|
||||
|
||||
---
|
||||
|
||||
## 五、与现有系统的交互边界
|
||||
|
||||
### 5.1 M1 阶段(当前)— 零交互
|
||||
|
||||
```
|
||||
新系统 现有系统
|
||||
┌─────────────┐ ┌─────────────────┐
|
||||
│ 企微回调接收 │ │ 智能IT数据平台 │
|
||||
│ 坐席工作台 │ ← 无交互 → │ (Django) │
|
||||
│ 员工H5端 │ │ 数据查询/标注 │
|
||||
│ PG16+Redis7 │ │ PG13+Redis │
|
||||
└─────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
M1 阶段新系统和现有系统**完全无交互**,各自独立运行。
|
||||
|
||||
### 5.2 M2 阶段 — HTTP 只读调用
|
||||
|
||||
```
|
||||
新系统 现有系统
|
||||
┌─────────────┐ HTTP(只读) ┌─────────────────┐
|
||||
│ FastAPI │─────┬──────────▶│ Dify Workflow │
|
||||
│ │ │ │ (AI 回复) │
|
||||
│ │ ├──────────▶│ RAGFlow │
|
||||
│ │ │ │ (知识库检索) │
|
||||
│ │ └──────────▶│ Qwen3-30B │
|
||||
│ │ │ (大模型) │
|
||||
│ │ HTTP(只读) │ │
|
||||
│ │────────────────▶│ Dify DB (只读) │
|
||||
│ │ 历史对话同步 │ 10.80.128.40 │
|
||||
└─────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
M2 阶段新增的对接全部是 **HTTP 只读调用**,新系统不写任何数据到现有系统数据库。
|
||||
|
||||
### 5.3 M3 阶段 — 可选数据合并
|
||||
|
||||
```
|
||||
M3 阶段(远期):
|
||||
├── 数据平台 → 可保留独立运行(零影响方案)
|
||||
├── 或 → 新系统接管统计报表功能(需迁移历史数据)
|
||||
└── 决策点:届时根据 M1/M2 运行效果评估
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、部署流程
|
||||
|
||||
### 6.1 部署前准备清单
|
||||
|
||||
| # | 事项 | 责任人 | 预计耗时 |
|
||||
|---|------|--------|---------|
|
||||
| 1 | 申请 OA 网络服务器 VM | 宋献 → 运维 | 1-3 天 |
|
||||
| 2 | 申请域名 `itdesk.dc.servyou-it.com` | 宋献 → 运维 | 0.5 天 |
|
||||
| 3 | 申请防火墙策略(见 §3.3) | 宋献 → 网络组 | 1-2 天 |
|
||||
| 4 | 确认企微自建应用回调 URL | 宋献 | 即时 |
|
||||
| 5 | 准备 SSL 证书(复用或新申请) | 宋献 → 运维 | 即时/1天 |
|
||||
| 6 | 服务器安装 Docker + Compose | 运维/宋献 | 0.5 天 |
|
||||
|
||||
### 6.2 部署步骤
|
||||
|
||||
```
|
||||
Step 1: 服务器就绪
|
||||
├── SSH 登录新服务器
|
||||
├── 确认 Docker Engine 版本 ≥ 24
|
||||
├── 确认 Docker Compose v2 可用
|
||||
└── 创建部署目录 /opt/wecom-it-desk/
|
||||
|
||||
Step 2: 代码部署
|
||||
├── git clone 或 scp 项目到 /opt/wecom-it-desk/
|
||||
├── cp .env.production .env
|
||||
├── 编辑 .env 填入真实企微凭证
|
||||
└── bash scripts/build.sh # 构建前端
|
||||
|
||||
Step 3: 启动服务
|
||||
├── docker compose up -d
|
||||
├── 等待 healthcheck 全部通过
|
||||
├── docker compose ps # 确认 4 容器 running
|
||||
└── curl http://localhost:8000/health # 确认 API 可用
|
||||
|
||||
Step 4: Nginx + HTTPS
|
||||
├── 挂载 SSL 证书到 ./nginx/ssl/
|
||||
├── 启用 nginx.conf 中 HTTPS 段
|
||||
├── docker compose restart nginx
|
||||
└── curl https://itdesk.dc.servyou-it.com/health
|
||||
|
||||
Step 5: 企微回调验证
|
||||
├── 企微管理后台 → 自建应用 → 接收消息
|
||||
├── URL: https://itdesk.dc.servyou-it.com/api/wecom/callback
|
||||
├── Token + EncodingAESKey(与 .env 一致)
|
||||
└── 点击「验证」→ 确认通过
|
||||
|
||||
Step 6: 冒烟测试
|
||||
├── 员工企微发送消息 → 后端日志确认收到
|
||||
├── 坐席登录工作台 → 看到新会话
|
||||
├── 坐席回复 → 员工企微收到消息
|
||||
└── 全部通过 → 上线完成
|
||||
```
|
||||
|
||||
### 6.3 回滚方案
|
||||
|
||||
```
|
||||
回滚命令(一条命令恢复):
|
||||
docker compose down # 停止新系统所有容器
|
||||
# 旧系统不受任何影响(独立服务器,无共享资源)
|
||||
|
||||
问题定位期间:
|
||||
docker compose logs -f backend # 查看后端日志
|
||||
docker compose ps # 查看容器状态
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、运维边界与责任划分
|
||||
|
||||
### 7.1 责任矩阵
|
||||
|
||||
| 运维操作 | 新系统 | 旧系统 | 影响范围 |
|
||||
|---------|--------|--------|---------|
|
||||
| 重启 PostgreSQL | 仅影响新系统 | 不受影响 | 独立实例 |
|
||||
| 重启 Redis | 仅影响新系统 | 不受影响 | 独立实例 |
|
||||
| 修改 Nginx 配置 | 仅影响新系统路由 | 不受影响 | 独立容器 |
|
||||
| 更新后端代码 | 仅影响新系统 | 不受影响 | 独立容器 |
|
||||
| Docker 服务重启 | 仅影响新系统 | 不受影响 | 独立宿主机 |
|
||||
| 企微应用配置变更 | **同时影响两个系统**(共用应用) | — | ⚠️ 唯一共享点 |
|
||||
| Dify/RAGFlow/Qwen 故障 | 影响新系统 M2 功能 | 可能影响旧系统 | 外部依赖 |
|
||||
|
||||
> **唯一耦合点**:企微自建应用。变更应用配置(如 Secret 轮换、回调 URL 修改)需通知双方。
|
||||
|
||||
### 7.2 监控指标
|
||||
|
||||
```yaml
|
||||
# 建议在新服务器上配置的基础监控
|
||||
主机层面:
|
||||
- CPU 使用率 < 80%
|
||||
- 内存使用率 < 80%
|
||||
- 磁盘使用率 < 70%
|
||||
|
||||
容器层面:
|
||||
- docker compose ps 全部 "Up" 状态
|
||||
- Nginx 健康检查: GET /health → 200
|
||||
- Backend 健康检查: GET /health → 200
|
||||
|
||||
业务层面(后续接入):
|
||||
- 企微消息回调成功率 > 99%
|
||||
- API 响应时间 P95 < 500ms
|
||||
```
|
||||
|
||||
### 7.3 备份策略
|
||||
|
||||
| 备份对象 | 方法 | 频率 | 保留 |
|
||||
|---------|------|------|------|
|
||||
| PostgreSQL 数据 | `pg_dump` + 卷快照 | 每日凌晨 | 7 天 |
|
||||
| Redis 数据 | `SAVE` + 复制 dump.rdb | 每日凌晨 | 7 天 |
|
||||
| Docker 卷 | `docker run --rm -v wecom_it_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/pg_backup.tar.gz -C /data .` | 每周 | 4 周 |
|
||||
|
||||
---
|
||||
|
||||
## 八、风险矩阵
|
||||
|
||||
| 风险 | 概率 | 影响 | 缓解措施 |
|
||||
|------|------|------|---------|
|
||||
| 新服务器申请被拒/延迟 | 中 | 部署延期 | 短期退化方案:使用旧服务器但严格端口分离+独立 compose |
|
||||
| SSL 证书到期 | 低 | HTTPS 不可用 | 复用现有通配符证书(统一管理到期时间) |
|
||||
| 企微应用配置变更导致双系统异常 | 低 | 双系统消息中断 | 建立变更通知机制,双方知晓 |
|
||||
| Dify/RAGFlow 服务不可用 | 中 | M2 阶段 AI 功能不可用 | 降级:纯坐席模式仍可正常工作 |
|
||||
| Docker 宿主机故障 | 低 | 新系统全宕 | Docker Compose 配置即代码,重建速度快 |
|
||||
|
||||
### 8.1 退化方案(如果申请不到新服务器)
|
||||
|
||||
```
|
||||
短期退化方案(临时,不推荐长期使用):
|
||||
旧服务器 10.80.0.86 上:
|
||||
├── 端口映射: Nginx 新容器用 81/444(避免与旧 Nginx 冲突)
|
||||
├── 独立 compose 项目: docker compose -p itdesk up -d
|
||||
├── 独立 Docker 网络: itdesk_net(不与 dbquery_net 混用)
|
||||
└── 资源限制: 限制 backend 容器内存上限(--memory=2g)
|
||||
|
||||
从退化方案正式迁移到独立服务器时:
|
||||
├── docker compose down
|
||||
├── 复制卷数据到新服务器
|
||||
├── 新服务器上 docker compose up -d
|
||||
└── 修改域名解析 → 完成迁移
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 九、决策总结
|
||||
|
||||
| 决策项 | 选择 | 核心理由 |
|
||||
|--------|------|---------|
|
||||
| 部署服务器 | **独立 VM**(非 10.80.0.86) | 物理隔离 = 责任清晰 + 变更互不影响 |
|
||||
| PostgreSQL | **独立容器**(pg:16-alpine) | 数据库是"责任边界"核心,绝不能共享 |
|
||||
| Redis | **独立容器**(redis:7-alpine) | 避免误操作和 OOM 互相影响 |
|
||||
| Nginx | **独立容器 + 独立子域名** | 变更反代规则不影响旧系统 |
|
||||
| Docker 网络 | **独立 bridge 网络**(itdesk_net) | 不与 dbquery_net 互通 |
|
||||
| 外部 AI 服务 | HTTP 只读调用 | 外部依赖合理复用,通过降级策略容错 |
|
||||
| 企微应用凭证 | 配置文件复用 | 零耦合(只读凭证),唯一共享点 |
|
||||
| SSL 证书 | 文件复用(只读挂载) | 静态文件,无耦合风险 |
|
||||
|
||||
> **一句话**:新系统是一个**独立的 Docker Compose 应用**,部署在**独立服务器**上,通过**独立域名**提供服务,与现有系统共享的只有企微应用凭证和 AI 服务的 HTTP 接口——这些都是外部资源,不算"系统混搭"。
|
||||
Reference in New Issue
Block a user