Skip to content

OTA 自动更新

VOMS 集成了 BanyanHub 中央发版系统,支持后端二进制的 OTA(Over-The-Air)自动更新。管理员在 BanyanHub Dashboard 发布新版本后,运行中的 VOMS 服务会自动检测、下载并完成更新,无需手动登录服务器操作。

工作原理

VOMS Server ──心跳──> BanyanHub API ──检测更新──> 有新版本?
     │                                              │
     │ <────── 返回更新信息(版本号、SHA256、签名) ──┘

     ├── 下载制品(支持断点续传)
     ├── SHA256 + Ed25519 签名校验
     ├── 原子替换二进制(旧版备份为 .bak)
     └── SIGTERM 优雅退出 → systemd 自动重启

关键特性

  • 自动检测:服务运行期间定期心跳上报,发现新版本自动触发更新
  • 安全校验:下载的制品经 SHA256 哈希 + Ed25519 签名双重验证
  • 原子替换:使用 go-selfupdate 原子替换二进制,旧版自动备份为 .bak
  • 自动重启:systemd 服务配置 Restart=always,更新后自动拉起新版本
  • 版本识别:基于二进制 SHA256 哈希自动识别版本号,无需手动配置

更新流程

管理员操作(BanyanHub Dashboard)

  1. 在本地构建新版本二进制
  2. 登录 BanyanHub Dashboard,上传制品(需 SHA256 和 Ed25519 签名)
  3. 将制品标记为"已发布"并设为"最新版本"
  4. 等待 VOMS 服务下次心跳检测到更新

服务端自动执行

  1. 心跳检测 — 定期向 BanyanHub 上报当前版本
  2. 发现更新 — BanyanHub 返回 update_available 信号
  3. 下载制品 — 从 BanyanHub R2 下载新版本二进制
  4. 完整性校验 — SHA256 哈希比对 + Ed25519 签名验证
  5. 原子替换 — 当前二进制备份为 /opt/voms/bin/server.bak,新版本写入 /opt/voms/bin/server
  6. 优雅退出 — 发送 SIGTERM,systemd 自动重启新版本

验证更新状态

bash
# 查看当前运行版本
curl -s http://localhost:8181/api/v1/public/system/health | jq .

# 查看服务状态与启动时间
systemctl status voms-server --no-pager

# 查看最近的 OTA 相关日志
journalctl -u voms-server --no-pager -n 50 | grep -i -E "update|ota|version"

# 确认备份文件存在
ls -la /opt/voms/bin/server.bak

手动回滚

如果新版本出现问题,可以使用 OTA 创建的备份文件快速回滚:

bash
# 1. 停止服务
sudo systemctl stop voms-server

# 2. 用备份替换当前二进制
sudo cp /opt/voms/bin/server.bak /opt/voms/bin/server

# 3. 重启服务
sudo systemctl start voms-server

# 4. 验证
curl -s http://localhost:8181/api/v1/public/system/health | jq .

TIP

OTA 更新时会自动将旧版本备份为 .bak 文件。如果需要保留更多历史版本,建议在更新前手动备份:

bash
sudo cp /opt/voms/bin/server /opt/voms/bin/server.$(date +%Y%m%d%H%M%S)

注意事项

  • OTA 仅更新后端二进制(server),前端资源和 Worker 需要通过发布包更新
  • 更新过程中会有短暂的服务中断(通常 2-5 秒),systemd 会自动重启
  • 如果网络不稳定导致下载失败,SDK 会在下次心跳时重试
  • 许可证状态异常(过期、暂停)时不会触发 OTA 更新

VOMS - 志愿者组织管理系统