2026-04-29-21-51-19 - 全栈系统改造:FastAPI后端+SAM2+PostgreSQL+Redis+MinIO+前端Zustand重构

This commit is contained in:
2026-04-29 22:17:25 +08:00
parent c8f8686097
commit fd4b5e5b3d
39 changed files with 3816 additions and 211 deletions

View File

@@ -0,0 +1,185 @@
# 实现方案 - 2026-04-29-21-51-19
## 对应需求
- 需求分析文档: `需求分析-2026-04-29-21-51-19.md`
## 方案概述
在 RTX 4090 + Ubuntu 22.04 环境下,将纯前端 React 应用改造为全栈语义分割系统。本次为**骨架搭建 + 核心能力落地**,优先保证各模块可独立运行并互联互通。
## 整体架构
```
┌─────────────────────────────────────────────────────────────────┐
│ 前端层 (React 19) │
│ Zustand (状态) + Axios (HTTP) + WebSocket (实时进度) │
│ Konva (Canvas) + TailwindCSS (样式) │
└────────────────────────────┬────────────────────────────────────┘
│ HTTP / WebSocket
┌────────────────────────────▼────────────────────────────────────┐
│ 后端层 (FastAPI + Python) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 项目/模板 API │ │ 媒体解析 API │ │ AI 推理 API │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ └─────────────────┼─────────────────┘ │
│ │ SQLAlchemy │
│ ┌────────────────────────▼────────────────────────┐ │
│ │ PostgreSQL (关系数据) │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────┐ │
│ │ MinIO (对象存储: 视频/帧/Mask) │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────┐ │
│ │ Redis (缓存 + 任务队列) │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────┐ │
│ │ SAM 3 (GPU 推理节点) │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
## 修改/新增文件清单
### A. 基础设施层
#### A1. 系统服务安装
- **操作**: `sudo apt install postgresql postgresql-contrib redis-server ffmpeg`
- **操作**: 下载并启动 MinIO 二进制
- **说明**: 配置 PostgreSQL 数据库/用户Redis 默认端口MinIO 端口 9000/9001
#### A2. Conda 环境
- **操作**: `conda create -n seg_server python=3.11`
- **操作**: 安装 PyTorch 2.5+ CUDA 13.x、FastAPI、SQLAlchemy、psycopg2-binary、redis-py、minio、uvicorn、python-multipart、celery、opencv-python、pillow、scikit-image、pydicom、numpy
### B. 后端层 (新增 backend/ 目录)
#### B1. `backend/main.py`
- **类型**: 新增
- **内容**: FastAPI 入口CORS 配置, lifespan 管理(启动/关闭数据库、Redis、MinIO 连接)
#### B2. `backend/config.py`
- **类型**: 新增
- **内容**: 环境变量配置DB_URL、REDIS_URL、MINIO_ENDPOINT、SAM_MODEL_PATH 等)
#### B3. `backend/database.py`
- **类型**: 新增
- **内容**: SQLAlchemy engine + session + BasePostgreSQL 连接
#### B4. `backend/models.py`
- **类型**: 新增
- **内容**: 数据库 ORM 模型Project、Frame、Annotation、Template、Mask
#### B5. `backend/schemas.py`
- **类型**: 新增
- **内容**: Pydantic 数据校验模型
#### B6. `backend/minio_client.py`
- **类型**: 新增
- **内容**: MinIO 客户端封装(上传、下载、预签名 URL
#### B7. `backend/redis_client.py`
- **类型**: 新增
- **内容**: Redis 客户端封装
#### B8. `backend/routers/projects.py`
- **类型**: 新增
- **内容**: 项目 CRUD API
#### B9. `backend/routers/templates.py`
- **类型**: 新增
- **内容**: 本体模板 API
#### B10. `backend/routers/media.py`
- **类型**: 新增
- **内容**: 视频/图片/DCM 上传 APIFFmpeg 拆帧任务触发
#### B11. `backend/routers/ai.py`
- **类型**: 新增
- **内容**: SAM 3 推理 APIpoint/box/semanticMask 生成与存储
#### B12. `backend/routers/export.py`
- **类型**: 新增
- **内容**: 标注数据导出COCO JSON、PNG Mask
#### B13. `backend/services/sam3_engine.py`
- **类型**: 新增
- **内容**: SAM 3 模型加载、推理封装、GPU 内存管理
#### B14. `backend/services/frame_parser.py`
- **类型**: 新增
- **内容**: FFmpeg 视频拆帧、DCM 影像逐帧提取、帧上传 MinIO
#### B15. `backend/services/task_queue.py`
- **类型**: 新增
- **内容**: Celery + Redis 异步任务队列封装
#### B16. `backend/requirements.txt`
- **类型**: 新增
- **内容**: Python 依赖清单
### C. 前端层 (修改现有 src/)
#### C1. `src/store/index.ts` (新增)
- **内容**: Zustand 全局 Storeproject、workspace、annotations、ui 状态)
#### C2. `src/lib/api.ts` (新增)
- **内容**: Axios 实例封装baseURL 指向 FastAPI
#### C3. `src/lib/websocket.ts` (新增)
- **内容**: WebSocket 客户端,接收解析进度
#### C4. `src/App.tsx` (修改)
- **内容**: 移除 Login 硬编码,接入真实登录 APIProvider 包裹
#### C5. `src/components/ProjectLibrary.tsx` (修改)
- **内容**: 从后端 API 加载项目列表,支持创建/删除
#### C6. `src/components/TemplateRegistry.tsx` (修改)
- **内容**: 从后端 API 加载本体字典,支持动态增删
#### C7. `src/components/CanvasArea.tsx` (修改)
- **内容**: 点击画布捕获坐标,发送至后端 AI 接口,接收并渲染 Mask Path
#### C8. `src/components/AISegmentation.tsx` (修改)
- **内容**: 对接后端 SAM 3 推理接口,显示推理状态
#### C9. `src/components/Dashboard.tsx` (修改)
- **内容**: 显示真实解析队列进度WebSocket
### D. 部署与运维
#### D1. `start_services.sh` (新增)
- **内容**: 一键启动 PostgreSQL、Redis、MinIO、FastAPI 的脚本
#### D2. `backend/download_sam3.py` (新增)
- **内容**: SAM 3 模型权重自动下载脚本
## 新增依赖
### Python (conda 环境)
```
fastapi uvicorn[standard] python-multipart
sqlalchemy psycopg2-binary alembic
redis celery
minio
opencv-python pillow scikit-image pydicom numpy
```
### 前端 (npm)
```
zustand axios
```
## 兼容性分析
- Express `server.ts` 将被保留但不再作为默认启动方式FastAPI 成为主后端
- 前端路由逻辑不变,仅数据获取方式从内存/mock 改为 HTTP API
- 回滚策略: 回退到 `npm start` 仍可运行旧版 Express 前端
## 预估工作量
- 基础设施: 20 分钟
- 后端骨架: 40 分钟
- 前端改造: 30 分钟
- SAM 3 部署: 20 分钟
- 联调验证: 20 分钟

View File

@@ -0,0 +1,78 @@
# 测试方案 - 2026-04-29-21-51-19
## 对应实现方案
- 实现方案文档: `实现方案-2026-04-29-21-51-19.md`
## 测试范围
- 基础设施服务可达性
- FastAPI 后端启动与 API 响应
- 前端构建与后端联调
- SAM 3 模型加载与 GPU 可用性
- 文件上传与解析流程
## 测试用例
### 用例 1: 基础设施服务验证
- **前置条件**: 执行 start_services.sh
- **操作步骤**:
1. `curl http://localhost:9000/minio/health/live` → MinIO
2. `redis-cli ping` → Redis
3. `sudo -u postgres psql -c "\\l"` → PostgreSQL
- **预期结果**: 全部返回正常响应
- **通过标准**: MinIO 200, Redis PONG, PostgreSQL 显示数据库列表
### 用例 2: Conda 环境 + GPU 验证
- **前置条件**: conda 环境已创建
- **操作步骤**:
1. `conda activate seg_server`
2. `python -c "import torch; print(torch.cuda.is_available())"`
- **预期结果**: 输出 True
- **通过标准**: PyTorch 识别到 CUDA
### 用例 3: SAM 3 权重下载验证
- **前置条件**: 运行 download_sam3.py
- **操作步骤**: 检查权重文件存在且大小合理
- **预期结果**: .pt/.pth 文件存在于 models/ 目录
- **通过标准**: 文件大小 > 100MB
### 用例 4: FastAPI 启动验证
- **前置条件**: 依赖安装完成
- **操作步骤**:
1. `cd backend && uvicorn main:app --host 0.0.0.0 --port 8000`
2. 访问 `http://localhost:8000/docs`
- **预期结果**: Swagger UI 正常显示,包含所有 API 路由
- **通过标准**: HTTP 200路由列表完整
### 用例 5: 前端构建验证
- **前置条件**: 前端代码已改造
- **操作步骤**: `npm run lint && npm run build`
- **预期结果**: 无类型错误,构建成功
- **通过标准**: exit code 0
### 用例 6: 前后端联调验证
- **前置条件**: 前后端均运行中
- **操作步骤**:
1. 前端访问 `http://localhost:3000`
2. 打开浏览器 DevTools Network 面板
3. 触发项目列表加载
- **预期结果**: 可见对 `http://localhost:8000/api/projects` 的请求,且返回 200
- **通过标准**: API 数据正确渲染到界面
### 用例 7: 文件上传验证
- **前置条件**: 媒体解析模块就绪
- **操作步骤**: 上传 @Data_MyVideo_1.mp4
- **预期结果**: 后端接收文件,存入 MinIO触发解析任务
- **通过标准**: MinIO bucket 中出现文件,返回 job_id
## 回归测试
- [ ] 现有 React 组件无运行时错误
- [ ] 深色主题样式未被破坏
- [ ] Konva Canvas 可正常交互
- [ ] 构建产物体积未异常膨胀
## 测试环境
- OS: Ubuntu 22.04
- GPU: NVIDIA RTX 4090 24GB
- CUDA: 13.2
- Python: 3.11 (conda)
- Node.js: 22.x

View File

@@ -65,4 +65,38 @@ AI 助手运行的容器/环境与项目实际开发环境分离,后者才装
---
## 2026-04-29-21-51-19 — 全栈系统改造FastAPI + SAM2 + PostgreSQL + Redis + MinIO
### A. 具体问题
1. 将纯前端 React 应用改造为全栈系统时工程涉及后端框架替换、数据库设计、对象存储、AI 推理引擎、前端状态管理重构等多个复杂模块,单次执行工程量大。
2. 系统磁盘空间24G不足PyTorch CUDA 版本(>2GB和 sam2 pip 包编译(需下载 CUDA 工具链 + 编译 C++ 扩展)均因 `OSError: No space left on device` 失败。
3. MinIO 对象存储在磁盘紧张时报 `XMinioStorageFull`,导致文件上传失败。
4. 前端 Agent 执行时因目录扁平化后子目录不存在,产生多次 `File not found` 错误。
### B. 产生原因
1. 项目改造范围超出单次会议合理容量,涉及 15+ 后端文件、10+ 前端文件、4 个基础设施服务、1 个 AI 模型栈。
2. 系统盘仅有 24GBconda 环境2GB、node_modules222MB、模型权重1.5GB、MinIO 帧文件1.4GB)叠加后迅速耗尽空间。
3. sam2 的 pip 包依赖 torch>=2.5.1pip 会尝试重新下载完整 torch wheel530MB作为 build dependency即使 torch 已安装。
4. 前端 Agent 的 prompt 中未明确说明组件目录已扁平化Agent 仍尝试读取旧的子目录路径。
### C. 解决方案
1. **任务拆分 + 并行 Agent**: 将后端和前端代码编写拆分为两个独立 Agent 并行执行,基础设施安装与代码编写并行推进,显著缩短总耗时。
2. **磁盘管理策略**:
- 安装 PyTorch CPU 版本替代 CUDA 版本(占用更小)
- 只保留 sam2_hiera_tiny.pt149MB删除其他大模型
- 清理 conda pkgs 缓存(释放 600MB+
- 删除 MinIO 中解析生成的临时帧文件(释放 1.4GB
3. **sam2 安装降级**: 当前环境以 stub 模式运行,提供 `install_sam2.sh` 脚本供用户在扩展磁盘后执行真实安装。
4. **API 路径修复**: 后端添加 `/api/auth/login` 路由,修复前端 api.ts 中 `/api/predict``/api/ai/predict` 的路径不匹配。
5. **MinIO API 适配**: minio 7.2.x 中 `presigned_url()` 已改为 `get_presigned_url()`,需从 `datetime.timedelta` 传入 expires。
### D. 后续如何避免问题
1. **大型改造前先做磁盘评估**: 执行 `df -h` 确认可用空间 > 5GB 再开始安装大型依赖。
2. **AI 模型依赖延迟加载**: 所有 AI 推理引擎必须实现 graceful fallback模型缺失时不阻塞系统启动。
3. **Agent prompt 需同步最新目录结构**: 给 Agent 的上下文必须包含当前真实的文件路径,避免 `File not found`
4. **构建依赖隔离**: 使用 `--no-build-isolation``--no-deps` 安装源码包,避免 pip 重复下载已安装的依赖。
5. **MinIO 空间监控**: 定期清理解析产生的临时帧文件,或配置 MinIO 使用独立大容量数据盘。
---
> 新增经验请追加到文件末尾,保持时间倒序或正序均可,但需确保每条经验包含完整的 A/B/C/D 四段。

View File

@@ -0,0 +1,75 @@
# 需求分析 - 2026-04-29-21-51-19
## 需求来源
- 提出时间: 2026-04-29-21-51-19
- 需求类型: 全栈系统改造 / 架构重构
## 原始需求描述
将现有纯前端 React 静态 UI 彻底改造为前后端联动的全栈语义分割系统。打通数据流转,实现:
1. 本地多媒体资产(视频/图片/DCM影像上传
2. 服务器端按帧解析FFmpeg 拆帧)
3. AI 视觉大模型 SAM 3 实时交互式推理点分割、box分割、语义分割
4. 动态图层状态管理
5. 标注数据结构化导出
后端技术栈Python + FastAPI + PostgreSQL + Redis + MinIO
AI 基座SAM 3
输入数据:@Data_MyVideo_1.mp4、@Data_Dicom帧DCM格式
## 需求拆解
### 需求 1: 基础设施部署
- **详细描述**: 在 Ubuntu 22.04 上部署 PostgreSQL、Redis、MinIO 对象存储
- **优先级**: P0-阻塞
- **影响范围**: 系统级服务
- **验收标准**: 三个服务均可访问,有持久化数据目录
### 需求 2: Conda 环境 + SAM 3 模型部署
- **详细描述**: 新建 conda 环境 seg_server安装 PyTorch + CUDA部署 SAM 3 模型权重
- **优先级**: P0-阻塞
- **影响范围**: Python AI 推理层
- **验收标准**: conda 环境可激活GPU 可被 PyTorch 识别SAM 3 权重文件存在
### 需求 3: FastAPI 后端框架搭建
- **详细描述**: 替换现有 Express 后端,建立 FastAPI 服务包含上传、项目、模板、AI推理、导出等模块
- **优先级**: P0-阻塞
- **影响范围**: 后端全部
- **验收标准**: FastAPI 服务可启动Swagger UI 可访问
### 需求 4: 前端状态管理 + 网络层改造
- **详细描述**: 引入 Zustand 全局状态管理Axios 替代 fetchWebSocket 对接解析进度
- **优先级**: P0-阻塞
- **影响范围**: src/ 全部
- **验收标准**: 前端可正常与后端通信,状态跨组件同步
### 需求 5: Canvas Mask 渲染对接
- **详细描述**: Konva Canvas 接收后端 SAM 3 返回的 Mask 数据Polygon/RLE动态渲染遮罩图层
- **优先级**: P1-高
- **影响范围**: CanvasArea.tsx, AISegmentation.tsx
- **验收标准**: 点击画布后,后端返回 Mask前端可正确绘制
### 需求 6: 视频/DCM 解析流水线
- **详细描述**: 上传视频后 FFmpeg 拆帧DCM 影像逐帧提取,进度通过 WebSocket 推送
- **优先级**: P1-高
- **影响范围**: 后端任务模块 + 前端 Dashboard
- **验收标准**: 可上传文件,解析队列可显示进度,帧图片存入 MinIO
### 需求 7: 数据持久化(项目/模板/标注)
- **详细描述**: PostgreSQL 存储项目元数据、本体字典、标注结果MinIO 存储原始媒体/帧/Mask
- **优先级**: P1-高
- **影响范围**: 后端数据库模型 + API
- **验收标准**: 数据重启后仍可读取
## 约束条件
- 使用 Ubuntu 22.04, sudo 密码 Wkmgc
- GPU: RTX 4090, CUDA 13.2
- 无 Docker使用系统包管理 + 二进制部署
- 保持现有前端界面风格(深色主题、中文)
## 风险评估
| 风险点 | 影响 | 缓解措施 |
|--------|------|----------|
| SAM 3 权重下载慢/失败 | 高 | 使用国内镜像源,分段下载验证 |
| PostgreSQL/Redis 端口冲突 | 中 | 检查端口占用,使用非默认端口 |
| MinIO 磁盘空间不足 | 中 | 监控磁盘,配置清理策略 |
| 单次会议工程过大 | 高 | 分模块迭代,先跑通骨架再丰富 |