原子部署
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服务器继续服务旧版本
- 用户不会察觉到切换过程
- 新请求自动路由到新版本
错误处理
部署失败
如果在任何阶段失败:
- 清理失败的发布目录
- 保持当前版本不变
- 记录详细错误信息
- 应用继续正常运行
部分上传
如果文件上传中断:
- 未完成的发布目录被删除
- 当前版本不受影响
- 可以重新开始部署
性能优势
增量部署
只上传变更的文件:
- 首次部署:上传所有文件
- 后续部署:只上传变更的文件
- 大幅减少:网络传输时间
并行处理
支持并行文件上传:
- 多个文件同时传输
- 充分利用带宽
- 减少部署时间
目录结构
完整的部署目录结构:
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"
]
}最佳实践
- 测试部署:先在测试环境验证
- 监控日志:实时监控部署日志
- 备份策略:保留足够的历史版本
- 回滚计划:准备好回滚方案
- 性能监控:监控部署时间和资源使用
故障排除
切换失败
如果符号链接切换失败:
- 检查文件系统权限
- 验证当前目录存在
- 确认没有进程锁定文件
权限问题
确保部署用户有足够权限:
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 # 会自动清理