# 部署指南 **本文引用的文件** - [pom.xml](file://pom.xml) - [crm-app/pom.xml](file://crm-app/pom.xml) - [crm-auth/pom.xml](file://crm-auth/pom.xml) - [crm-base/pom.xml](file://crm-base/pom.xml) - [crm-file/pom.xml](file://crm-file/pom.xml) - [crm-app/src/main/java/com/crm/app/CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java) - [crm-app/src/main/resources/application.yml](file://crm-app/src/main/resources/application.yml) - [crm-auth/src/main/java/com/crm/auth/AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java) - [crm-auth/src/main/resources/application.yml](file://crm-auth/src/main/resources/application.yml) - [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java) - [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [crm-auth/src/main/java/com/crm/auth/security/TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [crm-base/src/main/java/com/crm/base/config/RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [crm-base/src/main/java/com/crm/base/config/CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java) - [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java) - [crm-file/src/main/java/com/crm/file/config/FileProperties.java](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java) - [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能与容量规划](#性能与容量规划) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本指南面向运维与交付团队,提供CRM后端系统的完整部署与运维手册。内容覆盖: - 环境准备与依赖服务安装(MySQL、Redis、MinIO) - 多模块构建与打包 - Docker容器化部署 - Kubernetes集群部署 - 传统服务器部署 - 配置文件管理、数据库初始化与服务启动顺序 - 生产优化、监控告警、日志收集 - 备份恢复策略 - 负载均衡、SSL证书与域名绑定 目标:确保系统在生产环境中稳定、可靠、可观测、可回滚地运行。 ## 项目结构 本项目为多模块Spring Boot应用,包含以下关键模块: - crm-base:公共基础能力(安全、数据访问、通用配置等) - crm-auth:认证授权与权限控制 - crm-file:文件服务(上传、分片、预览、清理任务) - crm-app:应用入口与聚合配置 ```mermaid graph TB subgraph "应用模块" APP["crm-app
应用入口"] AUTH["crm-auth
认证与权限"] FILE["crm-file
文件服务"] BASE["crm-base
公共基础"] end subgraph "外部依赖" DB["MySQL"] REDIS["Redis"] MINIO["MinIO 对象存储"] end APP --> AUTH APP --> FILE AUTH --> BASE FILE --> BASE AUTH --> DB AUTH --> REDIS FILE --> DB FILE --> REDIS FILE --> MINIO ``` 图表来源 - [pom.xml:1-200](file://pom.xml#L1-L200) - [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-50](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L50) - [crm-auth/src/main/java/com/crm/auth/AuthApplication.java:1-50](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java#L1-L50) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-80](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L80) 章节来源 - [pom.xml:1-200](file://pom.xml#L1-L200) - [crm-app/pom.xml:1-100](file://crm-app/pom.xml#L1-L100) - [crm-auth/pom.xml:1-100](file://crm-auth/pom.xml#L1-L100) - [crm-base/pom.xml:1-100](file://crm-base/pom.xml#L1-L100) - [crm-file/pom.xml:1-100](file://crm-file/pom.xml#L1-L100) ## 核心组件 - 应用入口与装配 - crm-app:聚合配置与统一入口 - crm-auth:认证、鉴权、JWT、第三方登录集成 - crm-file:文件上传、分片、预览、孤儿分片清理任务 - 基础设施 - MySQL:持久化用户、角色、菜单、部门、文件信息等 - Redis:会话、缓存、分布式锁、限流等 - MinIO:对象存储,用于文件与附件存储 章节来源 - [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-50](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L50) - [crm-auth/src/main/java/com/crm/auth/AuthApplication.java:1-50](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java#L1-L50) - [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L80) - [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java#L1-L80) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-80](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L80) ## 架构总览 下图展示典型部署拓扑:前端通过网关/反向代理接入,后端由多个服务实例组成,共享MySQL、Redis与MinIO。 ```mermaid graph TB Client["客户端/浏览器"] --> Gateway["Nginx/网关"] Gateway --> AuthSrv["crm-auth 实例 x N"] Gateway --> FileSrv["crm-file 实例 x M"] AuthSrv --> DB["MySQL"] AuthSrv --> Cache["Redis"] FileSrv --> DB FileSrv --> Cache FileSrv --> OSS["MinIO"] ``` 图表来源 - [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-120](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L120) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-80](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L80) ## 详细组件分析 ### 认证与权限(crm-auth) - 功能要点 - JWT签发与校验、过滤器链、异常处理 - 数据权限拦截器与表级过滤 - 第三方登录(如钉钉)客户端与工厂 - 初始数据加载(角色、菜单、默认用户等) - 关键类与职责 - SecurityConfig:安全配置、跨域、接口文档开关 - JwtAuthenticationFilter:请求鉴权、令牌解析 - TokenService:令牌生成、刷新、校验 - DataInitializer:启动时初始化基础数据 - 启动顺序建议 - 先完成数据库与Redis连接 - 执行DataInitializer进行基础数据初始化 - 再暴露HTTP端口对外提供服务 ```mermaid sequenceDiagram participant C as "客户端" participant G as "网关/Nginx" participant A as "Auth服务" participant F as "Jwt过滤器" participant S as "Token服务" participant R as "Redis" participant D as "MySQL" C->>G : "HTTP 请求" G->>A : "转发到认证服务" A->>F : "进入鉴权过滤器" F->>S : "解析并校验JWT" S->>R : "读取/校验会话或黑名单" S-->>F : "返回鉴权结果" F-->>A : "放行或拒绝" A->>D : "业务查询(可选)" A-->>C : "响应" ``` 图表来源 - [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-120](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/security/TokenService.java:1-120](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L120) 章节来源 - [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-120](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/security/TokenService.java:1-120](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L120) - [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L120) ### 文件服务(crm-file) - 功能要点 - 文件上传(支持分片)、下载、预览 - MinIO对象存储集成 - 定时任务清理孤儿分片 - 关键类与职责 - FileProperties:文件相关配置项 - MinioConfig:MinIO客户端配置 - OrphanChunkCleanupTask:定时清理未完成的分片 - 依赖 - MySQL:文件元数据 - Redis:分片会话、临时状态 - MinIO:实际文件存储 ```mermaid flowchart TD Start(["开始"]) --> Upload["接收上传请求"] Upload --> CheckSession{"是否存在分片会话?"} CheckSession --> |否| Init["创建分片会话"] CheckSession --> |是| Append["追加分片"] Init --> Append Append --> Complete{"是否全部分片完成?"} Complete --> |否| Wait["等待后续分片"] Complete --> |是| Merge["合并分片成文件"] Merge --> SaveMeta["保存文件元数据到DB"] SaveMeta --> Done(["结束"]) Wait --> Done ``` 图表来源 - [crm-file/src/main/java/com/crm/file/config/FileProperties.java:1-80](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java#L1-L80) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-80](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L80) - [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java:1-80](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java#L1-L80) 章节来源 - [crm-file/src/main/java/com/crm/file/config/FileProperties.java:1-80](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java#L1-L80) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-80](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L80) - [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java:1-80](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java#L1-L80) ### 公共基础(crm-base) - 关键配置 - RedisConfig:Redis连接池、序列化、超时等 - MybatisPlusConfig:分页、SQL注入器、填充策略 - SnowflakeProperties:分布式ID配置 - CorsConfig:跨域配置 - Knife4jConfig:API文档开关与路径 - 作用 - 为各业务模块提供统一的配置、工具与安全能力 章节来源 - [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L80) - [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java#L1-L80) - [crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java:1-80](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java#L1-L80) - [crm-base/src/main/java/com/crm/base/config/CorsConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java#L1-L80) - [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java#L1-L80) ## 依赖关系分析 - 模块内聚与耦合 - crm-base为底层依赖,被其他模块复用 - crm-auth与crm-file均依赖crm-base提供的安全、数据访问与工具 - 外部依赖 - MySQL:所有持久化数据 - Redis:缓存、会话、分布式锁 - MinIO:文件对象存储 - 启动顺序 - 数据库与中间件就绪 → 应用启动 → 数据初始化 → 暴露端口 ```mermaid graph LR BASE["crm-base"] --> AUTH["crm-auth"] BASE --> FILE["crm-file"] AUTH --> APP["crm-app"] FILE --> APP AUTH --> DB["MySQL"] AUTH --> REDIS["Redis"] FILE --> DB FILE --> REDIS FILE --> MINIO["MinIO"] ``` 图表来源 - [pom.xml:1-200](file://pom.xml#L1-L200) - [crm-app/pom.xml:1-100](file://crm-app/pom.xml#L1-L100) - [crm-auth/pom.xml:1-100](file://crm-auth/pom.xml#L1-L100) - [crm-base/pom.xml:1-100](file://crm-base/pom.xml#L1-L100) - [crm-file/pom.xml:1-100](file://crm-file/pom.xml#L1-L100) 章节来源 - [pom.xml:1-200](file://pom.xml#L1-L200) ## 性能与容量规划 - JVM与运行时 - 根据实例规格设置堆大小、GC策略;启用JIT预热 - 合理设置线程池、连接池参数(数据库、Redis、HTTP客户端) - 数据库 - 连接池上限、慢查询阈值、索引优化 - 读写分离与分库分表预留 - 缓存 - Redis内存上限、淘汰策略、热点Key保护 - 文件服务 - MinIO节点数与磁盘容量规划 - 分片大小与并发上传限制 - 水平扩展 - 无状态服务多副本部署 - 会话与缓存一致性保障 [本节为通用指导,不直接引用具体文件] ## 故障排查指南 - 常见问题定位 - 认证失败:检查JWT密钥、Redis连通性、过滤器链配置 - 文件上传失败:检查MinIO连通性、分片会话、磁盘空间 - 数据库连接异常:检查连接池、账号权限、网络ACL - 日志与指标 - 应用日志:按模块与TraceId聚合 - 中间件日志:MySQL慢查询、Redis命中率、MinIO访问日志 - 指标采集:JVM、GC、连接池、QPS、延迟 - 快速恢复 - 健康检查与自动重启 - 灰度发布与快速回滚 - 数据快照与增量备份 章节来源 - [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-120](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L120) - [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java:1-80](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java#L1-L80) ## 结论 通过模块化设计与清晰的依赖边界,结合容器化与Kubernetes编排,可实现高可用、易扩展的CRM后端部署。配合完善的监控、日志与备份策略,能够保障生产环境的稳定性与可恢复性。 [本节为总结性内容,不直接引用具体文件] ## 附录 ### 一、环境准备与依赖服务安装 - 操作系统与运行时 - Linux发行版(推荐CentOS/RHEL/Ubuntu LTS) - JDK版本与版本锁定(参考构建脚本与依赖声明) - 依赖服务 - MySQL:创建数据库与字符集、用户与权限 - Redis:设置密码、最大内存、持久化策略 - MinIO:创建桶、访问密钥、网络可达性 章节来源 - [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-80](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L80) - [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-80](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L80) ### 二、构建与打包 - Maven多模块构建 - 在根目录执行构建命令,生成各模块JAR包 - 产物位置与命名规则 - 构建优化 - 并行构建、跳过测试、依赖缓存 章节来源 - [pom.xml:1-200](file://pom.xml#L1-L200) - [crm-app/pom.xml:1-100](file://crm-app/pom.xml#L1-L100) - [crm-auth/pom.xml:1-100](file://crm-auth/pom.xml#L1-L100) - [crm-base/pom.xml:1-100](file://crm-base/pom.xml#L1-L100) - [crm-file/pom.xml:1-100](file://crm-file/pom.xml#L1-L100) ### 三、配置文件管理 - 配置分层 - 应用级application.yml - 环境级配置(dev/test/prod) - 外部化配置(环境变量、配置中心) - 关键配置项 - 数据库连接、Redis连接、MinIO端点与凭据 - JWT密钥、跨域、接口文档开关 - 文件分片大小、超时、重试策略 章节来源 - [crm-app/src/main/resources/application.yml:1-200](file://crm-app/src/main/resources/application.yml#L1-L200) - [crm-auth/src/main/resources/application.yml:1-200](file://crm-auth/src/main/resources/application.yml#L1-L200) - [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L120) - [crm-file/src/main/java/com/crm/file/config/FileProperties.java:1-80](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java#L1-L80) ### 四、数据库初始化与服务启动顺序 - 初始化步骤 - 建库建表、导入基础数据 - 执行DataInitializer中的初始化逻辑 - 启动顺序 - 先启动依赖服务(MySQL、Redis、MinIO) - 再启动crm-auth与crm-file - 最后启动crm-app(若作为聚合入口) 章节来源 - [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-120](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L120) - [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-50](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L50) - [crm-auth/src/main/java/com/crm/auth/AuthApplication.java:1-50](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java#L1-L50) ### 五、Docker容器化部署 - 镜像构建 - 使用多阶段构建减小镜像体积 - 将JAR包与外部配置分离 - 容器编排 - 定义环境变量、挂载卷(日志、配置) - 健康检查与资源限制 - 示例流程 - 构建镜像 → 推送仓库 → 拉取运行 → 验证健康 [本节为通用指导,不直接引用具体文件] ### 六、Kubernetes集群部署 - 部署清单 - Deployment:副本数、滚动更新、探针 - Service:ClusterIP/NodePort/LoadBalancer - ConfigMap/Secret:配置与敏感信息 - Ingress:域名、TLS、路由 - 扩缩容与弹性 - HPA基于CPU/内存或自定义指标 - 存储与持久化 - 日志落盘与远端收集 - 文件服务对接MinIO PVC或外部存储 [本节为通用指导,不直接引用具体文件] ### 七、传统服务器部署 - 进程管理 - 使用systemd或supervisor管理服务生命周期 - 启动脚本 - 设置JVM参数、环境变量、工作目录 - 日志轮转 - logrotate配置,保留策略与压缩 [本节为通用指导,不直接引用具体文件] ### 八、生产环境优化配置 - JVM调优 - 堆大小、GC选择、元空间、线程栈大小 - 连接池与线程池 - 数据库连接池、Redis连接池、HTTP客户端线程池 - 缓存与限流 - Redis缓存策略、热点Key保护、接口限流 - 文件服务优化 - MinIO节点横向扩展、分片大小与并发限制 [本节为通用指导,不直接引用具体文件] ### 九、监控告警设置 - 指标采集 - JVM、GC、线程、连接池、QPS、延迟 - 中间件指标(MySQL、Redis、MinIO) - 告警规则 - 错误率、延迟P99、资源水位、磁盘空间 - 可视化 - 仪表盘与告警通知渠道 [本节为通用指导,不直接引用具体文件] ### 十、日志收集方案 - 应用日志 - 结构化输出、TraceId贯穿、分级输出 - 集中式收集 - Filebeat/Fluent Bit采集 → Kafka/消息队列 → 存储与检索 - 日志策略 - 保留周期、脱敏、采样与压缩 [本节为通用指导,不直接引用具体文件] ### 十一、备份恢复策略 - 数据库备份 - 全量+增量、异地备份、加密与校验 - 文件备份 - MinIO快照、跨地域复制 - 恢复演练 - 定期演练恢复流程,验证RTO/RPO [本节为通用指导,不直接引用具体文件] ### 十二、负载均衡、SSL证书与域名绑定 - 负载均衡 - Nginx/Ingress分发、健康检查、权重与灰度 - SSL证书 - 证书申请、自动续期、HTTPS强制 - 域名绑定 - DNS解析、CDN加速、WAF防护 [本节为通用指导,不直接引用具体文件]