223 lines
4.4 KiB
Markdown
223 lines
4.4 KiB
Markdown
# 版本升级流程
|
||
|
||
## 概述
|
||
|
||
本文介绍版本升级标准流程,包括升级前准备、执行步骤、验证检查和回滚方案。遵循规范的升级流程可最大程度降低线上风险。
|
||
|
||
:::tip 升级原则
|
||
1. 先备份,后升级
|
||
2. 先测试环境,后生产环境
|
||
3. 每次升级可回滚
|
||
4. 低峰期执行升级
|
||
:::
|
||
|
||
## 升级前准备
|
||
|
||
### 备份
|
||
|
||
```bash
|
||
# 1. 数据库全量备份
|
||
mysqldump -h 127.0.0.1 -u root -p --single-transaction \
|
||
djangoadmin_prod | gzip > backup_$(date +%Y%m%d_%H%M%S).sql.gz
|
||
|
||
# 2. 上传文件备份
|
||
tar -czf uploads_$(date +%Y%m%d).tar.gz /data/apps/uploads/
|
||
|
||
# 3. 应用目录备份(含 .env 和配置)
|
||
tar -czf app_$(date +%Y%m%d).tar.gz \
|
||
--exclude='uploads' --exclude='__pycache__' --exclude='.git' \
|
||
/data/apps/
|
||
```
|
||
|
||
### 查看变更日志
|
||
|
||
```bash
|
||
# 查看当前版本
|
||
git describe --tags --always
|
||
|
||
# 查看提交记录
|
||
git log --oneline -20
|
||
|
||
# 查看变更文件
|
||
git diff --stat HEAD~10
|
||
```
|
||
|
||
:::tip 重点关注
|
||
- 是否有数据库结构变更(Flask-Migrate 迁移脚本)
|
||
- 是否有 `.env` 新增配置项
|
||
- 是否有依赖包更新(requirements.txt)
|
||
- 是否有破坏性变更(Breaking Changes)
|
||
:::
|
||
|
||
## 标准升级步骤
|
||
|
||
### 步骤一:拉取代码
|
||
|
||
```bash
|
||
cd /data/apps/djangoadmin
|
||
|
||
# 拉取最新代码
|
||
git fetch origin
|
||
git pull origin main
|
||
|
||
# 或切换到指定版本
|
||
git checkout v1.2.0
|
||
```
|
||
|
||
### 步骤二:更新依赖
|
||
|
||
```bash
|
||
# 激活虚拟环境
|
||
source venv/bin/activate
|
||
|
||
# 更新依赖
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 步骤三:更新配置
|
||
|
||
```bash
|
||
# 检查是否有新增的 .env 配置项
|
||
git diff HEAD~1 .env.example
|
||
|
||
# 如有新增项,手动添加到 .env
|
||
vim .env
|
||
```
|
||
|
||
### 步骤四:执行数据库迁移
|
||
|
||
```bash
|
||
# 查看待执行的迁移
|
||
flask db current
|
||
flask db history
|
||
|
||
# 执行迁移
|
||
flask db upgrade
|
||
|
||
```
|
||
|
||
:::warning 迁移前确认
|
||
- 迁移脚本需提前在测试环境验证
|
||
- 确认迁移不会锁表影响线上服务
|
||
- 大表结构变更建议在低峰期执行
|
||
:::
|
||
|
||
### 步骤五:重启服务
|
||
|
||
```bash
|
||
# Supervisor 管理
|
||
sudo supervisorctl restart djangoadmin-flask
|
||
|
||
# Docker 部署
|
||
docker-compose down && docker-compose up --build -d
|
||
|
||
# Systemd 管理
|
||
sudo systemctl restart djangoadmin-flask
|
||
```
|
||
|
||
### 步骤六:验证
|
||
|
||
```bash
|
||
# 1. 检查服务状态
|
||
sudo supervisorctl status djangoadmin-flask
|
||
|
||
# 2. 检查健康端点
|
||
curl -s http://127.0.0.1:8021/health | python -m json.tool
|
||
|
||
# 3. 检查日志
|
||
tail -f /data/apps/logs/supervisor.out.log
|
||
|
||
# 4. 验证核心功能
|
||
# - 登录接口
|
||
# - 列表查询接口
|
||
# - 新增/编辑/删除接口
|
||
```
|
||
|
||
## 回滚方案
|
||
|
||
### 代码回滚
|
||
|
||
```bash
|
||
# 回退到上一个版本
|
||
git checkout HEAD~1
|
||
|
||
# 或回退到指定版本
|
||
git checkout v1.1.0
|
||
|
||
# 重新安装依赖
|
||
pip install -r requirements.txt
|
||
|
||
# 重启服务
|
||
sudo supervisorctl restart djangoadmin-flask
|
||
```
|
||
|
||
### 数据库回滚
|
||
|
||
```bash
|
||
# 回滚最近一次迁移
|
||
flask db downgrade -1
|
||
|
||
# 回滚到指定版本
|
||
flask db downgrade <revision_id>
|
||
|
||
# 查看可用版本
|
||
flask db history
|
||
```
|
||
|
||
### 完整回滚
|
||
|
||
```bash
|
||
# 1. 停止服务
|
||
sudo supervisorctl stop djangoadmin-flask
|
||
|
||
# 2. 恢复应用目录
|
||
cd /data/apps/
|
||
tar -xzf app_20260905.tar.gz
|
||
|
||
# 3. 恢复数据库
|
||
gunzip < backup_20260905.sql.gz | mysql -u root -p djangoadmin_prod
|
||
|
||
# 4. 恢复上传文件
|
||
tar -xzf uploads_20260905.tar.gz -C /
|
||
|
||
# 5. 启动服务
|
||
sudo supervisorctl start djangoadmin-flask
|
||
```
|
||
|
||
## 灰度升级策略
|
||
|
||
对于重要生产环境,建议采用灰度升级:
|
||
|
||
```
|
||
1. 部署新版本到 1 台服务器
|
||
2. Nginx 将 10% 流量切到新版本
|
||
3. 观察 30 分钟,无异常后逐步增加流量
|
||
4. 流量 100% 切到新版本
|
||
5. 下线旧版本
|
||
```
|
||
|
||
```nginx
|
||
# Nginx 灰度配置
|
||
upstream backend {
|
||
server 10.0.1.10:8021 weight=9; # 旧版本 90%
|
||
server 10.0.1.11:8021 weight=1; # 新版本 10%
|
||
}
|
||
```
|
||
|
||
## 升级检查清单
|
||
|
||
- [ ] 升级前已完成数据库备份
|
||
- [ ] 升级前已完成应用目录备份
|
||
- [ ] 变更日志已审查,了解所有变更
|
||
- [ ] 新增 `.env` 配置项已添加
|
||
- [ ] 数据库迁移已在测试环境验证
|
||
- [ ] 依赖包已更新
|
||
- [ ] 服务已重启
|
||
- [ ] 健康检查通过
|
||
- [ ] 核心功能验证通过
|
||
- [ ] 日志无异常报错
|
||
|
||
## 总结
|
||
|
||
版本升级的核心流程:备份 → 拉代码 → 更新依赖 → 更新配置 → 数据库迁移 → 重启 → 验证。每一步都需要可回滚,完整回滚方案应提前准备并验证。生产环境建议在低峰期执行,重要系统采用灰度升级策略。
|