22.13-回滚策略
要点
- 回滚是部署出问题时的紧急恢复手段
- Workers 支持版本回滚,Vercel 也支持
- 数据库的回滚最复杂——需要手动执行反向 SQL
- 回滚策略要提前准备好,不能等出了问题再想
内容
1. 什么时候需要回滚
| 情况 | 严重程度 | 处理方式 |
|---|---|---|
| 新功能有 bug | 中 | 灰度阶段发现,停止灰度 |
| 性能下降 | 中 | 观察后决定是否回滚 |
| 核心功能不可用 | 高 | 立即回滚 |
| 数据损坏 | 紧急 | 回滚 + 从备份恢复 |
| 安全漏洞 | 紧急 | 立即回滚 |
2. Workers 版本回滚
2.1 查看历史版本
// terminal
npx wrangler deployments list2.2 回滚到上一版本
// terminal
npx wrangler deployments rollback2.3 回滚到指定版本
// terminal
npx wrangler deployments rollback --deployment-id=xxxxxxxx2.4 Dashboard 回滚
Cloudflare Dashboard → Workers → 你的 Worker → Deployments → 找到要回滚的版本 → Rollback
3. Vercel 版本回滚
- Vercel Dashboard → 你的项目 → Deployments
- 找到要回滚的部署
- 点击 "..." → "Promote to Production"
4. 数据库回滚
数据库的回滚比代码回滚复杂。D1 没有自动回滚,需要手动执行反向 SQL。
4.1 场景:添加了一个列
-- 迁移
ALTER TABLE users ADD COLUMN avatar_url TEXT;
-- 回滚
ALTER TABLE users DROP COLUMN avatar_url;4.2 场景:创建了一个表
-- 迁移
CREATE TABLE notifications (...);
-- 回滚
DROP TABLE notifications;4.3 场景:修改了数据
-- 迁移
UPDATE users SET status = 'active' WHERE status IS NULL;
-- 回滚需要从备份恢复5. 备份策略
回滚的前提是有备份。
5.1 D1 备份
// terminal
# 导出备份
npx wrangler d1 export ai-agent-production-auth --env production --output=backup.sql
# 从备份恢复
npx wrangler d1 execute ai-agent-production-auth --env production --file=backup.sql也可以在 Dashboard 里操作:D1 → 数据库 → "..." → Export as SQL
5.2 R2 备份
R2 支持版本控制:
// terminal
# 开启版本控制
npx wrangler r2 bucket update ai-agent-avatars --versioning
# 恢复被删除的文件
npx wrangler r2 object get ai-agent-avatars/avatar.jpg --version-id=xxx5.3 定期备份
# .github/workflows/backup.yml
name: Daily Backup
on:
schedule:
- cron: '0 0 * * *' # 每天 UTC 00:00
jobs:
backup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Backup D1
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
run: |
DATE=$(date +%Y%m%d)
npx wrangler d1 export ai-agent-production-auth --env production --output=backup-$DATE.sql
- name: Upload to R2
run: |
npx wrangler r2 object put backups/d1/backup-$DATE.sql --file=backup-$DATE.sql6. 回滚决策树
发现问题
│
├── 是代码问题吗?
│ ├── 是 → 回滚 Workers / Vercel 版本
│ └── 否 ↓
│
├── 是数据库问题吗?
│ ├── 是 → 执行反向迁移 / 从备份恢复
│ └── 否 ↓
│
├── 是配置问题吗?
│ ├── 是 → 修改环境变量 / secrets
│ └── 否 ↓
│
└── 查日志,找根因
7. 回滚的注意事项
- 回滚不会回滚数据库:代码回滚了,但数据库的迁移不会自动撤销
- 回滚不会回滚 secrets:新代码依赖的 secret,回滚后旧代码可能读不到
- 回滚有延迟:全球边缘节点需要几分钟更新
- 回滚前确认:确认问题确实需要回滚,而不是误报
8. 回滚脚本
#!/bin/bash
# scripts/rollback.sh
set -e
echo "=== 回滚到上一版本 ==="
# 1. 确认
read -p "确认要回滚吗?(y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
# 2. 回滚 Workers
echo "回滚 Workers..."
npx wrangler deployments rollback --env production
# 3. 提示 Vercel 回滚
echo "请手动在 Vercel Dashboard 回滚前端"
# 4. 验证
echo "验证回滚..."
sleep 10
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://api.aistudy8.com/health)
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ Workers 回滚成功"
else
echo "❌ Workers 回滚可能有问题"
fi9. 回滚后的复盘
回滚后要做复盘:
- 问题根因:什么导致了问题
- 发现方式:怎么发现的问题(用户报告、监控告警)
- 响应时间:从发现问题到回滚花了多久
- 改进措施:怎么避免下次再发生
10. 小结
回滚策略的核心:
- 代码回滚:Workers 用
wrangler deployments rollback,Vercel 在 Dashboard 操作 - 数据库回滚:手动执行反向 SQL,需要提前备份
- 备份策略:定期备份 D1 和 R2
- 回滚脚本:提前准备好,紧急时直接用
- 复盘:回滚后找出根因,避免再次发生