Skip to content

原子部署

Shipfe 的核心特性:零停机、原子化的部署流程。

什么是原子部署

原子部署意味着部署要么完全成功,要么完全失败,没有中间状态。这确保了应用在部署过程中的稳定性。

部署流程

传统部署 vs 原子部署

传统部署

上传文件 → 覆盖现有文件 → 重启服务
❌ 如果上传中断,应用可能处于损坏状态

原子部署

创建新目录 → 上传到新目录 → 原子切换符号链接 → 清理旧版本
✅ 始终有一个可用的版本

详细流程

1. 准备阶段

Shipfe 创建一个时间戳命名的发布目录:

releases/
└── 20260304_120000/  # 新发布目录

2. 上传阶段

所有文件上传到新目录:

bash
# 上传构建产物
scp -r ./dist/* user@server:/var/www/myapp/releases/20260304_120000/

3. 验证阶段

验证上传的文件完整性:

  • 检查文件大小
  • 验证文件权限
  • 运行健康检查(如果配置)

4. 切换阶段

原子化切换当前版本:

bash
# 在服务器上执行
ln -sfn releases/20260304_120000 current

这个操作是原子的,瞬间完成。

5. 清理阶段

清理旧版本(根据配置):

bash
# 删除超出限制的旧版本
rm -rf releases/20260303_100000/

零停机保证

符号链接切换

使用符号链接而不是直接覆盖文件:

current -> releases/20260304_120000  # 新版本
current -> releases/20260304_110000  # 旧版本(仍然可用)

回滚能力

如果新版本有问题,可以立即回滚:

bash
# 切换回旧版本
ln -sfn releases/20260304_110000 current

无缝切换

  • Web服务器继续服务旧版本
  • 用户不会察觉到切换过程
  • 新请求自动路由到新版本

错误处理

部署失败

如果在任何阶段失败:

  1. 清理失败的发布目录
  2. 保持当前版本不变
  3. 记录详细错误信息
  4. 应用继续正常运行

部分上传

如果文件上传中断:

  • 未完成的发布目录被删除
  • 当前版本不受影响
  • 可以重新开始部署

性能优势

增量部署

只上传变更的文件:

  • 首次部署:上传所有文件
  • 后续部署:只上传变更的文件
  • 大幅减少:网络传输时间

并行处理

支持并行文件上传:

  • 多个文件同时传输
  • 充分利用带宽
  • 减少部署时间

目录结构

完整的部署目录结构:

remote_deploy_path/
├── current -> releases/20260304_120000  # 当前活动版本
├── releases/                           # 所有历史版本
│   ├── 20260304_120000/               # 最新版本
│   │   ├── index.html
│   │   ├── app.js
│   │   └── styles.css
│   ├── 20260304_110000/               # 上一版本
│   └── 20260304_100000/               # 更早版本
└── shared/                            # 共享资源(可选)
    └── assets/

配置选项

保留版本数量

json
{
  "keep_releases": 5
}

控制保留的历史版本数量。设置为 1 表示只保留最新版本。

监控和日志

部署日志

每次部署都会记录详细日志:

2026-03-04 12:00:00 INFO  Starting deployment
2026-03-04 12:00:01 INFO  Created release directory: releases/20260304_120000
2026-03-04 12:00:05 INFO  Uploaded 150 files (45.2 MB)
2026-03-04 12:00:06 INFO  Switched to new release
2026-03-04 12:00:07 INFO  Deployment completed successfully

健康检查

配置部署后的健康检查:

json
{
  "post_deploy_commands": [
    "curl -f http://localhost/health || exit 1"
  ]
}

最佳实践

  1. 测试部署:先在测试环境验证
  2. 监控日志:实时监控部署日志
  3. 备份策略:保留足够的历史版本
  4. 回滚计划:准备好回滚方案
  5. 性能监控:监控部署时间和资源使用

故障排除

切换失败

如果符号链接切换失败:

  • 检查文件系统权限
  • 验证当前目录存在
  • 确认没有进程锁定文件

权限问题

确保部署用户有足够权限:

bash
# 检查目录权限
ls -la /var/www/myapp/

# 修复权限
chown -R deploy:deploy /var/www/myapp/
chmod -R 755 /var/www/myapp/

磁盘空间

监控磁盘使用情况:

bash
# 检查磁盘空间
df -h /var/www/myapp/

# 清理旧版本
shipfe deploy  # 会自动清理