Files
asd-backend/docs/BLUE-GREEN-DEPLOY.md

4.3 KiB
Raw Blame History

蓝绿部署计划

域名与环境映射

域名                 环境        后端端口        数据库
────────────────────────────────────────────────────
dev.xmclassmate.top  开发/测试   :8080          milkydata_dev
xmclassmate.top      生产        :4433 / :4434  milkydata_dev

原则:两个域名永远指向各自的环境,不互换。生产采用蓝绿部署实现零停机。

当前问题

单实例部署时存在停机时间:

停止服务 → 上传新代码 → 重启服务 → 跑迁移
           ↑
     3-5 秒停机

开发环境dev.xmclassmate.top

保持单实例,无需蓝绿:

dev.xmclassmate.top
       │
  OpenResty → :8080单实例
       │
  milkydata_dev

开发环境不需要蓝绿的原因:

原因 说明
停机时间可接受 仅开发者使用,重启 3-5 秒无影响
简化运维 少维护一套 systemd service
快速迭代 直接 deploy.sh development 部署

生产环境xmclassmate.top— 蓝绿部署

架构

xmclassmate.top
       │
  OpenResty proxy
    /          \
蓝色 :4433    绿色 :4434
(active)      (idle)
    \          /
  milkydata_dev共享

任何时候只有一个实例接收流量,另一个运行旧版本待命,切换零停机。

组件

systemd service

/etc/systemd/system/
├── rust-backend-blue.service    ← :4433
└── rust-backend-green.service   ← :4434

两个 service 的 DATABASE_URL 都指向 milkydata_dev,仅端口不同。

OpenResty proxy 配置:

# /www/sites/xmclassmate.top/proxy/root.conf
location ^~ / {
    proxy_pass http://127.0.0.1:4433;  # deploy.sh 切换此端口
}

切换时 sed 替换端口,nginx -s reload

部署流程

初始:蓝色(:4433)=active  绿色(:4434)=idle

步骤 1部署到空闲环境绿色
  ① cargo build --release
  ② rsync 二进制 → 绿色目录
  ③ systemctl restart rust-backend-green.service
  ④ 运行数据库迁移

步骤 2验证绿色环境
  curl http://127.0.0.1:4434/health
  run_tests

步骤 3切换流量
  sed 修改 proxy_pass → 127.0.0.1:4434
  nginx -s reload

步骤 4验证
  curl https://xmclassmate.top/health

结果:绿色(:4434)=active  蓝色(:4433)=idle
      下次部署到蓝色

切换脚本

./scripts/switch-env.sh --env prod --switch green
# 或切回蓝色
./scripts/switch-env.sh --env prod --switch blue

回滚

./scripts/switch-env.sh --env prod --switch blue  # 即时恢复旧版本

旧环境代码未变,无需重新部署。

数据库

环境 数据库 说明
开发 milkydata_dev 单实例直连
生产 milkydata_dev 蓝绿实例共享,名称不变

当前开发与生产共用 milkydata_dev。后续建议拆分为 milkydata_prod

迁移注意事项

蓝绿共享数据库,迁移需向前兼容:

迁移类型 兼容 说明
CREATE TABLE 新旧代码均可运行
ADD COLUMN DEFAULT 或允许 NULL
RENAME COLUMN 旧代码查询旧列名会失败
DROP COLUMN 旧代码查询被删列会失败

不兼容的迁移需要三段式部署。

实施优先级

阶段 内容 工作量
P1 创建 blue + green 两个 systemd service
P2 编写 deploy-blue-green.sh + switch-env.sh
P3 实现 OpenResty proxy 配置切换
P4 改造 deploy.sh 支持 --blue-green
P5 不兼容迁移的三段式部署文档
P6 回滚文档

生产上线待办

# 步骤 说明 状态
1 数据迁移 milkydatamilkydata_dev 已完成
2 准备生产 service 文件(填入实际密钥) 待完成
3 部署新代码到 :4433 待完成
4 env.tsCURRENT_ENV = 'production' 已完成
5 微信开发者工具上传小程序 待完成
6 1Panel 确认 proxy_pass 指向 :4433 待完成

当前是否实施

当前暂未实施蓝绿。先实现 P1-P2 后启用。