15 KiB
15 KiB
部署运维
**本文引用的文件** - [fms-api/pom.xml](file://fms-api/pom.xml) - [fms-api/src/main/resources/application.yaml](file://fms-api/src/main/resources/application.yaml) - [fms-api/start.cmd](file://fms-api/start.cmd) - [fms-api/config/dbconfigs/README.md](file://fms-api/config/dbconfigs/README.md) - [fms-api/config/dbconfigs/G3HD.properties](file://fms-api/config/dbconfigs/G3HD.properties) - [fms-api/config/dbconfigs/G3HY2025.properties](file://fms-api/config/dbconfigs/G3HY2025.properties) - [fms-vue/package.json](file://fms-vue/package.json) - [fms-vue/vite.config.js](file://fms-vue/vite.config.js) - [fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java](file://fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java)目录
简介
本文件面向生产环境的FMS系统,提供端到端的部署与运维指南。内容涵盖:
- Docker容器化部署方案、服务器环境要求与网络配置
- 前后端构建流程与发布策略(静态资源优化、CDN与缓存)
- 监控与日志收集(应用性能监控、错误日志、告警)
- 数据库备份恢复与数据迁移流程
- 日常运维操作(服务启停、配置更新、故障排查)
- 性能调优与安全加固最佳实践
项目结构
FMS由前后端两个主要子系统构成:
- 后端:Spring Boot API服务(Java 21),使用Maven构建,默认端口8088,上下文路径/api
- 前端:Vue 3 + Vite应用,开发时通过代理访问后端API,生产构建为静态资源
graph TB
subgraph "前端"
FE["fms-vue<br/>Vite 构建"]
end
subgraph "后端"
BE["fms-api<br/>Spring Boot Web MVC"]
end
DB["SQL Server"]
OSS["对象存储(可选)"]
FE --> |"HTTP /api/*"| BE
BE --> DB
BE --> OSS
图表来源
章节来源
- fms-api/src/main/resources/application.yaml:1-34
- fms-vue/vite.config.js:1-25
- fms-vue/package.json:6-19
- fms-api/pom.xml:29-96
核心组件
- 后端服务:基于Spring Boot Web MVC,内置Tomcat,暴露REST接口;使用Druid连接池与SQL Server JDBC驱动;JWT鉴权;支持本地或OSS文件存储
- 前端应用:Vue 3 + Vite,开发模式代理/api到后端;生产模式输出静态资源供Web服务器或CDN托管
- 数据库:SQL Server,按组织隔离的配置文件管理多库连接
- 安全:JWT签名与校验,密钥长度与有效期强制校验
章节来源
- fms-api/pom.xml:32-96
- fms-api/src/main/resources/application.yaml:10-34
- fms-api/config/dbconfigs/README.md:1-28
- fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:18-81
架构总览
生产环境推荐拓扑:
- Nginx/反向代理对外暴露HTTPS入口,将静态资源请求指向CDN或本地静态目录,将/api转发至后端
- 后端以Docker容器运行,挂载外部卷用于文件存储与配置
- 数据库独立部署,仅对后端开放端口
graph TB
Client["浏览器/客户端"]
CDN["CDN(可选)"]
Nginx["Nginx/反向代理"]
FEStatic["前端静态资源(dist)"]
BE["fms-api 容器"]
DB["SQL Server"]
OSS["对象存储(可选)"]
Client --> |HTTPS /| Nginx
Nginx --> |静态资源| CDN
Nginx --> |静态资源| FEStatic
Nginx --> |/api/*| BE
BE --> DB
BE --> OSS
图表来源
- fms-vue/vite.config.js:11-21
- fms-api/src/main/resources/application.yaml:1-4
- fms-api/src/main/resources/application.yaml:27-34
详细组件分析
后端服务(fms-api)
- 技术栈与依赖:Spring Boot Web MVC、JDBC、Druid连接池、SQL Server JDBC驱动、JWT、Jackson、UA解析、IP定位等
- 启动方式:Maven spring-boot:run(开发脚本),生产建议打包为可执行JAR并容器化运行
- 配置要点:
- 服务端口与上下文路径
- JWT密钥与有效期
- 数据库连接池参数
- 文件存储类型(本地/OSS)及路径/URL前缀
classDiagram
class JwtUtils {
+init() void
+generateToken(userId, orgId, sessionId) String
+parseToken(token) TokenClaims
+getOrgId(token) String
}
class AuthProperties {
+jwtSecret String
+jwtExpiration Duration
}
class ApplicationConfig {
+server.port int
+server.servlet.context-path String
+fms.auth.jwt-secret String
+fms.auth.jwt-expiration Duration
+fms.database.pool.* ...
+fms.file.storage-type String
+fms.file.local.storage-dir String
+fms.file.local.url-prefix String
+fms.file.oss.g3oss-url String
}
JwtUtils --> AuthProperties : "读取配置"
ApplicationConfig ..> JwtUtils : "影响鉴权行为"
图表来源
- fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:18-81
- fms-api/src/main/resources/application.yaml:1-34
章节来源
前端应用(fms-vue)
- 构建与预览:vite build生成dist静态资源;vite preview本地预览
- 开发代理:开发时将/api请求代理到后端8088端口
- 发布产物:dist目录包含HTML、JS、CSS等资源,适合放置于Nginx或CDN
flowchart TD
Start(["开始"]) --> Build["执行 vite build"]
Build --> Dist["产出 dist 静态资源"]
Dist --> Deploy["部署至 Nginx/CDN"]
Deploy --> End(["完成"])
图表来源
章节来源
数据库与多租户配置
- 多组织数据库:每个组织一个properties文件,命名规则与示例见文档
- 连接信息:url、username、password、driver
- 开发兼容:旧版SQL Server需TLS兼容参数
flowchart TD
A["选择组织ID"] --> B{"是否存在对应 .properties ?"}
B --> |是| C["加载连接参数"]
B --> |否| D["报错/回退"]
C --> E["建立数据库连接"]
图表来源
- fms-api/config/dbconfigs/README.md:1-28
- fms-api/config/dbconfigs/G3HD.properties:1-5
- fms-api/config/dbconfigs/G3HY2025.properties:1-5
章节来源
- fms-api/config/dbconfigs/README.md:1-28
- fms-api/config/dbconfigs/G3HD.properties:1-5
- fms-api/config/dbconfigs/G3HY2025.properties:1-5
登录鉴权流程(JWT)
sequenceDiagram
participant C as "客户端"
participant S as "fms-api"
participant J as "JwtUtils"
C->>S : "POST /api/auth/login (账号/密码)"
S->>S : "验证凭据"
S->>J : "generateToken(userId, orgId, sessionId)"
J-->>S : "返回JWT字符串"
S-->>C : "返回{token}"
C->>S : "后续请求携带 Authorization : Bearer <token>"
S->>J : "parseToken(token)"
J-->>S : "解析出userId/orgId/sessionId"
S-->>C : "业务响应"
图表来源
- fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:45-66
- fms-api/src/main/resources/application.yaml:10-13
章节来源
- fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:18-81
- fms-api/src/main/resources/application.yaml:10-13
依赖关系分析
- 后端依赖:Spring Boot、JDBC、Druid、SQL Server驱动、JWT、Jackson、UA Parser、IP2Region
- 前端依赖:Vue 3、Vue Router、Pinia、Axios、Dayjs、UI组件库等
- 运行时依赖:JDK 21、Node.js(构建期)、Nginx/CDN(生产)
graph LR
FE["fms-vue"] --> |"构建产物"| DIST["dist 静态资源"]
DIST --> |"托管"| WEB["Nginx/CDN"]
WEB --> |"HTTP /api/*"| BE["fms-api"]
BE --> |"JDBC"| DB["SQL Server"]
BE --> |"可选"| OSS["对象存储"]
图表来源
章节来源
性能考虑
- 连接池调优:根据并发与延迟调整初始大小、最小空闲、最大活跃、等待超时、空闲检测间隔等
- 静态资源优化:启用Gzip/Brotli压缩、长缓存(带版本哈希)、按需懒加载路由与组件
- CDN与缓存:静态资源上CDN,设置合理的Cache-Control与ETag;API层避免过度缓存敏感数据
- 数据库:索引优化、慢查询治理、连接池上限与超时合理配置
- 容器资源:限制CPU/内存,预留堆外内存给JVM与连接池
[本节为通用指导,不直接分析具体文件]
故障排查指南
- 启动失败
- 检查JDK版本与环境变量(参考开发启动脚本)
- 确认端口占用与上下文路径
- 鉴权异常
- 校验JWT密钥长度与有效期配置
- 检查令牌是否过期或缺失必要声明
- 数据库连接问题
- 核对组织数据库配置文件格式与连通性
- 关注连接池耗尽与超时
- 文件上传/访问
- 本地存储:确认目录存在且可写,URL前缀正确
- OSS:确认地址与权限
章节来源
- fms-api/start.cmd:1-8
- fms-api/src/main/java/cn/g3soft/fmsapi/utils/JwtUtils.java:28-42
- fms-api/config/dbconfigs/README.md:1-28
- fms-api/src/main/resources/application.yaml:27-34
结论
FMS采用前后端分离架构,后端以Spring Boot提供服务,前端以Vite构建静态资源。生产部署建议通过反向代理统一入口,结合CDN加速静态资源,数据库独立部署并按组织隔离。配合合理的连接池、缓存与监控策略,可获得稳定高效的运行体验。
[本节为总结性内容,不直接分析具体文件]
附录
生产部署方案(Docker化)
- 镜像构建
- 后端:基于JDK 21基础镜像,复制打包后的JAR,暴露端口8088
- 前端:基于Nginx镜像,复制dist目录,配置静态资源与反向代理
- 环境变量与配置
- 后端:通过环境变量注入JWT密钥、数据库连接池参数、文件存储配置
- 前端:通过Nginx环境变量或构建时替换API基址
- 数据持久化
- 挂载文件存储目录(本地模式)
- 数据库与对象存储独立部署
- 网络与安全
- 仅开放443端口,内部端口不暴露
- 启用HTTPS,配置强加密套件与HSTS
- 限制跨域与源白名单
[本节为通用指导,不直接分析具体文件]
服务器环境要求
- 后端:JDK 21,建议4核8GB起(视并发与负载调整)
- 前端:构建阶段需要Node.js(版本与包管理器依pnpm-lock为准)
- 数据库:SQL Server(版本与TLS策略需与驱动匹配)
- 存储:本地磁盘或对象存储(按配置)
章节来源
前后端构建流程与发布策略
- 前端
- 开发:vite dev,自动代理/api到后端
- 构建:vite build,产出dist
- 发布:将dist部署至Nginx或CDN,配置缓存头与压缩
- 后端
- 构建:mvn package(Spring Boot Maven插件)
- 运行:java -jar 或容器运行
- 配置:application.yaml与组织数据库配置文件
章节来源
- fms-vue/package.json:6-19
- fms-vue/vite.config.js:11-21
- fms-api/pom.xml:98-105
- fms-api/src/main/resources/application.yaml:1-34
静态资源优化、CDN与缓存策略
- 启用Gzip/Brotli压缩
- 为静态资源设置长期缓存(带内容哈希)
- 使用CDN分发静态资源,配置边缘缓存与回源策略
- API响应按需缓存,敏感数据不缓存
[本节为通用指导,不直接分析具体文件]
监控与日志收集
- 应用性能监控
- 接入APM(如SkyWalking/Pinpoint)采集JVM指标、接口耗时、错误率
- 日志收集
- 应用日志:统一输出JSON格式,集中收集(ELK/Loki)
- 访问日志:Nginx访问日志结构化,便于审计与分析
- 告警机制
- 基于指标阈值(CPU/内存/错误率/慢查询)配置告警
- 关键链路失败即时通知
[本节为通用指导,不直接分析具体文件]
数据库备份恢复与数据迁移
- 备份策略
- 全量+增量备份,异地容灾
- 定期演练恢复流程
- 恢复流程
- 停机窗口评估与回滚预案
- 校验备份完整性后恢复
- 数据迁移
- 使用版本化脚本与工具进行增量迁移
- 迁移前后进行一致性校验与回滚方案
[本节为通用指导,不直接分析具体文件]
日常运维操作
- 服务启停
- 后端:systemd或容器编排管理生命周期
- 前端:Nginx重载配置或滚动更新
- 配置更新
- 后端:热更新或灰度发布(注意状态与连接池)
- 前端:静态资源版本升级,CDN刷新
- 故障排查
- 查看应用日志、访问日志、数据库慢查询
- 检查连接池、磁盘空间、证书有效期
[本节为通用指导,不直接分析具体文件]
性能调优与安全加固
- 性能调优
- JVM参数优化(堆大小、GC策略)
- 连接池与线程池容量调优
- 静态资源压缩与缓存
- 安全加固
- HTTPS强制与强加密套件
- JWT密钥轮换与最小权限原则
- 输入校验、防注入、限流与防重放
- 敏感配置外置与加密存储
[本节为通用指导,不直接分析具体文件]