Files
wecom_it_smart_desk/docs/正式环境独立部署架构方案.md

20 KiB
Raw Permalink Blame History

智能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(建议)
解析目标 新服务器 IPOA 网络)
用途 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 RAGFlowM2
出站 新服务器 10.80.0.49 5000 Qwen3-30BM2
出站 新服务器 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_netPG/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 监控指标

# 建议在新服务器上配置的基础监控
主机层面:
  - 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 接口——这些都是外部资源,不算"系统混搭"。