fix(native): updater Token 不再拖垮非 root 启动(飞牛原生版无法启用)
CI / verify (push) Canceled after 0s

原生版以非 root 的 havline 用户运行,而 app.New 会无条件调用 updater.EnsureToken,
去写默认的 /run/havline-updater/updater.token:MkdirAll 因权限不足失败 →
app.New 返回错误 → main 里 log.Fatalf → 进程秒退,飞牛应用中心报「本地应用启动失败」。
该逻辑由 v1.9.2 引入,v1.9.1 及之前不受影响。

- 新增 updater.EnsureTokenIfEnabled:updater 未启用(socket 为空)时直接返回,
  完全不触碰 Token 文件
- app.New 改用该函数,只有真正启用一键升级 sidecar 时才准备共享 Token
- 补充回归测试:socket 为空不创建文件、socket 非空照旧创建
This commit is contained in:
2026-10-11 15:59:03 +08:00
parent 2856040883
commit a0cc553d2d
3 changed files with 51 additions and 1 deletions
+14
View File
@@ -67,6 +67,20 @@ func EnsureToken(token, tokenFile string) (string, string, error) {
return value, path, nil
}
// EnsureTokenIfEnabled 只在 updater 启用(socket 非空)时准备共享 Token。
//
// updater Token 只服务于「一键升级」sidecar,而 sidecar 与主程序是通过共享卷里的
// Token 文件 + Unix Socket 对接的。原生版(飞牛 Native)与飞牛 Docker 版都显式把
// socket 置空表示「不启用升级」,此时根本不需要这个文件:
// 原生版以非 root 用户(havline)运行,去写 /run/havline-updater 会因权限不足报错,
// 而启动期的这个错误会让整个应用起不来。
func EnsureTokenIfEnabled(socketPath, token, tokenFile string) (string, string, error) {
if strings.TrimSpace(socketPath) == "" {
return "", "", nil
}
return EnsureToken(token, tokenFile)
}
// WaitForToken 等待主程序在共享卷中创建 Token 文件;环境变量已设置时立即返回。
func WaitForToken(token, tokenFile string, timeout time.Duration) (string, string, error) {
if timeout <= 0 {