[D-05][low] 存储、配置与构建小问题合集:迁移失败反复全量备份、版本号未注入、显式 0 被改回默认、命令行改管理员密码不作废会话 #31

Closed
opened 2026-09-30 13:56:57 +08:00 by nixevol · 1 comment
Owner

编号:D-05 严重级:low 工作线:存储、配置、命令行与部署(internal/store、internal/config、cmd/nixmsg 命令、deploy) 来源:审查 P-23、P-27、P-28
依赖:无 被依赖:无

结论与统一方案

  1. 迁移备份:按版本命名(pre-migrate-v{当前}-to-v{目标}.db),已存在就复用;复制前检查剩余磁盘空间。(审查 P-23)
  2. 版本号:Taskfile 增加 VERSION 变量(默认取 git describe),go build 时加 -ldflags "-X main.Version=…";Dockerfile 加 ARG VERSION 并注入。(审查 P-27)
  3. 配置默认值:去掉 applyEmptyDefaults 对"写 0 有意义"字段的回填;grace_seconds: 0 是按 0 生效还是在 Validate 里报错,二选一并记入 DEVIATIONS;Validate 增加 max_frame_bytes <= 786432。(审查 P-28)
  4. 命令行改管理员密码:nixmsg admin set-password 成功后清空 admin_sessions。这个命令用于忘记密码或密码泄露后的恢复,旧会话应全部作废;它和后台改密"保留当前会话、作废其他会话"不同,命令行没有当前会话。(管理后台审查的待核实项,总审查人确认按此处理)

改动文件

internal/store/migrate.go、Taskfile.yml、taskfiles/q.yml、deploy/Dockerfile、internal/config/config.go、cmd/nixmsg/admin.go。

与其他问题的交互 / 冲突说明

无跨线冲突。若 C-03 新增的迁移先合入,本条的迁移备份命名按新版本号验证。

验收与测试

  • 注入必定失败的迁移连续执行两次,只产生一个备份文件。
  • 构建后 nixmsg version 显示注入的版本号。
  • 显式 grace_seconds: 0 按选定规则处理;max_frame_bytes 超过 786432 时校验失败。
  • set-password 后原会话 Cookie 访问管理接口返回 401。

问题明细(各区审查原文,证据含文件与行号)

以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。

[P-23] 迁移失败时,每次重启都全量备份一次

  • 严重级:low
  • 分类:数据
  • 现象与影响:
    • 有未执行的迁移时,每次启动都会按秒级时间戳生成一份全量备份。
    • 迁移稳定失败时,restart: unless-stopped 会反复重启容器,每次复制整个库,可能写满磁盘。
    • 同一秒内重启还会因为目标文件已存在而直接启动失败。
  • 证据:store/migrate.go:40-44、101-114。
  • 文档依据:DEVELOPMENT 7.7「迁移前先 VACUUM INTO 一份」。
  • 为何不是故意设计:文档只要求迁移前备份,没有考虑反复重启的情况。
  • 解决方案:按版本命名备份文件(pre-migrate-v{当前版本}-to-v{目标版本}.db),已存在就复用;复制前检查剩余磁盘空间。
  • 改动文件:internal/store/migrate.go
  • 与其他模块的交互/冲突风险:无。
  • 需补测试:注入一个必定失败的迁移,连续执行两次只产生一个备份文件。
  • 置信度:代码阅读确定

[P-27] 构建时没注入版本号:镜像和发布的二进制都显示 "dev"

  • 严重级:low
  • 分类:质量
  • 现象与影响:Version 默认是 "dev",Taskfile 和 Dockerfile 都没有注入版本号。hello 响应里的 server_version 和后台概览都显示 dev,和发布标签 0.1.0 对不上。
  • 证据:version.go:9;serve.go:109;Dockerfile:22;Taskfile.yml 的 build 任务。
  • 文档依据:DEVELOPMENT 6.1(hello 响应带 server_version)。
  • 为何不是故意设计:代码里写着"由构建注入",但构建脚本没有注入。
  • 解决方案:Taskfile 增加 VERSION 变量(默认取 git describe),go build 时加 -ldflags "-X main.Version=…";Dockerfile 加 ARG VERSION 并同样注入。
  • 改动文件:Taskfile.yml、taskfiles/q.yml、deploy/Dockerfile
  • 与其他模块的交互/冲突风险:无。
  • 需补测试:构建后执行 nixmsg version,显示注入的版本号。
  • 置信度:代码阅读确定

[P-28] 配置里显式写 0 的字段被静默改回默认;max_frame_bytes 没有上限

  • 严重级:low
  • 分类:质量
  • 现象与影响:
    • grace_seconds: 0 会被改成 60,而 Validate 明确允许 >= 0,运维以为关掉了宽限,其实没有。
    • max_frame_bytes 可以配成 100 万,hello 会按这个值告诉客户端,但 broker 的最大包长写死是 786432,客户端按告知的值发包会被直接断开。
  • 证据:config.go:145-147、188-193、204-206;broker.go:22。
  • 文档依据:DEVELOPMENT 11.1;第 5 节 MaximumPacketSize = 786432。
  • 为何不是故意设计:默认值填充和校验规则互相矛盾,没有记录。
  • 解决方案:
    • Load 已经先填默认值再解析 YAML,没写的字段自然保留默认值;对"写 0 有意义或应当报错"的字段,去掉 applyEmptyDefaults 里的回填。
    • grace 为 0 是按 0 生效还是在 Validate 里报错,二选一,并写进 DEVIATIONS。
    • Validate 增加 max_frame_bytes <= 786432。
  • 改动文件:internal/config/config.go
  • 与其他模块的交互/冲突风险:无。
  • 需补测试:显式写 grace_seconds: 0 按选定规则处理;max_frame_bytes 超过 786432 时校验失败。
  • 置信度:代码阅读确定

复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。

**编号**:D-05 **严重级**:low **工作线**:存储、配置、命令行与部署(internal/store、internal/config、cmd/nixmsg 命令、deploy) **来源**:审查 P-23、P-27、P-28 **依赖**:无 **被依赖**:无 ### 结论与统一方案 1. **迁移备份**:按版本命名(`pre-migrate-v{当前}-to-v{目标}.db`),已存在就复用;复制前检查剩余磁盘空间。(审查 P-23) 2. **版本号**:Taskfile 增加 `VERSION` 变量(默认取 `git describe`),`go build` 时加 `-ldflags "-X main.Version=…"`;Dockerfile 加 `ARG VERSION` 并注入。(审查 P-27) 3. **配置默认值**:去掉 `applyEmptyDefaults` 对"写 0 有意义"字段的回填;`grace_seconds: 0` 是按 0 生效还是在 Validate 里报错,二选一并记入 DEVIATIONS;Validate 增加 `max_frame_bytes <= 786432`。(审查 P-28) 4. **命令行改管理员密码**:`nixmsg admin set-password` 成功后清空 `admin_sessions`。这个命令用于忘记密码或密码泄露后的恢复,旧会话应全部作废;它和后台改密"保留当前会话、作废其他会话"不同,命令行没有当前会话。(管理后台审查的待核实项,总审查人确认按此处理) ### 改动文件 `internal/store/migrate.go`、`Taskfile.yml`、`taskfiles/q.yml`、`deploy/Dockerfile`、`internal/config/config.go`、`cmd/nixmsg/admin.go`。 ### 与其他问题的交互 / 冲突说明 无跨线冲突。若 C-03 新增的迁移先合入,本条的迁移备份命名按新版本号验证。 ### 验收与测试 - 注入必定失败的迁移连续执行两次,只产生一个备份文件。 - 构建后 `nixmsg version` 显示注入的版本号。 - 显式 `grace_seconds: 0` 按选定规则处理;`max_frame_bytes` 超过 786432 时校验失败。 - set-password 后原会话 Cookie 访问管理接口返回 401。 --- ### 问题明细(各区审查原文,证据含文件与行号) > 以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。**解决方案以本 issue 上方的"结论与统一方案"为准**;原文里的方案与之不一致时,按上方执行。 #### [P-23] 迁移失败时,每次重启都全量备份一次 - **严重级**:low - **分类**:数据 - **现象与影响**: - 有未执行的迁移时,每次启动都会按秒级时间戳生成一份全量备份。 - 迁移稳定失败时,`restart: unless-stopped` 会反复重启容器,每次复制整个库,可能写满磁盘。 - 同一秒内重启还会因为目标文件已存在而直接启动失败。 - **证据**:`store/migrate.go:40-44`、`101-114`。 - **文档依据**:DEVELOPMENT 7.7「迁移前先 VACUUM INTO 一份」。 - **为何不是故意设计**:文档只要求迁移前备份,没有考虑反复重启的情况。 - **解决方案**:按版本命名备份文件(`pre-migrate-v{当前版本}-to-v{目标版本}.db`),已存在就复用;复制前检查剩余磁盘空间。 - **改动文件**:`internal/store/migrate.go` - **与其他模块的交互/冲突风险**:无。 - **需补测试**:注入一个必定失败的迁移,连续执行两次只产生一个备份文件。 - **置信度**:代码阅读确定 #### [P-27] 构建时没注入版本号:镜像和发布的二进制都显示 "dev" - **严重级**:low - **分类**:质量 - **现象与影响**:`Version` 默认是 `"dev"`,Taskfile 和 Dockerfile 都没有注入版本号。hello 响应里的 `server_version` 和后台概览都显示 dev,和发布标签 0.1.0 对不上。 - **证据**:`version.go:9`;`serve.go:109`;`Dockerfile:22`;`Taskfile.yml` 的 build 任务。 - **文档依据**:DEVELOPMENT 6.1(hello 响应带 `server_version`)。 - **为何不是故意设计**:代码里写着"由构建注入",但构建脚本没有注入。 - **解决方案**:Taskfile 增加 `VERSION` 变量(默认取 `git describe`),`go build` 时加 `-ldflags "-X main.Version=…"`;Dockerfile 加 `ARG VERSION` 并同样注入。 - **改动文件**:`Taskfile.yml`、`taskfiles/q.yml`、`deploy/Dockerfile` - **与其他模块的交互/冲突风险**:无。 - **需补测试**:构建后执行 `nixmsg version`,显示注入的版本号。 - **置信度**:代码阅读确定 #### [P-28] 配置里显式写 0 的字段被静默改回默认;max_frame_bytes 没有上限 - **严重级**:low - **分类**:质量 - **现象与影响**: - `grace_seconds: 0` 会被改成 60,而 Validate 明确允许 `>= 0`,运维以为关掉了宽限,其实没有。 - `max_frame_bytes` 可以配成 100 万,hello 会按这个值告诉客户端,但 broker 的最大包长写死是 786432,客户端按告知的值发包会被直接断开。 - **证据**:`config.go:145-147`、`188-193`、`204-206`;`broker.go:22`。 - **文档依据**:DEVELOPMENT 11.1;第 5 节 `MaximumPacketSize = 786432`。 - **为何不是故意设计**:默认值填充和校验规则互相矛盾,没有记录。 - **解决方案**: - Load 已经先填默认值再解析 YAML,没写的字段自然保留默认值;对"写 0 有意义或应当报错"的字段,去掉 `applyEmptyDefaults` 里的回填。 - grace 为 0 是按 0 生效还是在 Validate 里报错,二选一,并写进 DEVIATIONS。 - Validate 增加 `max_frame_bytes <= 786432`。 - **改动文件**:`internal/config/config.go` - **与其他模块的交互/冲突风险**:无。 - **需补测试**:显式写 `grace_seconds: 0` 按选定规则处理;`max_frame_bytes` 超过 786432 时校验失败。 - **置信度**:代码阅读确定 --- <sub>复审基线:main `4059a15`(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。</sub>
nixevol added the P3-lowlane/storereview-2026-09-30 labels 2026-09-30 13:56:57 +08:00
Author
Owner

已合入 origin/main 0c9b459。落地提交 57c2f70 fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题 (#31)。

已合入 origin/main `0c9b459`。落地提交 `57c2f70` fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题 (#31)。
Sign in to join this conversation.