# 智能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 接口——这些都是外部资源,不算"系统混搭"。