docker 交付方案AI设计备份
V1
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端点 -
镜像标签包含版本信息
-
-
版本查询:
# 在应用中暴露版本信息
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 升级脚本执行流程
-
前置检查:环境、版本、兼容性
-
备份:数据库、配置、当前镜像
-
下载:拉取新版本镜像
-
迁移:执行数据库迁移(如有)
-
更新:滚动更新容器
-
验证:健康检查和服务验证
-
清理:清理旧镜像(可选)
七、安全考虑
-
镜像安全:
-
使用官方基础镜像
-
定期更新依赖修复漏洞
-
镜像签名验证(可选)
-
-
数据安全:
-
敏感数据加密存储
-
备份加密
-
访问权限控制
-
-
网络安全:
-
最小端口暴露
-
使用内部网络通信
-
TLS/SSL 加密(生产环境)
-
八、监控与日志
-
日志管理:
-
统一日志格式
-
日志轮转策略
-
日志收集(可选集成 ELK)
-
-
监控指标:
-
容器资源使用
-
应用性能指标
-
健康检查状态
-
九、实施步骤建议
第一阶段:基础容器化
-
创建生产环境 Dockerfile
-
创建生产环境 docker-compose.yml
-
实现基本的启动和健康检查
第二阶段:版本管理
-
实现版本注入机制
-
添加版本查询 API
-
完善版本标签策略
第三阶段:升级机制
-
开发升级脚本
-
实现备份机制
-
测试升级流程
第四阶段:交付优化
-
编写部署文档
-
创建一键部署脚本
-
完善错误处理和日志
第五阶段:测试验证
-
在不同环境测试部署
-
测试升级和回滚流程
-
性能和安全测试
十、注意事项
-
向后兼容:确保升级时 API 和数据结构向后兼容
-
数据迁移:仔细设计数据库迁移策略,确保数据安全
-
零停机:使用滚动更新确保服务连续性
-
文档完善:提供清晰的部署和升级文档
-
测试充分:在生产环境前充分测试所有流程
该方案便于:
-
标准化交付
-
简单升级(一键或脚本化)
-
支持回滚
-
便于维护和管理
V2
针对客户可能无公网 IP 或受限访问的情况,重新设计升级机制,采用客户端主动轮询检查新版本的方案。
以下是适用于客户环境的“客户端主动轮询检查版本”升级方案:
客户端主动轮询升级方案
一、架构设计
1.1 升级流程
客户端应用(定时任务)
↓
定期访问您的版本检查服务器
↓
获取最新版本信息
↓
与本地版本对比
↓
如有新版本 → 提示用户
↓
用户选择升级
↓
下载新版本文件或拉取镜像
↓
执行升级脚本
1.2 关键组件
服务器端(您这边):
-
版本检查 API:提供版本信息的 HTTP 接口
-
版本发布服务:管理版本信息和下载链接
-
镜像仓库:存储 Docker 镜像(可选,如果客户能访问)
客户端(客户环境):
-
版本检查定时任务:定期检查新版本
-
版本信息 API:返回当前运行版本
-
升级提示界面:前端显示更新提示
-
升级脚本:支持手动和自动升级
二、版本检查服务器 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 第一阶段:版本检查功能
服务器端:
-
创建版本检查 API(您的服务器)
-
版本信息管理后台
-
下载链接管理
客户端:
-
版本信息暴露 API(获取当前版本)
-
版本检查定时任务
-
更新信息存储(数据库)
-
前端更新提示界面
7.2 第二阶段:升级功能
-
升级脚本增强(支持多种方式)
-
离线升级包生成脚本
-
升级向导界面(前端)
-
升级日志和回滚机制
7.3 第三阶段:优化
-
升级进度显示
-
自动重试机制
-
升级统计(匿名)
-
升级通知优化
八、配置项设计
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 配置(如果使用)
九、安全考虑
-
版本检查 API
-
HTTPS
-
API 密钥验证(可选)
-
限流
-
-
升级文件验证
-
SHA256 校验
-
GPG 签名(可选)
-
文件完整性检查
-
-
升级过程安全
-
备份验证
-
回滚机制
-
操作日志
-
十、用户体验设计
-
更新提示
-
非强制更新:优雅提示,不打断用户
-
强制更新:明确提示并引导升级
-
-
升级过程
-
进度显示
-
状态反馈
-
错误提示
-
-
升级后
-
版本信息确认
-
新功能引导(可选)
-
方案优势
-
无需公网 IP:客户端主动访问,单向通信即可
-
灵活升级:支持离线包、下载、镜像拉取
-
用户体验:定时检查,及时提示
-
安全可控:文件校验、回滚、操作日志
-
兼容性好:适配不同网络环境
如需,我可以先实现客户端版本检查定时任务和版本信息 API,作为第一步。需要我开始吗?

浙公网安备 33010602011771号