docker 交付方案AI设计备份


 V1

基于当前项目结构,Docker 交付和在线升级计划如下:

Docker 交付与在线升级方案

一、总体架构设计

1.1 容器化策略

  • 应用镜像:为 FastAPI 主应用构建独立 Docker 镜像

  • 服务编排:使用 Docker Compose 编排所有服务

  • 数据持久化:数据库、配置文件、日志等使用 Volume 持久化

  • 多环境支持:开发、测试、生产环境使用不同的 Compose 文件

1.2 版本管理策略

  • 镜像标签:使用语义化版本(如 v1.0.0)和 Git Commit SHA(如 v1.0.0-abc1234

  • 版本标识:在镜像内记录版本信息,便于运行时查询

  • 回滚机制:保留历史镜像,支持快速回滚

二、Docker 文件结构规划

aixx/
├── docker/
│   ├── compose.yml             # 开发环境(已有)
│   ├── compose.prod.yml         # 生产环境编排文件(新建)
│   ├── Dockerfile               # 应用镜像构建文件(新建)
│   ├── Dockerfile.multi-stage   # 多阶段构建优化版(可选)
│   ├── .dockerignore           # Docker 构建忽略文件(新建)
│   ├── docker-entrypoint.sh     # 容器启动脚本(新建)
│   ├── upgrade.sh               # 升级脚本(新建)
│   └── healthcheck.sh           # 健康检查脚本(新建)
├── deployment/
│   ├── docker-compose.prod.yml # 客户交付用生产配置(新建)
│   ├── .env.example             # 环境变量模板(新建)
│   ├── upgrade/                 # 升级相关脚本
│   │   ├── upgrade.sh           # 主升级脚本
│   │   ├── rollback.sh         # 回滚脚本
│   │   └── check-version.sh     # 版本检查脚本
│   └── scripts/                 # 部署辅助脚本
│       ├── init.sh             # 初始化脚本
│       └── backup.sh           # 备份脚本
└── docker/
  └── [现有文件保持不变]

三、具体实施方案

3.1 Dockerfile 设计要点

  • 基础镜像:使用 Python 3.11 slim 镜像

  • 构建优化

    • 多阶段构建减少镜像体积

    • 使用 uv 进行依赖安装

    • 分层缓存优化(依赖与代码分离)

  • 安全

    • 非 root 用户运行

    • 最小权限原则

  • 版本注入:构建时注入版本信息到镜像

3.2 Docker Compose 生产配置要点

  • 网络:使用自定义网络隔离

  • 健康检查:所有服务配置健康检查

  • 资源限制:CPU、内存限制

  • 重启策略restart: unless-stopped

  • 环境变量:敏感信息通过 .env 文件管理

  • 数据卷

    • PostgreSQL 数据持久化

    • 日志目录挂载

    • CubeJS 配置持久化

3.3 在线升级机制

升级流程设计:

1. 版本检查
  ├─ 检查当前版本
  ├─ 检查可用新版本
  └─ 检查升级路径兼容性

2. 备份阶段
  ├─ 数据库备份
  ├─ 配置文件备份
  └─ 当前镜像标记保存

3. 升级执行
  ├─ 拉取新版本镜像
  ├─ 执行数据库迁移(如有)
  ├─ 更新配置文件
  ├─ 滚动更新服务(零停机)
  └─ 验证服务健康

4. 回滚准备
  └─ 如升级失败,自动/手动回滚

升级方式选择:

  • 方案A:滚动更新(推荐)

    • 使用 Docker Compose 的滚动更新功能

    • 确保至少有一个实例始终运行

    • 适合生产环境

  • 方案B:蓝绿部署

    • 部署新版本到独立环境

    • 切换流量后停止旧版本

    • 适合大版本升级

  • 方案C:基于版本标签切换

    • 使用 Docker Compose 环境变量指定版本

    • 通过更新 .env 文件切换版本

    • 简单易用,适合小团队

四、关键技术实现点

4.1 版本管理

  • 版本注入

    • 构建时通过 --build-arg 传入版本号

    • 在代码中暴露 /api/version 端点

    • 镜像标签包含版本信息

  • 版本查询

    # 在应用中暴露版本信息
    @app.get("/api/version")
    async def get_version():
       return {
           "version": os.getenv("APP_VERSION", "unknown"),
           "build_time": os.getenv("BUILD_TIME", "unknown"),
           "git_commit": os.getenv("GIT_COMMIT", "unknown")
      }

4.2 健康检查

  • 应用健康检查/health 端点(已有)

  • 数据库连接检查

  • 依赖服务检查(CubeJS、Redis)

  • Docker 健康检查:在 Compose 中配置

4.3 数据迁移处理

  • 数据库迁移脚本:使用 Alembic 或自定义迁移脚本

  • 迁移时机:升级前检查并执行必要的迁移

  • 迁移回滚:保留回滚脚本

4.4 配置管理

  • 环境变量模板:提供 .env.example

  • 配置验证:启动前验证必需配置

  • 配置热更新:支持部分配置无需重启的更新

五、客户交付包设计

5.1 交付包内容

aixx-delivery-v1.0.0/
├── README.md                   # 部署说明
├── QUICKSTART.md               # 快速启动指南
├── docker-compose.yml           # 生产环境编排
├── .env.example                 # 环境变量模板
├── docker/                     # 部署脚本目录
│   ├── init.sh                 # 初始化脚本
│   ├── upgrade.sh             # 升级脚本
│   ├── backup.sh               # 备份脚本
│   └── healthcheck.sh         # 健康检查脚本
├── scripts/                     # 工具脚本
│   ├── setup.sh               # 一键部署脚本
│   └── migrate.sh             # 数据迁移脚本
└── docs/                       # 文档目录
  ├── DEPLOYMENT.md           # 部署文档
  ├── UPGRADE.md             # 升级文档
  └── TROUBLESHOOTING.md     # 故障排查文档

5.2 一键部署脚本功能

  • 环境检查(Docker、Docker Compose 版本)

  • 配置文件生成和验证

  • 数据目录创建和权限设置

  • 服务启动和验证

  • 初始数据导入(可选)

六、升级脚本设计

6.1 升级脚本功能

./upgrade.sh [选项]
 --version VERSION      # 指定升级版本
 --check                # 仅检查可用版本
 --rollback             # 回滚到上一版本
 --force                # 强制升级(跳过检查)
 --dry-run              # 预览模式,不实际执行

6.2 升级脚本执行流程

  1. 前置检查:环境、版本、兼容性

  2. 备份:数据库、配置、当前镜像

  3. 下载:拉取新版本镜像

  4. 迁移:执行数据库迁移(如有)

  5. 更新:滚动更新容器

  6. 验证:健康检查和服务验证

  7. 清理:清理旧镜像(可选)

七、安全考虑

  1. 镜像安全

    • 使用官方基础镜像

    • 定期更新依赖修复漏洞

    • 镜像签名验证(可选)

  2. 数据安全

    • 敏感数据加密存储

    • 备份加密

    • 访问权限控制

  3. 网络安全

    • 最小端口暴露

    • 使用内部网络通信

    • TLS/SSL 加密(生产环境)

八、监控与日志

  1. 日志管理

    • 统一日志格式

    • 日志轮转策略

    • 日志收集(可选集成 ELK)

  2. 监控指标

    • 容器资源使用

    • 应用性能指标

    • 健康检查状态

九、实施步骤建议

第一阶段:基础容器化

  1. 创建生产环境 Dockerfile

  2. 创建生产环境 docker-compose.yml

  3. 实现基本的启动和健康检查

第二阶段:版本管理

  1. 实现版本注入机制

  2. 添加版本查询 API

  3. 完善版本标签策略

第三阶段:升级机制

  1. 开发升级脚本

  2. 实现备份机制

  3. 测试升级流程

第四阶段:交付优化

  1. 编写部署文档

  2. 创建一键部署脚本

  3. 完善错误处理和日志

第五阶段:测试验证

  1. 在不同环境测试部署

  2. 测试升级和回滚流程

  3. 性能和安全测试

十、注意事项

  1. 向后兼容:确保升级时 API 和数据结构向后兼容

  2. 数据迁移:仔细设计数据库迁移策略,确保数据安全

  3. 零停机:使用滚动更新确保服务连续性

  4. 文档完善:提供清晰的部署和升级文档

  5. 测试充分:在生产环境前充分测试所有流程


该方案便于:

  • 标准化交付

  • 简单升级(一键或脚本化)

  • 支持回滚

  • 便于维护和管理

如需,我可以先实现 Dockerfile 和生产环境的 docker-compose.yml 作为第一步。您希望先从哪部分开始?

 

 

V2

V2

针对客户可能无公网 IP 或受限访问的情况,重新设计升级机制,采用客户端主动轮询检查新版本的方案。

以下是适用于客户环境的“客户端主动轮询检查版本”升级方案:

客户端主动轮询升级方案

一、架构设计

1.1 升级流程

客户端应用(定时任务)
  ↓
定期访问您的版本检查服务器
  ↓
获取最新版本信息
  ↓
与本地版本对比
  ↓
如有新版本 → 提示用户
  ↓
用户选择升级
  ↓
下载新版本文件或拉取镜像
  ↓
执行升级脚本

1.2 关键组件

服务器端(您这边):

  1. 版本检查 API:提供版本信息的 HTTP 接口

  2. 版本发布服务:管理版本信息和下载链接

  3. 镜像仓库:存储 Docker 镜像(可选,如果客户能访问)

客户端(客户环境):

  1. 版本检查定时任务:定期检查新版本

  2. 版本信息 API:返回当前运行版本

  3. 升级提示界面:前端显示更新提示

  4. 升级脚本:支持手动和自动升级

二、版本检查服务器 API 设计

2.1 API 接口设计

版本检查端点(您的服务器):

GET https://your-update-server.com/api/v1/version/check
参数:
- current_version: 客户端当前版本(可选)
- product: chatbi(产品标识)

返回:
{
"has_update": true,
"latest_version": "1.0.1",
"current_version": "1.0.0",
"release_notes": "修复了一些bug,新增了XXX功能",
"release_date": "2025-01-15",
"update_type": "minor", // major/minor/patch
"download_urls": {
  "docker_image": "registry.example.com/chatbi:1.0.1",
  "tar_package": "https://example.com/downloads/chatbi-1.0.1.tar.gz",
  "checksum": "https://example.com/downloads/chatbi-1.0.1.sha256"
},
"changelog": "详细的更新日志",
"required": false, // 是否强制升级
"compatibility": {
  "min_current_version": "1.0.0" // 支持从哪个版本升级
}
}

2.2 版本信息管理

版本数据库结构(建议):

CREATE TABLE versions (
id SERIAL PRIMARY KEY,
version VARCHAR(50) UNIQUE NOT NULL,
release_date TIMESTAMP NOT NULL,
update_type VARCHAR(20),  -- major/minor/patch
release_notes TEXT,
changelog TEXT,
download_url_docker TEXT,
download_url_tar TEXT,
checksum_sha256 VARCHAR(64),
required BOOLEAN DEFAULT FALSE,
min_upgrade_version VARCHAR(50),
created_at TIMESTAMP DEFAULT NOW()
);

三、客户端版本检查实现

3.1 客户端版本检查定时任务

实现方式选择:

方案A:应用内后台任务(推荐)

  • 在 FastAPI 启动时启动后台任务

  • 定期访问版本检查 API

  • 将版本信息存储到数据库或缓存

  • 前端通过 API 获取更新提示

方案B:独立的升级检查服务

  • 单独的轻量级容器定期检查

  • 将结果写入共享存储或数据库

  • 主应用读取版本信息

方案C:Systemd Timer / Cron(Linux)或计划任务(Windows)

  • 在主机上配置定时任务

  • 调用检查脚本

  • 将结果写入文件或数据库

3.2 客户端版本检查代码设计

版本检查模块设计:

# chatbi/services/version_check.py
- check_update_available()  # 检查是否有更新
- get_current_version()     # 获取当前版本
- store_update_info()       # 存储更新信息
- schedule_version_check()  # 定时任务

后台定时任务:

# 在应用启动时启动
- 24 小时检查一次(可配置)
- 失败时重试机制
- 检查结果缓存
- 记录检查日志

四、升级方式设计

4.1 升级方式选择

方式1:手动下载升级(适合无公网IP环境)

1. 用户在前端看到更新提示
2. 点击下载按钮,下载新版本包
3. 上传到服务器
4. 执行升级脚本

方式2:自动拉取镜像(适合能访问互联网的环境)

1. 用户确认升级
2. 自动从镜像仓库拉取新版本
3. 执行升级脚本

方式3:离线升级包(最通用)

1. 提供完整的离线升级包(包含镜像文件)
2. 用户下载后,通过脚本导入镜像
3. 执行升级

4.2 升级包结构

离线升级包内容:

aixx-upgrade-v1.0.1/
├── README.md                   # 升级说明
├── CHANGELOG.md                 # 更新日志
├── upgrade.sh                   # 升级脚本
├── rollback.sh                 # 回滚脚本
├── docker-compose.yml           # 新版本编排文件
├── images/                     # Docker 镜像文件
│   ├── aixx-app-v1.0.1.tar   # 应用镜像
│   └── ...                     # 其他依赖镜像(如有更新)
├── migrations/                 # 数据库迁移脚本(如有)
│   └── v1.0.0_to_v1.0.1.sql
└── checksums.sha256             # 校验文件

五、客户端实现细节

5.1 版本信息存储

数据库表设计:

# 版本信息表
class UpdateInfo(Base):
   __tablename__ = "update_info"
   
   id = Column(Integer, primary_key=True)
   latest_version = Column(String(50))      # 最新版本
   current_version = Column(String(50))      # 当前版本
   has_update = Column(Boolean, default=False)
   check_time = Column(DateTime)             # 检查时间
   update_info = Column(JSON)                 # 完整更新信息
   notified = Column(Boolean, default=False)   # 是否已通知用户

5.2 前端更新提示

API 端点(客户端应用提供):

GET /api/v1/update/check        # 手动触发检查
GET /api/v1/update/info         # 获取更新信息
POST /api/v1/update/download    # 触发下载(如果支持)

前端显示:

  • 系统设置页面显示当前版本和最新版本

  • 如有更新,显示更新提示横幅

  • 更新详情弹窗(版本号、更新日志、下载链接)

六、升级脚本增强

6.1 升级脚本功能扩展

支持多种升级方式:

./upgrade.sh [选项]
 --version VERSION        # 指定版本
 --from-file FILE         # 从离线包升级
 --from-url URL           # 从下载链接升级
 --from-registry          # 从镜像仓库拉取
 --check-only             # 仅检查
 --force                  # 强制升级

升级流程:

1. 检查当前版本和环境
2. 根据升级方式获取新版本文件
  ├─ 离线包:解压并加载镜像
  ├─ 下载链接:下载并验证
  └─ 镜像仓库:拉取镜像
3. 验证文件完整性(校验和)
4. 备份数据和配置
5. 执行数据库迁移(如有)
6. 更新容器
7. 健康检查
8. 如失败,自动回滚

七、实施计划

7.1 第一阶段:版本检查功能

服务器端:

  1. 创建版本检查 API(您的服务器)

  2. 版本信息管理后台

  3. 下载链接管理

客户端:

  1. 版本信息暴露 API(获取当前版本)

  2. 版本检查定时任务

  3. 更新信息存储(数据库)

  4. 前端更新提示界面

7.2 第二阶段:升级功能

  1. 升级脚本增强(支持多种方式)

  2. 离线升级包生成脚本

  3. 升级向导界面(前端)

  4. 升级日志和回滚机制

7.3 第三阶段:优化

  1. 升级进度显示

  2. 自动重试机制

  3. 升级统计(匿名)

  4. 升级通知优化

八、配置项设计

8.1 客户端配置

环境变量或配置文件:

# 版本检查配置
VERSION_CHECK_ENABLED=true           # 是否启用版本检查
VERSION_CHECK_INTERVAL=86400         # 检查间隔(秒,默认24小时)
VERSION_CHECK_SERVER=https://your-update-server.com  # 版本检查服务器
VERSION_CHECK_TIMEOUT=10             # 请求超时(秒)
VERSION_CHECK_RETRY=3                # 失败重试次数

# 升级配置
UPGRADE_DOWNLOAD_DIR=/data/upgrades  # 升级包存储目录
UPGRADE_AUTO_ENABLED=false           # 是否自动升级(建议关闭)

8.2 服务器端配置

版本发布配置:

  • 版本号管理规则(语义化版本)

  • 下载链接生成

  • 镜像仓库配置

  • CDN 配置(如果使用)

九、安全考虑

  1. 版本检查 API

    • HTTPS

    • API 密钥验证(可选)

    • 限流

  2. 升级文件验证

    • SHA256 校验

    • GPG 签名(可选)

    • 文件完整性检查

  3. 升级过程安全

    • 备份验证

    • 回滚机制

    • 操作日志

十、用户体验设计

  1. 更新提示

    • 非强制更新:优雅提示,不打断用户

    • 强制更新:明确提示并引导升级

  2. 升级过程

    • 进度显示

    • 状态反馈

    • 错误提示

  3. 升级后

    • 版本信息确认

    • 新功能引导(可选)


方案优势

  1. 无需公网 IP:客户端主动访问,单向通信即可

  2. 灵活升级:支持离线包、下载、镜像拉取

  3. 用户体验:定时检查,及时提示

  4. 安全可控:文件校验、回滚、操作日志

  5. 兼容性好:适配不同网络环境

如需,我可以先实现客户端版本检查定时任务和版本信息 API,作为第一步。需要我开始吗?

 

 

posted @ 2025-11-02 21:48  飞丸亻  阅读(12)  评论(0)    收藏  举报