🎯 MBE Docker部署 - 数据管理策略

📋 概述

MBE系统包含大量数据文件(PDF、训练数据、备份等),不应全部打包到Docker镜像中。本文档说明如何正确管理这些数据。


🚫 不应包含在镜像中的文件

1. PDF文档 (~6GB)

❌ docs/expert/          23个PDF (烹饪、健康等专家知识)
❌ docs/lawyer/          42个PDF (法律文档)
❌ docs/systemdesigninterview/  系统设计PDF
❌ docs/zhengquan/       75个PDF (证券相关)
❌ docs/Modelbuilder/    AI模型论文PDF

原因:

  • 已转换为向量索引(knowledge_bases/*_chunks.json
  • 运行时不需要原始PDF
  • 大幅增加镜像体积

替代方案:

  • 保留在开发环境本地
  • 生产环境使用对象存储(OSS/S3)

2. 备份文件 (~42GB+)

❌ backups/              数据库备份
❌ *.bak                 各种备份文件
❌ *.backup
❌ *.old

原因:

  • 备份应使用专门的备份策略
  • 不应随应用部署

正确做法:

# 使用Docker volume备份
docker exec mbe-postgres pg_dump -U mbe mbe > backup.sql

# 或使用专门的备份服务
docker run --rm \
  --volumes-from mbe-postgres \
  -v $(pwd)/backups:/backup \
  alpine tar czf /backup/pgdata.tar.gz /var/lib/postgresql/data

3. 训练数据 (~10GB+)

❌ training/datasets/    120+ JSON训练数据文件
❌ training/logs/        训练日志
❌ training/checkpoints/moe_step_*.pt  中间检查点
❌ *.pkl                 大型pickle文件

保留项:

✅ training/checkpoints/best/  最终模型
✅ training/*.py               训练脚本

原因:

  • 中间训练数据可以重新生成
  • 只需保留最终模型

4. 日志和报告

❌ reports/              测试报告
❌ logs/                 历史日志
❌ *.log                 所有日志文件
❌ diagnose_*.txt        诊断文件
❌ *_test_report.json    测试报告

正确做法:

  • 日志写入Docker volume
  • 使用日志收集系统(ELK/Loki)

5. 其他大文件

❌ **/*.doc, *.docx      Word文档
❌ **/*.ppt, *.pptx      PPT文档
❌ **/*.zip, *.rar       压缩包
❌ node_modules/         前端依赖
❌ cache/                缓存目录
❌ __pycache__/          Python缓存

✅ 应该包含在镜像中的文件

1. 核心代码 (~50MB)

✅ src/                  Python核心代码
✅ expert-marketplace/   专家市场
✅ mbe-mcp-server/      MCP服务
✅ requirements.txt      Python依赖清单

2. 配置文件 (~5MB)

✅ config/              配置文件
✅ *.json               JSON配置
✅ *.yml, *.yaml        YAML配置

3. 知识库索引 (~10MB)

✅ knowledge_bases/*.json              配置JSON
✅ knowledge_bases/*_chunks.json       向量索引
✅ knowledge_bases/index.json          索引文件
✅ knowledge_bases/permissions.json    权限配置

注意: 只包含JSON索引,不包含原始PDF

4. 初始化脚本

✅ init.sql             数据库初始化
✅ migrations/*.sql     数据库迁移

🔧 Docker Compose配置

开发环境(挂载源代码)

# docker-compose.complete.yml
volumes:
  # ✅ 挂载源代码(支持热重载)
  - ./src:/app/src
  - ./expert-marketplace:/app/expert-marketplace
  
  # ✅ 挂载知识库配置
  - ./knowledge_bases:/app/knowledge_bases
  
  # ✅ 挂载缓存(运行时生成)
  - ./cache:/app/cache
  
  # ❌ 不要挂载大文件
  # - ./docs/expert:/app/docs/expert
  # - ./backups:/app/backups
  # - ./training/datasets:/app/training/datasets

生产环境(最小镜像)

# docker-compose.complete.yml (production)
environment:
  # 使用环境变量配置外部存储
  - KNOWLEDGE_BASE_PATH=/app/knowledge_bases
  - CACHE_PATH=/app/cache
  - DOCUMENTS_OUTPUT=/app/documents

volumes:
  # 只挂载运行时数据
  - cache:/app/cache
  - documents:/app/documents
  
  # 不挂载源代码和大文件

🌐 生产环境数据管理

方案1: 对象存储(推荐)

使用阿里云OSS、AWS S3等:

# .env.production
OSS_PROVIDER=aliyun
OSS_BUCKET=mbe-knowledge-base
OSS_ENDPOINT=https://oss-cn-shenzhen.aliyuncs.com
OSS_ACCESS_KEY=${OSS_ACCESS_KEY}
OSS_SECRET_KEY=${OSS_SECRET_KEY}

# 如果需要PDF原文
ENABLE_PDF_DOWNLOAD=true
PDF_STORAGE_URL=https://mbe-documents.oss-cn-shenzhen.aliyuncs.com

应用代码:

# src/knowledge/storage.py
import oss2

def get_pdf_content(pdf_id):
    # 从OSS下载PDF(如果需要)
    bucket = oss2.Bucket(auth, endpoint, bucket_name)
    return bucket.get_object(f"pdfs/{pdf_id}.pdf")

方案2: NFS/共享存储

# docker-compose.complete.yml
volumes:
  knowledge_base:
    driver: local
    driver_opts:
      type: nfs
      o: addr=nfs-server.example.com,rw
      device: ":/mnt/mbe/knowledge_bases"

方案3: S3挂载(s3fs)

# Dockerfile
RUN apt-get update && apt-get install -y s3fs
volumes:
  - type: volume
    source: s3-knowledge-base
    target: /app/knowledge_bases
    volume:
      driver: s3fs

📊 镜像大小对比

未优化(包含所有文件)

镜像大小: 64GB
构建时间: 30+ 分钟
部署时间: 长
成本: 高

优化后(只包含必要文件)

镜像大小: ~500MB ✅
构建时间: 5-8 分钟 ✅
部署时间: 短 ✅
成本: 低 ✅

🚀 部署流程

1. 开发环境

# 1. 配置环境变量
编辑 .env.development

# 2. 部署(自动挂载源代码)
.\scripts\deploy_complete_development.ps1

# 3. 访问本地文件
# PDF文件在: d:\Mises\mises-behavior-engine\docs\expert\
# 可以直接修改和访问

2. 生产环境

# 1. 上传大文件到对象存储
# - PDF文档上传到OSS
# - 配置OSS访问凭证

# 2. 配置生产环境变量
编辑 .env.production
# 设置OSS配置

# 3. 部署(精简镜像)
.\scripts\deploy_complete_production.ps1

# 4. 应用自动从OSS读取PDF
# 无需包含在镜像中

💡 最佳实践

1. 数据分层

Layer 1: 镜像层(不可变)
  ├─ 源代码
  ├─ 依赖包
  └─ 配置文件

Layer 2: 数据层(可变)
  ├─ 运行时缓存(volume)
  ├─ 生成的文档(volume)
  └─ 日志(volume)

Layer 3: 外部存储(按需)
  ├─ PDF文档(OSS)
  ├─ 训练数据(OSS)
  └─ 备份(专门备份服务)

2. 环境隔离

开发环境:
  - 挂载所有源代码
  - 访问本地大文件
  - 支持热重载

生产环境:
  - 精简镜像
  - 外部存储
  - 性能优化

3. 成本优化

镜像存储:   500MB × 版本数
对象存储:   6GB × 1份(共享)
总成本:     大幅降低 ✅

🔍 验证配置

检查.dockerignore

# 查看会被包含在镜像中的文件
docker build --no-cache -t test-image .
docker run --rm test-image du -sh /*
docker run --rm test-image find /app -name "*.pdf"

# 应该返回空(没有PDF文件)

检查镜像大小

docker images mbe-api

# 应该显示 ~500MB
# 如果超过1GB,说明包含了不必要的文件

⚠️ 常见问题

Q1: 应用找不到PDF文件?

A: 这是正常的!PDF已转换为向量索引:

# 不要直接读取PDF
with open("docs/expert/bread.pdf") as f:  # ❌

# 应该使用向量索引
from knowledge import search_knowledge
results = search_knowledge("面包制作")  # ✅

Q2: 需要原始PDF怎么办?

A: 配置外部存储:

# .env.production
ENABLE_PDF_STORAGE=true
PDF_STORAGE_TYPE=oss  # 或 s3, nfs

# 应用中
from storage import download_pdf
pdf_bytes = download_pdf("bread_master.pdf")

Q3: 训练模型时需要数据集?

A: 使用单独的训练容器:

# docker-compose.training.yml
services:
  trainer:
    volumes:
      - ./training:/app/training  # 挂载完整训练目录
    command: python training/train_moe.py

📚 相关文档


更新时间: 2026-02-01
优化版本: v2.0
镜像大小: ~500MB(从64GB优化)✅

🎉 合理的数据管理让部署更高效! 🚀