00 / 00

自动更新

为 01MVP Desktop 配置 Tauri updater、签名产物和更新端点

桌面自动更新要三样东西:签名后的安装产物、可访问的更新端点、应用内 updater 配置。模板默认保留 TypeScript wrapper,但没启用 Rust updater plugin——发布端点和签名公钥得由具体产品提供。

官方文档:Tauri updater

用户需要先准备什么

自动更新上线前,先把这些问题定下来:

准备项用途备注
更新域名App 请求更新端点建议使用稳定独立域名或子路径
安装包存储存放各平台 release assetsR2、S3、GitHub Releases 或自建下载服务都可以
updater key pair签名和验证更新包私钥只放 CI secret;公钥写进 App 配置
版本策略决定什么时候提示更新至少区分 preview 和 production
回滚方案新版本出问题时快速停止分发endpoint 可以返回旧版本或 no update
发布说明给用户说明变化也用于“检查更新”结果页

如果还没有稳定下载域名和 updater 私钥,先保留“检查更新不可用”的状态。不要用临时 URL 做生产更新源。

为什么模板不默认开 updater

自动更新不只是前端按一个按钮。它需要:

  • 真实发布域名
  • 签名公钥和私钥
  • 每个平台的安装包
  • 更新 manifest 或 endpoint
  • 版本号策略
  • 回滚和失败处理

如果模板提前写个假 endpoint,应用启动时反而容易挂。当前做法是 src/runtime/updater.ts 保留入口;未配置时返回 unavailable。

启用 updater 要改哪里

要改这些:

文件作用
products/01mvp/apps/desktop/package.json保留 @tauri-apps/plugin-updater
products/01mvp/apps/desktop/src-tauri/Cargo.toml添加 tauri-plugin-updater
products/01mvp/apps/desktop/src-tauri/src/lib.rs注册 updater plugin
products/01mvp/apps/desktop/src-tauri/capabilities/default.json开放 updater 权限
products/01mvp/apps/desktop/src-tauri/tauri.conf.json配置 endpoints、pubkey、更新产物
发布服务提供 update endpoint 和安装包下载地址

生成 updater key

Tauri updater 需要签名密钥。按官方命令生成:

pnpm exec tauri signer generate --write-keys

私钥只放在 CI secret 或本机安全位置。公钥写进 tauri.conf.json

别把 updater 私钥提交到仓库。

配置 Tauri

示例结构:

{
  "bundle": {
    "createUpdaterArtifacts": true
  },
  "plugins": {
    "updater": {
      "endpoints": [
        "https://updates.example.com/{{target}}/{{arch}}/{{current_version}}"
      ],
      "pubkey": "YOUR_PUBLIC_KEY"
    }
  }
}

endpoint 可以是静态 JSON,也可以是服务端 API。推荐服务端 API,它能按平台、架构、渠道和版本返回不同结果。

更新端点该返回什么

至少要能表达:

  • 是否有新版本
  • 新版本号
  • 下载 URL
  • 签名
  • release notes
  • 平台和架构

发布服务放 Cloudflare Worker、Hono API 或其他后端都行。安装包放 R2、S3、GitHub Releases 或对象存储。闭源产品用 Worker + R2 更容易控制访问、缓存、灰度和下载统计。

应用内检查更新

模板入口在:

products/01mvp/apps/desktop/src/runtime/updater.ts

启用 Rust updater plugin 后,checkForDesktopUpdate() 可以返回:

status含义
available有新版本
none当前版本已是最新
unavailable当前构建没有配置 updater
failed检查失败

UI 先只提供”检查更新”按钮就够了。自动下载和安装等发布流程稳定后再加。

验收清单

启用自动更新后,至少验这些:

  • 没有新版本时返回 up to date
  • 有新版本时返回正确版本号和 notes
  • 下载 URL 可访问
  • 签名校验通过
  • 旧版本能更新到新版本
  • macOS、Windows、Linux 分别验证
  • endpoint 失败时 UI 不崩溃
  • 没有配置 updater 的开发构建能正常启动

自动化边界

CI 可以负责构建、签名、上传安装包、生成更新签名和发布 manifest。下面这些仍然需要用户先准备:

  • updater 私钥放进 CI secret,不能进仓库
  • 下载域名和对象存储已经可访问
  • preview / production 的 endpoint 分开
  • 旧版本安装包仍然能下载,方便回滚和对比测试
  • 每次发布后用旧版本真实安装包验证“检查更新 -> 下载 -> 安装”

常见问题

为什么不能直接用私有 GitHub Release

用户机器上的桌面应用不该内置 GitHub token。私有 Release 直接当 updater 源会有认证和泄漏风险。更稳的做法是后端服务决定是否允许下载,再把短期可访问的安装包地址返回给客户端。

dev 构建需要自动更新吗

通常不需要。dev 构建主要用于调试。自动更新应该在 preview 或 production 渠道里测试。

updater 权限要一次性全开吗

先按需求开放。只做检查时,优先开放 check。等下载和安装流程准备好后,再开放完整权限。

这篇文档有问题?