提交文件

This commit is contained in:
2026-02-28 15:16:15 +08:00
parent 1a4e50e0a4
commit 44f250f58e
159 changed files with 61268 additions and 0 deletions

View File

@@ -0,0 +1,303 @@
# 备份恢复
<cite>
**本文引用的文件**
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/init_db.py](file://backend/init_db.py)
- [backend/alembic/env.py](file://backend/alembic/env.py)
- [backend/alembic.ini](file://backend/alembic.ini)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/.env.example](file://backend/.env.example)
- [backend/requirements.txt](file://backend/requirements.txt)
- [backend/app/main.py](file://backend/app/main.py)
- [docs/database.md](file://docs/database.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向“医院绩效系统”的数据库备份与恢复,结合现有代码库中的数据库配置、迁移机制与模型定义,提供覆盖全量备份、增量/差异备份思路、自动化脚本编写、调度与存储管理、数据恢复与灾难恢复流程、业务连续性保障、备份验证与完整性检查、恢复测试方法,以及多环境(开发/测试/生产)数据同步与安全(加密传输、异地容灾)建议。由于当前仓库未包含数据库备份脚本与运维配置,本指南在不虚构实现的前提下,给出可落地的策略与流程。
## 项目结构
系统采用 FastAPI + SQLAlchemy 异步 ORM + Alembic 迁移的后端架构,数据库连接与配置集中在核心模块,模型定义位于 models迁移配置位于 alembic。整体结构清晰便于扩展备份与恢复能力。
```mermaid
graph TB
subgraph "后端"
CFG["配置模块<br/>backend/app/core/config.py"]
DB["数据库连接模块<br/>backend/app/core/database.py"]
MODELS["数据模型<br/>backend/app/models/models.py"]
ALEMBIC_ENV["迁移环境<br/>backend/alembic/env.py"]
ALEMBIC_INI["迁移配置<br/>backend/alembic.ini"]
INIT_DB["初始化脚本<br/>backend/init_db.py"]
MAIN["应用入口<br/>backend/app/main.py"]
end
CFG --> DB
DB --> MODELS
ALEMBIC_ENV --> MODELS
ALEMBIC_INI --> ALEMBIC_ENV
INIT_DB --> DB
INIT_DB --> MODELS
MAIN --> CFG
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
## 核心组件
- 配置模块:集中管理数据库连接串、池大小、调试开关等,是备份与恢复策略的配置依据。
- 数据库连接模块:提供异步引擎与会话工厂,确保备份/恢复过程中的事务一致性。
- 模型定义:明确表结构、索引与约束,为备份范围与恢复顺序提供依据。
- 迁移环境与配置Alembic 提供结构变更的版本化管理,备份策略需考虑结构与数据的协同。
- 初始化脚本:演示了建表与初始数据插入流程,可作为恢复后验证的基础。
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
- [backend/init_db.py](file://backend/init_db.py#L11-L18)
## 架构总览
系统数据库连接通过异步引擎与会话工厂实现模型层定义了完整的业务表结构。Alembic 提供结构迁移能力;初始化脚本用于快速搭建测试环境。备份与恢复应围绕这些组件展开,确保结构与数据的一致性。
```mermaid
sequenceDiagram
participant App as "应用入口<br/>app/main.py"
participant Cfg as "配置模块<br/>app/core/config.py"
participant Db as "数据库连接<br/>app/core/database.py"
participant Alembic as "迁移环境<br/>alembic/env.py"
participant Models as "数据模型<br/>models/models.py"
App->>Cfg : 读取配置
Cfg-->>App : 返回数据库URL/池参数
App->>Db : 创建异步引擎与会话工厂
Db->>Models : 使用Base元数据
App->>Alembic : 执行迁移(结构)
Alembic->>Models : 读取metadata
App->>Db : 初始化/写入数据
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
## 详细组件分析
### 数据库连接与备份影响面
- 异步引擎与会话工厂:备份应在数据库空闲时段执行,避免长事务阻塞;恢复后需重启应用以重新建立连接。
- 事务语义:备份期间的写入可能被截断,需结合 WAL/逻辑复制实现近零停机。
```mermaid
flowchart TD
Start(["开始备份"]) --> CheckConn["检查数据库连接与可用性"]
CheckConn --> TxnCheck{"是否存在长事务?"}
TxnCheck --> |是| WaitIdle["等待事务结束或选择快照级别"]
TxnCheck --> |否| ChooseMethod["选择备份方法<br/>物理/逻辑/快照"]
WaitIdle --> ChooseMethod
ChooseMethod --> ExecBackup["执行备份"]
ExecBackup --> Verify["校验备份完整性"]
Verify --> End(["结束"])
```
图表来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
### 模型与索引对备份的影响
- 索引与约束:备份需保证索引与约束在恢复后一致,避免后续查询异常。
- 关系与级联:恢复后需验证外键关系与级联行为。
```mermaid
erDiagram
DEPARTMENTS ||--o{ STAFF : "1:N"
STAFF ||--o{ ASSESSMENTS : "1:N"
INDICATORS ||--o{ ASSESSMENT_DETAILS : "1:N"
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "1:N"
STAFF ||--o{ SALARY_RECORDS : "1:N"
USERS ||--o{ ASSESSMENTS : "1:N(assessor)"
USERS ||--o{ ASSESSMENTS : "1:N(reviewer)"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L202)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L311)
- [backend/app/models/models.py](file://backend/app/models/models.py#L314-L338)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L202)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L311)
- [backend/app/models/models.py](file://backend/app/models/models.py#L314-L338)
### Alembic 迁移与备份的关系
- 结构变更:迁移文件记录了数据库结构演进,备份时需同时备份迁移历史与当前结构,确保恢复后能正确升级。
- 版本控制:备份应包含 Alembic 配置与版本目录,以便在新环境中按版本回放。
```mermaid
sequenceDiagram
participant Dev as "开发者"
participant Alembic as "Alembic"
participant Repo as "版本库"
participant Prod as "生产数据库"
Dev->>Alembic : 生成迁移文件
Alembic->>Repo : 提交迁移文件
Dev->>Prod : 执行迁移(结构变更)
Prod-->>Dev : 升级完成
```
图表来源
- [docs/database.md](file://docs/database.md#L272-L285)
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L32)
- [backend/alembic/env.py](file://backend/alembic/env.py#L56-L65)
章节来源
- [docs/database.md](file://docs/database.md#L272-L285)
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L32)
- [backend/alembic/env.py](file://backend/alembic/env.py#L56-L65)
### 初始化脚本与恢复验证
- 初始化脚本展示了建表与插入初始数据的流程,可用于恢复后的基础数据验证。
章节来源
- [backend/init_db.py](file://backend/init_db.py#L11-L18)
- [backend/init_db.py](file://backend/init_db.py#L19-L79)
## 依赖关系分析
- 配置模块驱动数据库连接模块,后者依赖模型基类;迁移环境读取配置与模型元数据;应用入口加载配置与路由。
- 备份策略需考虑这些依赖链路的连通性与一致性。
```mermaid
graph LR
CFG["config.py"] --> DB["database.py"]
DB --> MODELS["models.py"]
ALEMBIC_ENV["alembic/env.py"] --> MODELS
ALEMBIC_INI["alembic.ini"] --> ALEMBIC_ENV
MAIN["app/main.py"] --> CFG
INIT_DB["init_db.py"] --> DB
INIT_DB --> MODELS
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L4-L25)
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
- [backend/app/main.py](file://backend/app/main.py#L10-L12)
- [backend/init_db.py](file://backend/init_db.py#L6-L8)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L4-L25)
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
- [backend/app/main.py](file://backend/app/main.py#L10-L12)
- [backend/init_db.py](file://backend/init_db.py#L6-L8)
## 性能考量
- 备份窗口:选择业务低峰时段,避免与长事务冲突。
- 连接池:备份期间可临时降低最大连接数,减少资源竞争。
- 并发策略:逻辑备份支持并发,但需注意锁与一致性;物理备份需确保一致性快照。
- 恢复速度:索引重建与约束检查是恢复耗时的关键环节,建议在专用实例上进行恢复演练。
## 故障排查指南
- 连接失败:检查数据库 URL、凭据与网络连通性确认配置模块的环境变量加载。
- 迁移异常:核对 Alembic 配置与版本目录;确保模型元数据与迁移目标一致。
- 恢复不完整:核对备份集是否包含结构与数据;确认恢复顺序与外键约束满足条件。
- 权限问题:确保备份/恢复账户具备必要权限;遵循最小权限原则。
章节来源
- [backend/.env.example](file://backend/.env.example#L3-L10)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L32)
- [backend/alembic/env.py](file://backend/alembic/env.py#L56-L65)
## 结论
本指南基于现有代码库的数据库配置、模型与迁移机制,提出了备份与恢复的整体策略与流程。建议在现有基础上补充自动化脚本、调度任务与存储管理规范,并定期开展恢复测试与演练,以确保业务连续性与灾难恢复的有效性。
## 附录
### 备份策略与配置方法
- 全量备份
- 逻辑备份:适用于 PostgreSQL支持跨平台与增量点定位建议开启压缩与并行度。
- 物理备份:适用于需要零停机的场景,需使用一致性快照或只读副本。
- 增量/差异备份
- 增量:基于 WAL 的增量备份,适合频繁写入场景;需配合 PITRPoint-in-Time Recovery
- 差异:每日差异备份+周期性全量,降低恢复时间;需严格管理差异链。
- 自动化脚本
- 使用定时任务触发备份;脚本需包含连接参数、输出路径、压缩与校验步骤。
- 对于 PostgreSQL可参考官方工具与扩展如逻辑复制、物理快照
- 备份调度
- 低峰时段执行;设置重试与告警;记录备份元数据(版本、时间戳、校验和)。
- 存储管理
- 多层存储:本地热存储、近线归档、远端冷存储;分级保留策略。
- 去重与压缩:降低存储成本;注意解压性能对恢复时间的影响。
### 数据恢复流程
- 准备阶段:确认目标环境与依赖(数据库版本、驱动、连接参数)。
- 结构恢复:优先恢复迁移历史与结构,确保模型与索引一致。
- 数据恢复:按备份集顺序恢复数据;校验主键/唯一性与外键关系。
- 应用启动:重启应用,执行必要的迁移升级;运行初始化脚本进行基础数据验证。
### 灾难恢复计划与业务连续性
- RTO/RPO根据业务需求设定恢复目标优先保证结构与关键数据的恢复。
- 多活/异地:部署多活实例或异地副本;定期进行切换演练。
- 降级策略:在极端情况下,优先恢复核心模块(如认证、基础数据),再逐步恢复其他模块。
### 备份数据验证、完整性检查与恢复测试
- 校验清单:备份集完整性、结构一致性、关键数据抽样比对。
- 完整性检查:导入到隔离环境进行一致性校验(索引、约束、外键)。
- 恢复测试:定期在非生产环境进行恢复演练,评估恢复时间与数据可用性。
### 多环境部署的备份策略
- 开发/测试:使用独立数据库或容器化实例;定期从生产拉取受限数据进行备份与恢复测试。
- 生产:采用企业级备份解决方案;结合逻辑复制或物理快照实现近零停机。
### 备份存储安全、加密传输与异地容灾
- 加密:备份文件与传输通道均需加密;密钥管理遵循最小权限与轮换策略。
- 传输:使用安全协议(如 SFTP/HTTPS对敏感数据进行脱敏处理。
- 异地容灾:在不同地理区域保留备份副本;定期进行异地恢复演练。

View File

@@ -0,0 +1,308 @@
# 安全合规
<cite>
**本文引用的文件**
- [backend/app/core/security.py](file://backend/app/core/security.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
- [backend/.env.example](file://backend/.env.example)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
- [backend/test_api.py](file://backend/test_api.py)
- [test_frontend_connection.py](file://test_frontend_connection.py)
- [docs/backend.md](file://docs/backend.md)
- [docs/database.md](file://docs/database.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能与安全特性](#性能与安全特性)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向“医院绩效考核管理系统”的安全与合规落地,聚焦以下方面:
- 身份认证与授权JWT 令牌管理、密码加密存储、会话安全与权限控制
- 网络安全HTTPS、CORS 策略与前端访问控制
- 数据安全:敏感数据保护、传输安全与访问控制
- 审计与风控:日志记录、违规检测与事件响应
- 漏洞治理:扫描工具使用、补丁管理与合规检查
- 权限治理:用户权限管理、角色分配与最小权限原则
## 项目结构
后端采用 FastAPI + SQLAlchemy 异步 ORM按功能分层组织
- 核心配置与安全core/config.py、core/security.py、core/logging_config.py
- API 层api/v1/*(如 auth.py
- 数据模型与枚举models/models.py
- 数据契约schemas/schemas.py
- 应用入口与中间件main.py
- 示例环境变量:.env.example
- 文档与数据库设计docs/backend.md、docs/database.md
- 前端连接测试脚本test_frontend_connection.py、backend/test_api.py
```mermaid
graph TB
subgraph "后端"
CFG["配置<br/>core/config.py"]
SEC["安全模块<br/>core/security.py"]
LOG["日志配置<br/>core/logging_config.py"]
MAIN["应用入口<br/>app/main.py"]
AUTH["认证路由<br/>api/v1/auth.py"]
MODELS["数据模型<br/>models/models.py"]
SCHEMAS["数据契约<br/>schemas/schemas.py"]
end
CFG --> SEC
CFG --> MAIN
SEC --> AUTH
MAIN --> AUTH
AUTH --> MODELS
MODELS --> SCHEMAS
LOG --> MAIN
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
- [docs/backend.md](file://docs/backend.md#L391-L436)
- [docs/database.md](file://docs/database.md#L1-L95)
## 核心组件
- 配置中心集中管理应用名、版本、调试、API 前缀、数据库连接、JWT 密钥与算法、CORS 白名单、分页参数等
- 安全模块OAuth2 密码流、JWT 编解码、bcrypt 密码哈希、当前用户解析、活跃用户校验、管理员/经理权限校验
- 认证路由:登录、注册、当前用户信息查询
- 日志模块:按日轮转的多处理器日志,区分应用日志与错误日志
- 数据模型:用户表含用户名、密码哈希、角色、启用状态等字段
- 数据契约:用户登录、注册、令牌、用户响应等 Pydantic 模型
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L22-L65)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L346)
## 架构总览
系统通过 FastAPI 提供 REST 接口CORS 中间件允许指定来源访问;认证采用 OAuth2 密码流配合 JWT密码以 bcrypt 存储;日志统一输出到控制台与文件。
```mermaid
sequenceDiagram
participant FE as "前端"
participant API as "FastAPI 应用"
participant AUTH as "认证路由"
participant SEC as "安全模块"
participant DB as "数据库"
FE->>API : "OPTIONS/POST /api/v1/auth/login"
API->>AUTH : "路由分发"
AUTH->>SEC : "验证用户名/密码"
SEC->>DB : "查询用户并比对哈希"
DB-->>SEC : "用户对象"
SEC-->>AUTH : "生成JWT"
AUTH-->>FE : "返回access_token"
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
## 详细组件分析
### 身份认证与授权机制
- OAuth2 密码流:通过 OAuth2PasswordBearer 获取令牌 URL实现标准授权流程
- JWT 令牌:包含过期时间与主体标识,使用 HS256 算法签名
- 密码存储bcrypt 哈希,不可逆存储
- 当前用户解析:从 JWT 解析 sub 字段,查询用户并校验是否启用
- 角色权限:提供管理员与经理级权限校验,未授权请求返回 403
```mermaid
flowchart TD
Start(["开始"]) --> Parse["解析JWT载荷"]
Parse --> Valid{"载荷有效?"}
Valid -- 否 --> Err["抛出401凭据无效"]
Valid -- 是 --> LoadUser["根据ID查询用户"]
LoadUser --> Found{"找到用户?"}
Found -- 否 --> Err
Found -- 是 --> Active{"用户启用?"}
Active -- 否 --> Disabled["抛出400用户禁用"]
Active -- 是 --> Role{"角色校验"}
Role --> End(["结束"])
```
图表来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L20-L110)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
### JWT 令牌管理
- 令牌签发:携带 exp 与 sub使用 SECRET_KEY 和 ALGORITHM
- 令牌过期:默认 8 小时
- 令牌使用Bearer 方式在 Authorization 头传递
- 令牌刷新:当前实现未内置刷新逻辑,建议生产环境引入刷新令牌与黑名单
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L43)
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
- [backend/.env.example](file://backend/.env.example#L6-L8)
### 密码加密存储
- bcrypt 哈希:注册与登录均基于 bcrypt 校验
- 密码长度与复杂度:契约层限制最小长度,建议结合业务策略增加复杂度要求
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L327)
### 会话安全管理
- 会话依赖:当前实现基于 JWT无服务端会话存储
- 令牌撤销:未实现黑名单机制,建议引入 Redis/JWT 黑名单或缩短令牌有效期
- 传输安全:建议强制 HTTPS避免明文传输
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L52)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
### 网络安全配置
- CORS允许指定来源、凭证、方法与头
- 健康检查:提供 /health 接口便于探活
- 异常处理:全局捕获 HTTP 与验证异常并记录日志
章节来源
- [backend/app/main.py](file://backend/app/main.py#L41-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L30)
- [docs/backend.md](file://docs/backend.md#L372-L389)
### 数据安全保护
- 数据模型:用户表包含密码哈希、角色、启用状态等字段
- 数据契约:用户登录、注册、令牌、用户响应等模型定义
- 建议:对敏感字段进行脱敏展示;数据库连接使用 SSL对日志中敏感字段进行脱敏
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L346)
### 审计日志、违规检测与事件响应
- 日志:控制台 INFO 级别输出,文件 DEBUG 级别轮转,错误单独 ERROR 文件
- 建议:接入集中化日志系统(如 ELK/Sentry设置告警阈值对登录失败、权限拒绝、敏感操作进行标记与告警
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L22-L65)
### 漏洞扫描与补丁管理
- 建议定期运行依赖扫描pip-audit、safety、npm audit 等),修复高危与严重漏洞
- 版本管理:固定依赖版本,启用自动安全更新与 PR 审查
- 生产部署:仅在受信网络与 HTTPS 下暴露 API
章节来源
- [backend/app/main.py](file://backend/app/main.py#L83-L92)
### 合规性检查清单
- 配置项密钥、算法、CORS 白名单、分页上限、调试开关
- 数据保护:密码哈希、传输加密、日志脱敏
- 权限治理:角色枚举、权限校验、最小权限
- 运维:健康检查、异常处理、日志轮转
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/.env.example](file://backend/.env.example#L1-L11)
### 用户权限管理与角色分配
- 角色字段:用户表 role 字段
- 权限校验:管理员与经理级权限校验函数
- 最小权限:建议在路由与服务层进一步细化资源级权限
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L252-L252)
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L110)
## 依赖关系分析
```mermaid
graph LR
CFG["core/config.py"] --> SEC["core/security.py"]
CFG --> MAIN["app/main.py"]
SEC --> AUTH["api/v1/auth.py"]
AUTH --> MODELS["models/models.py"]
MODELS --> SCHEMAS["schemas/schemas.py"]
MAIN --> LOG["core/logging_config.py"]
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
## 性能与安全特性
- 异步数据库:使用异步 SQLAlchemy提升并发性能
- JWT 无状态:减少服务端会话开销
- CORS 精准白名单:降低跨域攻击面
- 日志分级:区分开发与生产日志级别,避免敏感信息泄露
章节来源
- [docs/backend.md](file://docs/backend.md#L391-L436)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L22-L65)
## 故障排查指南
- 登录失败:检查用户名/密码是否匹配,确认用户启用状态
- CORS 问题:确认前端 Origin 是否在 CORS_ORIGINS 列表
- 令牌无效:确认 SECRET_KEY 一致、算法匹配、未过期
- 日志定位:查看应用日志与错误日志文件,定位异常堆栈
章节来源
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L25-L37)
- [backend/app/core/security.py](file://backend/app/core/security.py#L46-L52)
- [backend/app/main.py](file://backend/app/main.py#L58-L77)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L18-L21)
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L74)
- [backend/test_api.py](file://backend/test_api.py#L5-L32)
## 结论
本系统在认证与授权、日志与异常处理方面具备良好基础,建议在生产环境中补充 HTTPS、令牌黑名单、最小权限细化、集中化日志与告警、漏洞扫描与补丁管理等措施以满足更严格的合规与安全要求。
## 附录
- 数据库 ER 设计参考:用户与科室、员工、考核、指标、工资、计划、菜单、模板等实体关系
- 配置示例环境变量示例文件包含数据库、JWT 密钥与调试开关
章节来源
- [docs/database.md](file://docs/database.md#L1-L95)
- [backend/.env.example](file://backend/.env.example#L1-L11)

View File

@@ -0,0 +1,437 @@
# 数据库管理
<cite>
**本文引用的文件**
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py)
- [backend/alembic/env.py](file://backend/alembic/env.py)
- [backend/alembic.ini](file://backend/alembic.ini)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/init_db.py](file://backend/init_db.py)
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py)
- [backend/create_plan_tables.py](file://backend/create_plan_tables.py)
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py)
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向数据库管理员与后端开发,系统讲解本项目的数据库初始化、表结构创建、数据迁移与版本管理、备份与恢复策略、性能优化、监控与连接池配置、事务管理最佳实践以及安全与审计配置。项目采用 SQLAlchemy 异步 ORM 与 Alembic 迁移工具,结合 PostgreSQL 数据库,提供从开发到生产的完整数据库生命周期管理方案。
## 项目结构
数据库相关能力主要分布在以下模块:
- 配置与连接:应用配置与数据库连接池参数、异步引擎与会话工厂
- 模型定义:统一的 ORM 基类与完整的业务模型(科室、员工、指标、考核、工资、用户、计划、模板、菜单等)
- 初始化脚本:数据库表创建、基础数据与模板数据初始化
- 迁移工具Alembic 版本化迁移、离线/在线迁移执行
- 辅助脚本:菜单表创建、计划表创建、指标模板初始化、字段迁移
```mermaid
graph TB
subgraph "配置与连接"
CFG["配置模块<br/>settings.DATABASE_URL 等"]
ENG["异步引擎与会话工厂"]
end
subgraph "模型层"
MODELS["ORM 模型定义<br/>Department/Staff/Indicator 等"]
end
subgraph "初始化与脚本"
INIT_DB["初始化脚本<br/>创建表与基础数据"]
INIT_TPL["模板初始化脚本"]
MIGRATE["字段迁移脚本"]
CREATE_MENU["菜单表创建脚本"]
CREATE_PLAN["计划表创建脚本"]
end
subgraph "迁移工具"
ALEMBIC_INI["Alembic 配置"]
ALEMBIC_ENV["Alembic 环境配置"]
V001["版本 001 初始表"]
V002["版本 002 模板与字段"]
end
CFG --> ENG
ENG --> MODELS
MODELS --> INIT_DB
MODELS --> INIT_TPL
MODELS --> MIGRATE
MODELS --> CREATE_MENU
MODELS --> CREATE_PLAN
ALEMBIC_INI --> ALEMBIC_ENV
ALEMBIC_ENV --> V001
ALEMBIC_ENV --> V002
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
- [backend/alembic.ini](file://backend/alembic.ini#L7)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
- [backend/alembic.ini](file://backend/alembic.ini#L7)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
## 核心组件
- 数据库连接与会话
- 异步引擎与会话工厂:通过配置模块提供的数据库 URL 创建异步引擎,并生成异步会话工厂;提供依赖注入式会话获取函数,自动提交、回滚与关闭
- 连接池参数:在配置模块中定义连接池大小与溢出参数,确保高并发下的稳定性
- 模型与索引
- 统一的 DeclarativeBase 基类,所有业务模型继承该基类
- 多表建立复合索引与约束,覆盖常用查询条件与外键关系
- Alembic 迁移
- 离线/在线迁移:支持离线模式与异步在线模式,适配不同部署场景
- 版本化迁移:初始版本创建核心表,后续版本扩展模板与字段
- 初始化与脚本
- 表创建与基础数据:批量创建表并插入示例数据
- 模板与指标:按模板文档初始化指标与模板关联
- 字段迁移:向现有表动态添加新字段,兼容历史版本
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L65)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L11-L371)
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L9-L42)
## 架构总览
数据库层围绕“配置 → 引擎/会话 → 模型 → 迁移/脚本”的主干展开,形成清晰的职责边界与可演进的版本化管理。
```mermaid
graph TB
CFG["配置模块<br/>DATABASE_URL/DATABASE_POOL_SIZE 等"]
ENGINE["异步引擎"]
SESSION["异步会话工厂"]
BASE["ORM 基类 Base"]
MODELS["业务模型集合"]
ALEMBIC["Alembic 迁移"]
SCRIPTS["初始化与维护脚本"]
CFG --> ENGINE
ENGINE --> SESSION
SESSION --> MODELS
BASE --> MODELS
ALEMBIC --> MODELS
SCRIPTS --> MODELS
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
- [backend/init_db.py](file://backend/init_db.py#L11-L18)
## 详细组件分析
### 数据库初始化与表结构创建
- 初始化流程
- 使用异步引擎在连接上下文中一次性创建所有表
- 插入基础数据(科室、员工、指标、管理员),避免重复初始化
- 表结构要点
- 主键自增、唯一约束、外键关系明确
- 常用查询列建立索引,如科室类型、员工状态、考核周期、模板类型等
- 约束保证数据完整性,如指标权重正数约束
```mermaid
sequenceDiagram
participant CLI as "命令行"
participant INIT as "初始化脚本"
participant ENGINE as "异步引擎"
participant MODELS as "ORM 模型"
participant DB as "数据库"
CLI->>INIT : 调用初始化入口
INIT->>ENGINE : 获取连接
INIT->>MODELS : create_all()
MODELS->>DB : 创建表与索引
INIT->>DB : 插入基础数据
DB-->>INIT : 返回结果
INIT-->>CLI : 输出完成信息
```
图表来源
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L13)
章节来源
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L13)
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
### Alembic 数据库迁移工具
- 配置与环境
- Alembic 配置文件指定脚本位置、日志级别与数据库 URL
- 环境配置加载应用配置与模型元数据,支持离线与在线迁移
- 版本管理
- 初始版本:创建核心业务表与索引
- 模板版本:新增指标模板表与关联表,向指标表添加多字段
- 回滚与增量更新
- 每个版本提供升级与降级逻辑,确保可逆演进
- 新增字段采用条件判断,避免重复迁移失败
```mermaid
flowchart TD
START(["开始"]) --> CHECK_CFG["读取 Alembic 配置"]
CHECK_CFG --> LOAD_META["加载模型元数据"]
LOAD_META --> MODE{"迁移模式?"}
MODE --> |离线| OFFLINE["离线迁移<br/>直接写入 SQL"]
MODE --> |在线| ONLINE["在线迁移<br/>异步连接执行"]
OFFLINE --> RUN_MIGR["执行迁移"]
ONLINE --> RUN_MIGR
RUN_MIGR --> DONE(["结束"])
```
图表来源
- [backend/alembic.ini](file://backend/alembic.ini#L3-L7)
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L65)
章节来源
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
### 数据模型与索引设计
- 模型关系
- 部门与员工一对多、员工与考核/工资一对一多关联
- 考核记录与明细、指标与模板的多对多通过中间表实现
- 索引策略
- 针对高频过滤与连接字段建立复合索引,提升查询性能
- 外键字段与状态字段建立索引,加速筛选与排序
- 约束与校验
- 指标权重正数约束,保证业务合理性
- 唯一约束用于编码与用户名等关键字段
```mermaid
erDiagram
DEPARTMENTS ||--o{ STAFF : "拥有"
STAFF ||--o{ ASSESSMENTS : "被考核"
STAFF ||--o{ SALARY_RECORDS : "产生工资"
INDICATORS ||--o{ ASSESSMENT_DETAILS : "被评估"
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "包含"
INDICATORS ||--o{ TEMPLATE_INDICATORS : "关联"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L78-L80)
- [backend/app/models/models.py](file://backend/app/models/models.py#L108-L110)
- [backend/app/models/models.py](file://backend/app/models/models.py#L170-L173)
- [backend/app/models/models.py](file://backend/app/models/models.py#L195-L197)
- [backend/app/models/models.py](file://backend/app/models/models.py#L301-L304)
- [backend/app/models/models.py](file://backend/app/models/models.py#L330-L332)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
### 模板与指标初始化策略
- 模板初始化
- 依据文档模板创建通用、手术、医技、行政、后勤五类模板
- 模板与指标通过中间表建立关联,支持分类与权重配置
- 指标初始化
- 按平衡计分卡维度与科室类型拆分指标集合
- 支持字段扩展(目标值、单位、计算方法、扣分标准、数据来源、适用科室类型、一票否决等)
```mermaid
sequenceDiagram
participant CLI as "命令行"
participant INIT as "模板初始化脚本"
participant DB as "数据库"
participant MODELS as "ORM 模型"
CLI->>INIT : 调用初始化入口
INIT->>DB : 查询是否存在指标
DB-->>INIT : 返回空/存在
alt 不存在
INIT->>MODELS : 创建指标
INIT->>MODELS : 创建模板
INIT->>MODELS : 关联模板与指标
INIT->>DB : 提交事务
else 已存在
INIT-->>CLI : 跳过初始化
end
INIT-->>CLI : 输出完成信息
```
图表来源
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L11-L371)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L189-L272)
章节来源
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L11-L371)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L189-L272)
### 字段迁移与增量更新
- 字段迁移脚本
- 向指标表动态添加平衡计分卡维度、目标单位、考核方法、扣分标准、数据来源、适用科室类型、一票否决等字段
- 采用条件判断避免重复添加导致迁移失败
- 与 Alembic 的配合
- Alembic 版本 002 同样实现字段添加逻辑,两者可互补使用
```mermaid
flowchart TD
START(["开始"]) --> CONNECT["连接数据库"]
CONNECT --> ADD_COL["逐个添加字段"]
ADD_COL --> CHECK{"字段是否存在?"}
CHECK --> |是| SKIP["跳过该字段"]
CHECK --> |否| DO_ADD["执行添加"]
SKIP --> NEXT["下一个字段"]
DO_ADD --> NEXT
NEXT --> DONE(["结束"])
```
图表来源
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L9-L42)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L65-L91)
章节来源
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L9-L42)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L65-L91)
### 连接池与事务管理
- 连接池配置
- 在配置模块中设置连接池大小与溢出参数,满足高并发请求
- 事务管理
- 会话工厂在依赖注入中自动提交或回滚异常finally 关闭会话,确保资源释放
- 并发与一致性
- 异步引擎与会话配合,避免阻塞;外键与索引设计减少锁竞争
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
## 依赖关系分析
- 组件耦合
- 模型层依赖配置模块提供的数据库 URL迁移工具依赖模型元数据
- 初始化脚本与模板脚本依赖模型与会话工厂
- 外部依赖
- Alembic 依赖 SQLAlchemy 异步引擎
- 运行时依赖 PostgreSQL 数据库
```mermaid
graph LR
CONFIG["配置模块"] --> ENGINE["异步引擎"]
ENGINE --> SESSION["异步会话"]
SESSION --> MODELS["ORM 模型"]
MODELS --> INIT["初始化脚本"]
MODELS --> SCRIPTS["模板/迁移脚本"]
ALEMBIC_INI["Alembic 配置"] --> ALEMBIC_ENV["Alembic 环境"]
ALEMBIC_ENV --> MODELS
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/alembic.ini](file://backend/alembic.ini#L3-L7)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/alembic.ini](file://backend/alembic.ini#L3-L7)
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
## 性能考虑
- 索引设计
- 为常用过滤字段(如科室类型、员工状态、考核周期、模板类型、用户名等)建立复合索引
- 对外键字段与排序字段建立索引,减少全表扫描
- 查询优化
- 使用关系查询时注意惰性加载与联结策略,避免 N+1 查询
- 对大表进行分页查询,限制返回字段
- 连接池优化
- 合理设置连接池大小与溢出参数,避免连接争用
- 在高并发场景下启用异步 I/O减少阻塞
- 数据建模
- 将 JSON 字段用于灵活配置(如模板维度权重、适用科室类型),但需谨慎查询与索引策略
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L178)
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
- [backend/app/models/models.py](file://backend/app/models/models.py#L258-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L306-L311)
- [backend/app/models/models.py](file://backend/app/models/models.py#L334-L338)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
## 故障排查指南
- 迁移失败
- 检查 Alembic 配置文件中的数据库 URL 是否正确
- 确认模型元数据已正确加载,版本文件命名与依赖关系无误
- 在线迁移需确保异步连接可用,必要时切换为离线迁移验证
- 字段迁移冲突
- 使用条件判断避免重复添加字段;若 Alembic 与脚本同时执行,建议统一由 Alembic 管理
- 初始化数据重复
- 初始化脚本中包含存在性检查,避免重复插入;如出现异常,清理缓存或重新执行
- 连接池耗尽
- 检查连接池参数与并发请求量,适当增大池大小或优化查询
- 权限问题
- 确保数据库用户具备创建表、索引与修改表结构的权限
章节来源
- [backend/alembic.ini](file://backend/alembic.ini#L7)
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L9-L42)
- [backend/init_db.py](file://backend/init_db.py#L20-L26)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
## 结论
本项目通过配置驱动的异步数据库连接、完善的模型与索引设计、版本化的 Alembic 迁移与多类初始化脚本,构建了可演进、可维护、高性能的数据库管理方案。遵循本文的迁移策略、性能优化与安全配置建议,可在生产环境中稳定运行并持续演进。
## 附录
### 数据库备份与恢复流程
- 备份
- 使用数据库自带工具进行逻辑或物理备份,定期归档
- 在迁移前执行备份,确保可回滚
- 恢复
- 从最近备份点恢复,结合 Alembic 迁移补全到最新版本
- 验证关键表与索引完整性,执行回归测试
### 数据迁移策略
- 渐进式迁移
- 先迁移结构(表、索引、约束),再迁移数据(基础数据、模板、指标)
- 回滚策略
- 使用 Alembic 降级到上一版本,配合备份快速恢复
- 兼容性
- 新增字段采用条件判断,避免破坏现有数据
### 监控指标与连接池配置
- 监控指标
- 连接池利用率、活跃连接数、等待队列长度、慢查询数量
- 连接池配置
- 根据并发峰值与响应时间调整池大小与超时参数
### 事务管理最佳实践
- 会话生命周期
- 依赖注入中自动提交或回滚finally 关闭会话
- 事务粒度
- 将原子性要求高的操作放在同一事务中,避免长事务
### 安全配置与审计
- 安全配置
- 最小权限原则,仅授予所需 DDL/DML 权限
- 使用强口令与 TLS 加密传输
- 审计日志
- 记录关键 DDL 操作与重要 DML 变更,便于追溯与合规

View File

@@ -0,0 +1,352 @@
# 环境部署
<cite>
**本文引用的文件**
- [backend/.env.example](file://backend/.env.example)
- [backend/requirements.txt](file://backend/requirements.txt)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/init_db.py](file://backend/init_db.py)
- [backend/alembic.ini](file://backend/alembic.ini)
- [frontend/package.json](file://frontend/package.json)
- [frontend/vite.config.js](file://frontend/vite.config.js)
- [docs/backend.md](file://docs/backend.md)
- [docs/frontend.md](file://docs/frontend.md)
- [docs/database.md](file://docs/database.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能注意事项](#性能注意事项)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向开发与运维团队提供“医院绩效系统”的完整环境部署方案覆盖开发与生产环境的搭建步骤、Python 3.10+ 与 Node.js 环境准备、PostgreSQL 数据库安装、后端 FastAPI 与前端 Vue 依赖安装、环境变量配置、虚拟环境与依赖隔离、版本兼容性检查,以及 Docker 容器化与传统部署方案的对比说明。
## 项目结构
系统采用前后端分离架构:
- 后端Python + FastAPI + SQLAlchemy 2.x + Alembic + PostgreSQL
- 前端Vue 3 + Vite + Element Plus + Axios
- 配置与文档Pydantic Settings 管理后端配置Vite 代理将前端请求转发至后端Alembic 管理数据库迁移
```mermaid
graph TB
subgraph "前端"
FE_PKG["frontend/package.json"]
FE_VITE["frontend/vite.config.js"]
end
subgraph "后端"
BE_REQ["backend/requirements.txt"]
BE_CFG["backend/app/core/config.py"]
BE_MAIN["backend/app/main.py"]
BE_ENV_EXAMPLE["backend/.env.example"]
BE_ALEMBIC["backend/alembic.ini"]
end
FE_PKG --> FE_VITE
BE_REQ --> BE_CFG
BE_CFG --> BE_MAIN
BE_ENV_EXAMPLE --> BE_CFG
BE_ALEMBIC --> BE_CFG
```
图表来源
- [frontend/package.json](file://frontend/package.json#L1-L27)
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
章节来源
- [docs/backend.md](file://docs/backend.md#L1-L475)
- [docs/frontend.md](file://docs/frontend.md#L1-L416)
- [docs/database.md](file://docs/database.md#L1-L286)
## 核心组件
- 后端配置与运行
- 配置来源Pydantic Settings 从 .env 读取环境变量支持调试模式、数据库连接、JWT 密钥、CORS、分页等参数
- 应用入口FastAPI 应用创建、CORS 中间件注册、路由挂载、健康检查与异常处理
- 数据库与迁移
- 数据库PostgreSQL异步驱动 asyncpg默认 URL 与池大小、溢出配置
- 迁移Alembic 管理数据库版本,支持升级/降级/历史查看
- 前端开发与构建
- 依赖Vue 3、Vue Router、Pinia、Element Plus、Axios、ECharts、Day.js、Vite、Sass
- 代理Vite 将 /api 前缀代理到后端 8000 端口,解决跨域
- 初始化脚本
- 数据库初始化:创建表并插入测试数据(若表为空)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/main.py](file://backend/app/main.py#L15-L92)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
- [frontend/package.json](file://frontend/package.json#L1-L27)
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
## 架构总览
系统采用前后端分离部署:
- 前端通过 Vite 开发服务器运行,开发时通过代理将 /api 请求转发到后端
- 后端使用 Uvicorn 运行,暴露 REST APISwagger UI 与 ReDoc 文档位于 /api/v1/docs 与 /api/v1/redoc
- 数据库使用 PostgreSQLAlembic 管理迁移
```mermaid
graph TB
Browser["浏览器/客户端"] --> FE_DEV["前端开发服务器<br/>Vite (5173)"]
FE_DEV --> API_PROXY["Vite 代理 /api -> 后端 8000"]
subgraph "后端"
UVICORN["Uvicorn 服务器<br/>FastAPI 应用 (8000)"]
CORS["CORS 中间件"]
ROUTER["API 路由 /api/v1/*"]
LOGGING["日志与异常处理"]
end
UVICORN --> CORS
UVICORN --> ROUTER
UVICORN --> LOGGING
ROUTER --> DB["PostgreSQL 数据库"]
ROUTER --> ALEMBIC["Alembic 迁移"]
```
图表来源
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
- [backend/app/main.py](file://backend/app/main.py#L19-L51)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
章节来源
- [docs/backend.md](file://docs/backend.md#L454-L475)
- [docs/frontend.md](file://docs/frontend.md#L380-L416)
## 详细组件分析
### 后端环境准备与依赖安装
- Python 3.10+
- 建议使用虚拟环境隔离依赖,确保与系统 Python 解耦
- 安装后端依赖
- 使用 requirements.txt 安装 FastAPI、SQLAlchemy、Alembic、Pydantic、JWT、密码哈希、异步数据库驱动等
- 环境变量
- 复制 .env.example 为 .env按需修改数据库连接、JWT 密钥、调试模式等
- 数据库初始化
- 可选:执行数据库初始化脚本创建表与测试数据
```mermaid
flowchart TD
Start(["开始"]) --> PyVer["检查 Python 3.10+"]
PyVer --> Venv["创建并激活虚拟环境"]
Venv --> PipReq["pip install -r backend/requirements.txt"]
PipReq --> EnvCfg["复制 .env.example 为 .env 并配置参数"]
EnvCfg --> DBInit{"是否需要初始化数据库?"}
DBInit --> |是| RunInit["执行数据库初始化脚本"]
DBInit --> |否| SkipInit["跳过初始化"]
RunInit --> Done(["完成"])
SkipInit --> Done
```
图表来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
章节来源
- [docs/backend.md](file://docs/backend.md#L454-L475)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
### 前端环境准备与依赖安装
- Node.js 与包管理器
- 安装 Node.js使用 npm 安装依赖
- 安装前端依赖
- 依据 package.json 的 dependencies 与 devDependencies 安装
- 开发与构建
- 开发npm run dev
- 构建npm run build
- 预览npm run preview
```mermaid
flowchart TD
StartFE(["开始"]) --> NodeCheck["检查 Node.js 版本"]
NodeCheck --> NpmInstall["npm install"]
NpmInstall --> DevRun["npm run dev (5173)"]
DevRun --> ProxyCfg["Vite 代理 /api -> 后端 8000"]
NpmInstall --> Build["npm run build (dist)"]
Build --> Preview["npm run preview"]
ProxyCfg --> DoneFE(["完成"])
Preview --> DoneFE
```
图表来源
- [frontend/package.json](file://frontend/package.json#L6-L10)
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
章节来源
- [docs/frontend.md](file://docs/frontend.md#L380-L416)
- [frontend/package.json](file://frontend/package.json#L1-L27)
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
### 数据库安装与迁移
- PostgreSQL 安装
- 安装 PostgreSQL创建数据库与用户
- 连接配置
- 在 .env 或配置文件中设置 DATABASE_URL确保与 alembic.ini 中的 SQLAlchemy URL 一致或按需调整
- 迁移与升级
- 使用 Alembic 生成、升级、降级与查看迁移历史
```mermaid
flowchart TD
DBStart(["开始"]) --> InstallPG["安装 PostgreSQL 并创建数据库"]
InstallPG --> CfgURL["配置 DATABASE_URL (.env 或配置)"]
CfgURL --> AlembicInit["初始化 Alembic (如未初始化)"]
AlembicInit --> Gen["生成迁移 alembic revision --autogenerate"]
Gen --> Upgrade["升级到最新 alembic upgrade head"]
Upgrade --> DoneDB(["完成"])
```
图表来源
- [backend/.env.example](file://backend/.env.example#L4-L4)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
- [docs/database.md](file://docs/database.md#L274-L285)
章节来源
- [docs/database.md](file://docs/database.md#L274-L285)
- [backend/.env.example](file://backend/.env.example#L4-L4)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
### 环境变量配置说明
- 必填项
- 数据库连接DATABASE_URL示例值来自 .env.example
- JWT 密钥SECRET_KEY生产环境建议至少 32 字符且随机)
- 调试模式DEBUG开发环境开启生产关闭
- 可选项
- CORS 允许源CORS_ORIGINS前端开发端口 3000/5173
- API 前缀API_PREFIX默认 /api/v1
- 数据库连接池DATABASE_POOL_SIZE、DATABASE_MAX_OVERFLOW
- 分页参数DEFAULT_PAGE_SIZE、MAX_PAGE_SIZE
章节来源
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L33)
### 虚拟环境创建、依赖隔离与版本兼容性检查
- 虚拟环境
- 使用 venv 或 conda 创建独立 Python 环境,避免全局污染
- 依赖隔离
- 后端使用 requirements.txt前端使用 package.json分别在各自目录安装
- 版本兼容性
- 后端FastAPI >= 0.115、SQLAlchemy >= 2.0.36、Alembic >= 1.14、Pydantic >= 2.10、asyncpg >= 0.30、uvicorn >= 0.32
- 前端Vue 3.4+、Vite 5.0+、Element Plus 2.5+、Axios 1.6+
章节来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [docs/backend.md](file://docs/backend.md#L3-L15)
- [frontend/package.json](file://frontend/package.json#L11-L25)
- [docs/frontend.md](file://docs/frontend.md#L3-L16)
### Docker 容器化部署与传统部署对比
- 传统部署(本机直装)
- 优点:部署简单、资源占用低、便于调试
- 缺点:环境差异大、依赖冲突风险高
- 容器化部署Docker
- 优点:环境一致、可移植性强、易于扩展与回滚
- 缺点:学习成本、镜像体积与网络配置
- 建议
- 生产环境优先采用容器化;开发环境可按需选择
[本节为概念性说明,不直接分析具体文件,故无章节来源]
## 依赖关系分析
后端与前端的关键依赖关系如下:
```mermaid
graph LR
subgraph "后端依赖"
FASTAPI["FastAPI"]
SQLA["SQLAlchemy 2.x"]
ALEMBIC["Alembic"]
PYDANTIC["Pydantic / Pydantic Settings"]
ASYNC["asyncpg / aiosqlite"]
UVICORN["Uvicorn"]
end
subgraph "前端依赖"
VUE["Vue 3"]
ROUTER["Vue Router"]
PINIA["Pinia"]
AXIOS["Axios"]
ELEM["Element Plus"]
ECHARTS["ECharts"]
DAYJS["Day.js"]
VITE["Vite"]
SASS["Sass"]
end
VITE --> AXIOS
AXIOS --> BACKEND["后端 API (/api/v1)"]
BACKEND --> SQLA
SQLA --> ALEMBIC
BACKEND --> ASYNC
BACKEND --> UVICORN
BACKEND --> PYDANTIC
```
图表来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [frontend/package.json](file://frontend/package.json#L11-L25)
章节来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [frontend/package.json](file://frontend/package.json#L1-L27)
## 性能注意事项
- 数据库连接池
- 合理设置连接池大小与溢出数量,避免高并发下的连接争用
- 异步 I/O
- 使用异步数据库驱动与异步 ORM提升 I/O 密集场景性能
- 前端静态资源
- 生产构建后启用缓存与压缩,减少带宽与加载时间
- 日志与监控
- 生产环境开启结构化日志,结合外部监控系统追踪性能瓶颈
[本节提供一般性指导,不直接分析具体文件,故无章节来源]
## 故障排查指南
- 前端跨域问题
- 确认 Vite 代理配置指向后端 8000 端口,代理前缀 /api 与后端 API 前缀一致
- 后端无法连接数据库
- 检查 DATABASE_URL、数据库服务状态、网络连通性与凭据
- JWT 令牌无效
- 确认 SECRET_KEY 设置正确且前后端一致,注意生产环境必须足够复杂
- Alembic 迁移失败
- 检查迁移脚本与数据库版本一致性,必要时执行降级再升级
- 健康检查
- 访问后端 /health 端点确认服务可用
章节来源
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L18)
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
- [docs/backend.md](file://docs/backend.md#L454-L475)
- [docs/frontend.md](file://docs/frontend.md#L396-L416)
## 结论
通过本指南,您可以在开发与生产环境中快速搭建“医院绩效系统”。建议:
- 使用虚拟环境隔离后端依赖,使用包管理器安装前端依赖
- 正确配置 .env 与配置模块确保数据库、JWT、CORS 等关键参数生效
- 使用 Alembic 管理数据库迁移,生产环境优先容器化部署
- 遵循版本兼容性要求,关注性能与可观测性
[本节为总结性内容,不直接分析具体文件,故无章节来源]
## 附录
- 快速命令参考
- 后端安装与运行pip install -r backend/requirements.txtuvicorn app.main:app --reload --host 0.0.0.0 --port 8000
- 前端安装与运行npm installnpm run devnpm run buildnpm run preview
- 数据库迁移alembic revision --autogenerate -m "..."alembic upgrade headalembic downgrade -1alembic history
章节来源
- [docs/backend.md](file://docs/backend.md#L454-L475)
- [docs/frontend.md](file://docs/frontend.md#L380-L416)
- [docs/database.md](file://docs/database.md#L274-L285)

View File

@@ -0,0 +1,351 @@
# 系统监控
<cite>
**本文引用的文件**
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/requirements.txt](file://backend/requirements.txt)
- [backend/.env.example](file://backend/.env.example)
- [test_frontend_connection.py](file://test_frontend_connection.py)
- [ALL_ISSUES_FIXED.md](file://ALL_ISSUES_FIXED.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向“系统监控与日志管理”围绕应用日志配置、错误日志收集、性能日志分析、日志轮转策略、日志级别与格式标准化以及系统资源与应用性能监控API响应时间、数据库查询性能、并发处理能力、告警机制与通知渠道、监控仪表板搭建与可视化展示进行系统化说明。结合仓库现有代码给出可落地的实践建议与最佳实践。
## 项目结构
后端采用 FastAPI + SQLAlchemy 2.0 异步架构,日志配置集中于核心模块,主程序负责异常处理与健康检查,统计服务与 API 提供了性能与报表相关的能力入口。前端通过健康检查脚本与测试报告验证系统连通性。
```mermaid
graph TB
subgraph "后端"
MAIN["app/main.py"]
CFG["app/core/config.py"]
LOG["app/core/logging_config.py"]
DB["app/core/database.py"]
STATS_API["app/api/v1/stats.py"]
STATS_SVC["app/services/stats_service.py"]
MODELS["app/models/models.py"]
end
subgraph "外部"
REQ["requirements.txt"]
ENV[".env.example"]
TEST["test_frontend_connection.py"]
end
MAIN --> LOG
MAIN --> CFG
MAIN --> STATS_API
STATS_API --> STATS_SVC
STATS_SVC --> DB
DB --> MODELS
REQ --> MAIN
ENV --> CFG
TEST --> MAIN
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [test_frontend_connection.py](file://test_frontend_connection.py#L1-L36)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [test_frontend_connection.py](file://test_frontend_connection.py#L1-L36)
## 核心组件
- 日志配置模块:定义日志目录、格式、级别与处理器(控制台、应用日志文件、错误日志文件),并提供子日志器获取方法。
- 主应用注册异常处理器、CORS 中间件、路由;提供健康检查端点;统一记录 HTTP、校验与全局异常。
- 配置模块集中管理应用名称、版本、调试开关、数据库连接池大小、JWT、跨域、分页等配置。
- 数据库模块:创建异步引擎与会话工厂,支持调试模式下的 SQL 输出。
- 统计 API 与服务:提供 BSC 维度、部门统计、趋势、排名、完成度等统计接口与服务实现,便于性能与业务指标分析。
- 模型层:定义科室、员工、指标、考核、明细、工资、计划、菜单、模板等实体与索引,支撑统计分析与查询性能。
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
## 架构总览
下图展示了日志、异常处理、数据库访问与统计分析之间的交互关系,体现监控与日志在系统中的位置与职责边界。
```mermaid
graph TB
CLIENT["客户端/前端"] --> API["FastAPI 应用"]
API --> EXC["异常处理器<br/>HTTP/校验/全局异常"]
API --> LOG["日志记录器"]
API --> ROUTER["路由注册"]
ROUTER --> STATS_API["统计 API 层"]
STATS_API --> STATS_SVC["统计服务层"]
STATS_SVC --> DB["异步数据库引擎/会话"]
DB --> MODELS["ORM 模型"]
LOG --> HANDLER_APP["应用日志文件处理器"]
LOG --> HANDLER_ERR["错误日志文件处理器"]
LOG --> HANDLER_CONSOLE["控制台处理器"]
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L54-L76)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L33-L59)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L202)
## 详细组件分析
### 日志配置与轮转策略
- 日志目录与文件命名:自动创建 logs 目录,按日期生成应用日志与错误日志文件,避免多进程写冲突。
- 日志格式:统一包含时间戳、记录器名称、级别与消息体,便于检索与聚合。
- 处理器与级别:
- 控制台处理器INFO 级别及以上输出至 stdout。
- 应用日志文件处理器DEBUG 级别10MB 分割,保留 7 份备份。
- 错误日志文件处理器ERROR 级别独立文件10MB 分割,保留 7 份备份。
- 子日志器:通过 get_logger(name) 获取子记录器,便于模块化日志隔离与追踪。
```mermaid
flowchart TD
Start(["应用启动"]) --> InitLogger["初始化日志记录器<br/>设置级别与格式"]
InitLogger --> AddConsole["添加控制台处理器<br/>级别: INFO"]
InitLogger --> AddAppFile["添加应用日志文件处理器<br/>级别: DEBUG<br/>大小: 10MB<br/>备份数: 7"]
InitLogger --> AddErrFile["添加错误日志文件处理器<br/>级别: ERROR<br/>大小: 10MB<br/>备份数: 7"]
AddConsole --> Ready["日志系统就绪"]
AddAppFile --> Ready
AddErrFile --> Ready
```
图表来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L26-L59)
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
### 异常处理与错误日志收集
- HTTP 异常记录请求方法、URL、状态码与详情便于定位接口错误。
- 请求校验异常:记录校验错误上下文,辅助前端参数修正。
- 全局异常:记录异常堆栈,便于定位未捕获异常。
- 健康检查:提供 /health 端点,便于运维快速判断服务可用性。
```mermaid
sequenceDiagram
participant C as "客户端"
participant A as "FastAPI 应用"
participant L as "日志记录器"
C->>A : 发起请求
A->>A : 路由匹配与业务处理
alt HTTP 异常
A->>L : 记录警告日志
A-->>C : 返回 HTTP 错误
else 校验异常
A->>L : 记录错误日志
A-->>C : 返回校验错误
else 其他异常
A->>L : 记录错误日志(含堆栈)
A-->>C : 返回服务器错误
end
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L58-L76)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
### 性能日志与统计分析入口
- 统计 API提供 BSC 维度、部门统计、趋势、排名、完成度等接口,作为性能与业务分析的数据源。
- 统计服务:封装复杂查询与聚合逻辑,支持按年月、科室等维度过滤与排序。
- 数据模型:定义考核、明细、指标、部门、员工等实体,配合索引提升查询效率。
```mermaid
sequenceDiagram
participant FE as "前端"
participant API as "统计 API"
participant SVC as "统计服务"
participant DB as "数据库引擎/会话"
participant M as "ORM 模型"
FE->>API : GET /stats/...
API->>SVC : 调用统计方法(传入过滤条件)
SVC->>DB : 执行异步查询(聚合/分组/排序)
DB->>M : 映射为模型对象
SVC-->>API : 返回聚合结果
API-->>FE : 返回 JSON 响应
```
图表来源
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L202)
章节来源
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
### 数据库连接与查询性能
- 异步引擎:基于 SQLAlchemy 2.0 的异步引擎,支持 echo 开关用于调试期 SQL 输出。
- 会话工厂:配置过载与池大小,结合业务并发需求调整。
- 索引与约束:模型层定义了多处索引与约束,有助于统计查询的性能与数据完整性。
```mermaid
classDiagram
class DatabaseConfig {
+DATABASE_URL
+DATABASE_POOL_SIZE
+DATABASE_MAX_OVERFLOW
+DEBUG
}
class Engine {
+create_async_engine(url, echo)
}
class SessionMaker {
+async_session_maker()
}
class Base {
<<declarative_base>>
}
DatabaseConfig --> Engine : "提供连接参数"
Engine --> SessionMaker : "创建会话工厂"
SessionMaker --> Base : "会话绑定模型"
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
### 健康检查与前端连通性
- 健康检查:/health 返回服务状态与版本,便于容器编排与负载均衡探活。
- 前端连通性测试:脚本对后端健康端点与前端端口进行探测,辅助快速定位网络或服务问题。
```mermaid
sequenceDiagram
participant T as "测试脚本"
participant BE as "后端 /health"
participant FE as "前端"
T->>BE : GET /health
BE-->>T : 200 健康状态
T->>FE : GET 前端首页
FE-->>T : 200 页面
T-->>T : 输出连通性结论
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
- [test_frontend_connection.py](file://test_frontend_connection.py#L15-L35)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [test_frontend_connection.py](file://test_frontend_connection.py#L1-L36)
## 依赖关系分析
- 运行时依赖FastAPI、Uvicorn、SQLAlchemy 2.x、asyncpg/aiosqlite、Alembic、Pydantic、Pydantic-Settings、Passlib、python-dotenv、HTTPX、PyTest 等。
- 环境变量:数据库 URL、JWT 密钥、调试开关等通过 .env.example 提供示例。
```mermaid
graph LR
FASTAPI["FastAPI"] --> UVICORN["Uvicorn"]
FASTAPI --> SQLA["SQLAlchemy 2.x"]
SQLA --> ASYNC["异步引擎/会话"]
SQLA --> MODELS["ORM 模型"]
ALEMBIC["Alembic"] --> DB["数据库迁移"]
PYDANTIC["Pydantic/Settings"] --> CONFIG["应用配置"]
PASSLIB["Passlib"] --> AUTH["认证/加密"]
DOTENV["python-dotenv"] --> CONFIG
```
图表来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/app/core/config.py](file://backend/app/core/config.py#L35-L46)
章节来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
## 性能考虑
- 日志轮转:当前配置为 10MB 分割、7 份备份,建议结合磁盘容量与日志量评估,必要时降低单文件大小或增加备份数。
- 日志级别:生产环境建议将控制台级别提升至 WARNING 或 ERROR减少 INFO 级噪声;仅在调试阶段开启 DEBUG。
- 数据库连接池:根据并发与数据库承载能力调整池大小与最大溢出数,避免连接争用。
- 查询优化:利用模型层索引(如考核状态、周期、部门等)与分页,避免一次性加载大量数据。
- API 响应时间:可通过中间件或装饰器埋点统计请求耗时,结合日志与指标系统进行趋势分析。
## 故障排查指南
- 健康检查失败:确认后端服务已启动且监听端口正确,查看日志文件定位异常。
- 前端无法访问:使用测试脚本检查前端端口可达性,核对 CORS 配置。
- 统计接口返回空数据:当前部分统计接口返回模拟数据或需填充真实数据,参考测试报告中的接口调用示例。
- 数据库连接问题:核对 .env 中 DATABASE_URL 与数据库服务状态确认驱动asyncpg/aiosqlite安装正确。
章节来源
- [test_frontend_connection.py](file://test_frontend_connection.py#L1-L36)
- [ALL_ISSUES_FIXED.md](file://ALL_ISSUES_FIXED.md#L94-L169)
- [backend/.env.example](file://backend/.env.example#L3-L10)
## 结论
本项目已具备完善的日志配置与异常处理基础,统计 API 与服务提供了性能与业务分析的入口。建议在生产环境中进一步完善日志级别与轮转策略、引入数据库慢查询与连接池监控、扩展告警与通知机制,并基于统计接口搭建可视化仪表板,实现持续可观测与趋势分析。
## 附录
### 日志级别与格式标准化建议
- 级别划分DEBUG/INFO/WARNING/ERROR/CRITICAL生产环境默认 WARNING调试时临时提升。
- 格式字段:时间戳、记录器名称、线程/协程 ID、级别、模块路径、行号、消息体、异常堆栈如有
- 文件命名:按日期切分,错误日志独立文件,便于检索与归档。
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L22-L24)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L33-L59)
### 告警机制与通知渠道
- 告警维度HTTP 错误率、异常频次、数据库连接池耗尽、慢查询阈值、队列积压、磁盘/内存/CPU 阈值。
- 阈值设置:结合历史峰值与 SLA 设定,建议采用滚动窗口与自适应阈值。
- 通知渠道:邮件、企业微信/钉钉机器人、IM 通道,区分严重与一般告警等级。
[本节为概念性内容,无需文件来源]
### 监控仪表板与可视化
- 数据源:统计 APIBSC 维度、部门统计、趋势、排名、完成度与系统指标CPU/内存/磁盘/网络)。
- 可视化组件:折线图(趋势)、柱状图(排名)、仪表盘(关键指标)、热力图(部门得分分布)。
- 实现建议:前端图表库 + 后端定时抓取/推送,或接入 Prometheus/Grafana扩展
[本节为概念性内容,无需文件来源]

View File

@@ -0,0 +1,337 @@
# 部署运维
<cite>
**本文引用的文件**
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/.env.example](file://backend/.env.example)
- [backend/requirements.txt](file://backend/requirements.txt)
- [backend/init_db.py](file://backend/init_db.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
- [docs/backend.md](file://docs/backend.md)
- [docs/database.md](file://docs/database.md)
- [frontend/package.json](file://frontend/package.json)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向医院绩效系统的生产部署与运维,覆盖以下主题:
- 生产环境部署流程与环境变量配置
- Docker 容器化部署与 Nginx 反向代理、SSL 证书管理
- 数据库备份策略、日志管理与性能监控
- 负载均衡、高可用架构与灾难恢复计划
- 运维脚本、自动化部署与版本升级流程
- 安全加固、漏洞扫描与合规性检查
## 项目结构
后端采用 FastAPI + SQLAlchemy 2.0 异步架构,前端为 Vue 3 + Vite。系统通过 .env 管理运行时配置,支持 Alembic 数据库迁移。
```mermaid
graph TB
subgraph "后端"
A["app/main.py<br/>应用入口与路由注册"]
B["app/core/config.py<br/>配置管理"]
C["app/core/database.py<br/>异步数据库引擎"]
D["app/core/logging_config.py<br/>日志配置"]
E["app/api/v1/__init__.py<br/>路由聚合"]
F["init_db.py<br/>初始化与测试数据"]
end
subgraph "前端"
G["frontend/package.json<br/>构建与依赖"]
end
A --> E
A --> B
A --> D
E --> C
F --> C
G --> A
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
- [frontend/package.json](file://frontend/package.json#L1-L27)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [docs/backend.md](file://docs/backend.md#L1-L475)
## 核心组件
- 应用入口与路由:创建 FastAPI 实例、注册 CORS、健康检查、全局异常处理并挂载 v1 路由前缀。
- 配置管理集中管理应用名称、版本、调试模式、API 前缀、数据库连接、JWT 密钥算法与过期时间、CORS 源、分页参数等。
- 数据库层:异步 SQLAlchemy 引擎与会话工厂,提供依赖注入式数据库会话。
- 日志模块:按日轮转的多处理器日志记录,区分应用日志与错误日志。
- 初始化脚本:自动建表与插入测试数据,避免重复初始化。
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L65)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
## 架构总览
系统采用前后端分离架构,后端提供 REST API前端通过 Axios 访问后端接口;数据库为 PostgreSQL使用异步驱动。
```mermaid
graph TB
FE["前端应用<br/>Vue 3 + Vite"] --> API["后端API<br/>FastAPI"]
API --> DB["数据库<br/>PostgreSQL"]
API --> LOG["日志系统<br/>按日轮转"]
API --> CFG["配置中心<br/>.env + pydantic-settings"]
```
图表来源
- [docs/backend.md](file://docs/backend.md#L3-L15)
- [backend/app/main.py](file://backend/app/main.py#L19-L51)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L18-L20)
- [backend/app/core/config.py](file://backend/app/core/config.py#L35-L37)
## 详细组件分析
### 配置管理Settings
- 环境变量文件:.env.example 提供数据库 URL、JWT 密钥、调试开关等示例。
- 运行时配置Settings 使用 pydantic-settings 从 .env 加载,支持缓存单例。
- 关键项:
- 应用名称与版本、调试模式、API 前缀
- 数据库连接串、连接池大小与溢出
- JWT 密钥、算法与过期时间
- CORS 源列表
- 分页默认与最大页大小
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/.env.example](file://backend/.env.example#L1-L11)
### 数据库层(异步引擎与会话)
- 异步引擎:基于配置的 DATABASE_URL 创建 asyncpg 引擎DEBUG 控制 echo。
- 会话工厂:异步会话构造与生命周期管理,提供依赖注入。
- 依赖函数get_db 提供事务语义(提交/回滚/关闭),确保异常安全。
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
### 日志模块RotatingFileHandler
- 日志目录:位于 backend/logs按日期命名文件。
- 处理器:
- 控制台 INFO 级别输出
- 文件 DEBUG 级别轮转10MB保留7份
- 错误 ERROR 级别单独文件轮转
- 获取子日志器:统一命名空间,便于模块化追踪。
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L65)
### 应用入口与路由FastAPI
- 应用实例设置标题、版本、OpenAPI 文档路径前缀。
- CORS 中间件:允许指定源、凭证、方法与头。
- 路由注册:聚合 v1 子路由,统一前缀。
- 健康检查:/health 返回状态与版本。
- 异常处理HTTP、请求校验、全局异常统一记录与抛出。
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
### 初始化脚本(建表与测试数据)
- 自动建表:创建所有模型对应的数据表。
- 测试数据:若 departments 表为空则批量插入默认数据。
- 管理员账户:创建 admin 用户并设置密码哈希。
章节来源
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
### 前端构建与依赖
- 构建脚本dev/build/preview。
- 依赖Vue 3、Vue Router、Pinia、Axios、Element Plus、ECharts、Day.js。
- 与后端交互:通过 Axios 访问后端 API具体接口见 API 文档)。
章节来源
- [frontend/package.json](file://frontend/package.json#L6-L26)
- [docs/backend.md](file://docs/backend.md#L470-L475)
## 依赖关系分析
后端模块之间的依赖关系如下:
```mermaid
graph LR
main_py["app/main.py"] --> api_v1_init["app/api/v1/__init__.py"]
main_py --> cfg_py["app/core/config.py"]
main_py --> log_cfg_py["app/core/logging_config.py"]
api_v1_init --> db_py["app/core/database.py"]
init_db_py["init_db.py"] --> db_py
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L10-L51)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L27-L65)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/init_db.py](file://backend/init_db.py#L14-L15)
## 性能考虑
- 数据库连接池:通过配置 DATABASE_POOL_SIZE 与 DATABASE_MAX_OVERFLOW 控制并发与溢出。
- 异步 I/O使用 SQLAlchemy 2.0 异步引擎与 asyncpg减少阻塞。
- 日志级别:生产建议提升控制台级别至 INFO避免过多 DEBUG 输出。
- 分页限制MAX_PAGE_SIZE 限制单页最大条数,防止资源滥用。
- 健康检查:/health 用于探活,结合负载均衡实现快速摘除不健康实例。
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L33)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/app/main.py](file://backend/app/main.py#L53-L56)
## 故障排查指南
- 健康检查失败:确认 /health 返回 healthy 与版本号。
- 数据库连接异常:检查 DATABASE_URL、网络连通性与 PostgreSQL 服务状态。
- 日志定位:查看 backend/logs 下按日期命名的日志文件,优先关注 ERROR 日志。
- CORS 问题:确认前端地址在 CORS_ORIGINS 列表中。
- 初始化未生效:确认 init_db.py 执行顺序与数据库权限。
章节来源
- [backend/app/main.py](file://backend/app/main.py#L53-L77)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L18-L20)
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L29)
- [backend/init_db.py](file://backend/init_db.py#L20-L25)
## 结论
本指南提供了从配置、部署到运维监控的完整实践路径。建议在生产环境中严格管理 .env启用 HTTPS 与 TLS完善数据库备份与日志归档并结合负载均衡与健康检查实现高可用。
## 附录
### A. 生产环境部署流程
- 准备阶段
- 准备 PostgreSQL 实例,创建数据库与用户。
- 生成并妥善保管 SECRET_KEY至少 32 字符)。
- 配置
- 复制 .env.example 为 .env填写 DATABASE_URL、SECRET_KEY、DEBUG=false。
- 设置 CORS_ORIGINS 为前端域名或 IP。
- 启动
- 安装依赖pip install -r backend/requirements.txt
- 初始化数据库python backend/init_db.py
- 启动服务uvicorn app.main:app --host 0.0.0.0 --port 8000
- 验证
- 访问 /health 检查服务状态
- 访问 /api/v1/docs 或 /api/v1/redoc 查看接口文档
章节来源
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/init_db.py](file://backend/init_db.py#L81-L83)
- [docs/backend.md](file://docs/backend.md#L454-L475)
### B. 环境变量清单
- DATABASE_URL数据库连接串PostgreSQL
- SECRET_KEYJWT 密钥
- DEBUG调试模式开关
- CORS_ORIGINS允许跨域的源列表
- API_PREFIXAPI 前缀(如 /api/v1
章节来源
- [backend/.env.example](file://backend/.env.example#L3-L10)
- [backend/app/core/config.py](file://backend/app/core/config.py#L12-L33)
### C. Docker 容器化部署(步骤说明)
- 构建镜像
- 基于 Python 3.11+ 镜像
- 复制 requirements.txt 并安装依赖
- 复制后端代码与 .env
- 暴露端口 8000
- 运行容器
- 挂载日志目录 backend/logs 至宿主机
- 指定环境变量DATABASE_URL、SECRET_KEY、DEBUG、CORS_ORIGINS、API_PREFIX
- 通过健康检查 /health 配置探针
- 注意
- 将 .env 放置于受控位置,避免泄露
- 使用只读卷挂载代码,仅挂载日志目录为可写
[本节为概念性说明,不直接分析具体文件,故无“章节来源”]
### D. Nginx 反向代理与 SSL 证书
- 反代配置要点
- 将 /api/* 反代至后端服务(如 http://backend:8000
- 静态资源指向前端 dist 目录(如 /dist
- 启用 gzip/ssl开启 HSTS
- SSL 证书
- 使用 Lets Encrypt 或企业 CA
- 自动续期脚本与监控告警
- 健康检查
- upstream 中配置 /health 探针,失败自动摘除
[本节为概念性说明,不直接分析具体文件,故无“章节来源”]
### E. 数据库备份策略
- 全量备份:每周日凌晨执行 pg_dump -U <user> -h <host> <db> > backup.sql
- 增量/归档:开启 WAL 归档,配合 PITR
- 存储备份:加密存储于对象存储或磁带库,保留 4-8 周
- 验证恢复:每季度执行恢复演练
[本节为通用运维实践,不直接分析具体文件,故无“章节来源”]
### F. 日志管理与性能监控
- 日志
- 后端backend/logs 按日轮转,保留 7 天
- 前端:浏览器控制台与网络面板排查
- 监控
- 指标CPU/内存/连接数/慢查询/错误率
- 告警:阈值触发与收敛策略
- 链路追踪:结合 OpenTelemetry 或 APM
[本节为通用运维实践,不直接分析具体文件,故无“章节来源”]
### G. 负载均衡、高可用与灾难恢复
- 高可用
- 多实例部署(至少 2 个后端实例)
- PostgreSQL 主从复制或托管服务
- 健康检查与自动摘除
- 灾难恢复
- RTO/RPO 目标明确
- 快速恢复流程与角色分工
- 定期演练与文档更新
[本节为通用运维实践,不直接分析具体文件,故无“章节来源”]
### H. 运维脚本、自动化部署与版本升级
- 自动化
- CI/CD拉取代码 → 单元测试 → 构建镜像 → 发布
- 蓝绿/滚动发布:灰度流量切换
- 升级流程
- 数据库迁移alembic upgrade head
- 前后端版本对齐:锁定依赖版本
- 回滚预案:镜像标签回滚与数据库 downgrade
章节来源
- [docs/backend.md](file://docs/backend.md#L438-L452)
### I. 安全加固、漏洞扫描与合规
- 安全加固
- 禁用 DEBUG最小权限原则
- 强密码与密钥轮换HTTPS 强传输
- 输入校验与 SQL 注入防护ORM 已内置)
- 漏洞扫描
- 依赖扫描pip-audit/安全扫描工具
- 漏洞修复与补丁管理
- 合规
- 数据最小化与访问审计
- 签名与完整性校验(如需要)
[本节为通用运维实践,不直接分析具体文件,故无“章节来源”]