跳转到主要内容

冯若航

SOW 与 Pigsty 的作者;PostgreSQL 基础设施、软件交付,以及夹在两者中间的那些工具。

冯若航(@Vonng)编写 SOW,以及它为之构建软件仓库的 PostgreSQL 发行版 Pigsty

SOW 起于交付问题,而不是打包问题。Pigsty 要在 Enterprise Linux、Debian 与 Ubuntu 上分发 数百个 RPM 与 DEB 软件包;而「此刻仓库里到底有什么、是谁放进去的」,诚实的答案只是一份目录 列表加一段 shell 历史。把成员关系、不可变 Generation、签名与发布都变成显式状态,这个问题 才有了工具可以直接回答的答案;一次仓库重建,也从「一夜之间冒出来的一批文件」变成了可审计的 发布边界。

  • SOW v0.4.0

    Vonng 发布于 发布注记 2263 字 5 分钟

    VonngReleasereleasemanagedsigningpublishmigration

    SOW v0.4.0

    SOW 0.4.0 是一次面向 Managed 仓库的完整性与恢复版本:它明确了深度校验的 I/O 契约, 禁止跨无关密钥拼装 RPM 信任,提供可审计的发布目标可变配置修正路径,并补齐 v0.3 迁移与 发布中断恢复的剩余缺口。 Plain 仓库行为与公共 pool/ + dists/ 布局均未改变。 从 0.3 升级 必须逐个显式迁移 v0.3 Repository 先停止全部 Workspace 写入并完成备份,再安装 0.4.0;在执行普通读写命令之前,对每个 Repository 运行 …

    SOW 0.4.0 是一次面向 Managed 仓库的完整性与恢复版本:它明确了深度校验的 I/O 契约, 禁止跨无关密钥拼装 RPM 信任,提供可审计的发布目标可变配置修正路径,并补齐 v0.3 迁移与 发布中断恢复的剩余缺口。 Plain 仓库行为与公共 pool/ + dists/ 布局均未改变。 从 0.3 升级 必须逐个显式迁移 v0.3 Repository 先停止全部 Workspace 写入并完成备份,再安装 0.4.0;在执行普通读写命令之前,对每个 Repository 运行 …

  • 协同发布决策记录

    Vonng 发布于 设计归档 1452 字 3 分钟

    VonngDesignpublishtransactionobject-storagedecision

    协同发布决策记录

    SOW 0.4.0 已完成最终决策 本记录的早期版本曾提议采用 rclone Executor、publish --dry-run 与独立 sow audit 命令。这些表面均未进入 0.4.0:SOW 不依赖 rclone,publish 没有 --dry-run,sow audit 也不是有效命令。 本页保留决策边界,避免历史提案被误解为当前产品。规范行为以 sow publish与 发布与恢复为准。 最终决策 SOW 0.4.0 保留原生 filesystem 与 r2 发布 …

    SOW 0.4.0 已完成最终决策 本记录的早期版本曾提议采用 rclone Executor、publish --dry-run 与独立 sow audit 命令。这些表面均未进入 0.4.0:SOW 不依赖 rclone,publish 没有 --dry-run,sow audit 也不是有效命令。 本页保留决策边界,避免历史提案被误解为当前产品。规范行为以 sow publish与 发布与恢复为准。 最终决策 SOW 0.4.0 保留原生 filesystem 与 r2 发布 …

  • SOW 设计演进:从 Route Graph 收敛到 Repository Core

    Vonng 发布于 设计归档 2241 字 5 分钟

    VonngDesignarchitecturerepositorymigrationdecision

    SOW 设计演进:从 Route Graph 收敛到 Repository Core

    本文对应 2026-08-10 围绕 Repository Core 完成的 SOW 收敛决策。它从早期规划、ADR、评审、 迁移与验证目录中提炼值得维护的结论,但不会把每份过程制品都变成另一套产品文档。 部分封存目录使用“v0.2”“v0.3”表示连续的发布前设计线;下文版本号只指正式 Git Tag。 C2 硬链接开发线在 v0.2.0 打 Tag 之前已经被替换。 简要历史 版本线 设计中心 历史状态 v0.1 Git/CAS 所有权、Route-aware …

    本文对应 2026-08-10 围绕 Repository Core 完成的 SOW 收敛决策。它从早期规划、ADR、评审、 迁移与验证目录中提炼值得维护的结论,但不会把每份过程制品都变成另一套产品文档。 部分封存目录使用“v0.2”“v0.3”表示连续的发布前设计线;下文版本号只指正式 Git Tag。 C2 硬链接开发线在 v0.2.0 打 Tag 之前已经被替换。 简要历史 版本线 设计中心 历史状态 v0.1 Git/CAS 所有权、Route-aware …

  • SOW v0.3.0

    Vonng 发布于 发布注记 1682 字 4 分钟

    VonngReleasereleaseplainmanagedtransaction

    SOW v0.3.0

    SOW 0.3.0 围绕性能、持久性与产品边界完成了一次集中改进:Plain 仓库生成只需一遍包体处理; Managed 仓库消除了逐对象成员查询,复用经过认证的软件包事实,并用有界组提交提升载荷。正式 交付的二进制与发布流水线也统一收敛到 SOW 实际支持的仓库工作流。 Plain:一遍完成包体处理 默认无签名 sow create 路径通过 --jobs 控制并行度,每个 RPM 或 DEB 只做一次哈希与解析, 随后直接利用保留的检查结果渲染元数据。发布前只做最后一次软件包集合与文件 …

    SOW 0.3.0 围绕性能、持久性与产品边界完成了一次集中改进:Plain 仓库生成只需一遍包体处理; Managed 仓库消除了逐对象成员查询,复用经过认证的软件包事实,并用有界组提交提升载荷。正式 交付的二进制与发布流水线也统一收敛到 SOW 实际支持的仓库工作流。 Plain:一遍完成包体处理 默认无签名 sow create 路径通过 --jobs 控制并行度,每个 RPM 或 DEB 只做一次哈希与解析, 随后直接利用保留的检查结果渲染元数据。发布前只做最后一次软件包集合与文件 …

  • 设计原则

    Vonng 发布于 设计归档 1208 字 3 分钟

    VonngDesignplainmanagedrepository

    设计原则

    SOW 首先不是一个“元数据生成器”,而是一个所有权与状态迁移系统,只是它的输出恰好是 APT 与 RPM 仓库。下面这些原则让整套系统保持可推理。 每个持久事实只有一个主人 每类持久事实都只有一个作用域与权威: 事实 所有者 包体与软件包身份 Repository Desired 成员关系与 Built 状态 Repository Generation 与 Changeset Repository 发布目标绑定与 Revision Repository + Target …

    SOW 首先不是一个“元数据生成器”,而是一个所有权与状态迁移系统,只是它的输出恰好是 APT 与 RPM 仓库。下面这些原则让整套系统保持可推理。 每个持久事实只有一个主人 每类持久事实都只有一个作用域与权威: 事实 所有者 包体与软件包身份 Repository Desired 成员关系与 Built 状态 Repository Generation 与 Changeset Repository 发布目标绑定与 Revision Repository + Target …

  • 系统模型

    Vonng 发布于 设计归档 1167 字 3 分钟

    VonngDesignrepositorydistpoolgeneration

    系统模型

    SOW 刻意把模型分层:配置表达意图,数据库记录有主状态,公共树是确定性投影。 任何一层都不能悄悄替代另一层。 对象层级 Workspace ├── Repository │ ├── Package Object │ ├── Dist │ │ └── Membership -> Package Object │ ├── Desired 状态 │ ├── Built Generation │ └── Retained Generation 引用 └── Publication Target └── …

    SOW 刻意把模型分层:配置表达意图,数据库记录有主状态,公共树是确定性投影。 任何一层都不能悄悄替代另一层。 对象层级 Workspace ├── Repository │ ├── Package Object │ ├── Dist │ │ └── Membership -> Package Object │ ├── Desired 状态 │ ├── Built Generation │ └── Retained Generation 引用 └── Publication Target └── …

  • 发布与恢复

    Vonng 发布于 设计归档 1681 字 4 分钟

    VonngDesignpublishtransactionobject-storage

    发布与恢复

    构建与发布是两个独立状态迁移。构建产生与 target 无关的 Generation;发布把该 Generation 应用到一个供应商前缀,并记录足以在不猜测的前提下恢复的证据。 所有权拆分 Repository 作用域 Target prefix 作用域 Package Object Publication Attempt Desired 与 Built 状态 Applied Checkpoint Generation 与 Changeset 远端 inventory retained 包体/ …

    构建与发布是两个独立状态迁移。构建产生与 target 无关的 Generation;发布把该 Generation 应用到一个供应商前缀,并记录足以在不猜测的前提下恢复的证据。 所有权拆分 Repository 作用域 Target prefix 作用域 Package Object Publication Attempt Desired 与 Built 状态 Applied Checkpoint Generation 与 Changeset 远端 inventory retained 包体/ …

  • SOW v0.2.0

    Vonng 发布于 发布注记 581 字 2 分钟

    VonngReleasereleasemanagedsigningpublishgeneration

    SOW v0.2.0

    SOW 0.2.0 是 Pigsty 出品的自包含 RPM/DEB 仓库管理器,Release 资产以单个 Go 可执行文件覆盖 Linux 与 macOS 构建目标。 两种工作模式 Plain 模式 给目录顶层已有的 RPM 与 DEB 文件就地生成索引: sow create /srv/repo 它写入 repodata/、Packages 与 Packages.gz。Plain 模式没有 Workspace、状态数据库、 Generation,也不生成或签署 DEB Release。 …

    SOW 0.2.0 是 Pigsty 出品的自包含 RPM/DEB 仓库管理器,Release 资产以单个 Go 可执行文件覆盖 Linux 与 macOS 构建目标。 两种工作模式 Plain 模式 给目录顶层已有的 RPM 与 DEB 文件就地生成索引: sow create /srv/repo 它写入 repodata/、Packages 与 Packages.gz。Plain 模式没有 Workspace、状态数据库、 Generation,也不生成或签署 DEB Release。 …

  • 为什么 SOW 每个仓库只保留一棵包体树

    Vonng 发布于 设计归档 1516 字 4 分钟

    VonngDesignrepositorypoolrpmaptcompatibilitydecision

    为什么 SOW 每个仓库只保留一棵包体树

    这项决策起草于 2026-08-05 的 v0.2 发布前设计收敛阶段,并在 2026-08-08 随 SOW v0.2.0 正式交付,随后延续为 v0.3 与 v0.4 的布局契约。它记录的是架构选择,不是笼统的兼容性 PASS:协议闭包、普通软件包客户端、镜像工具、静态托管与对象存储始终属于彼此独立的证据层。 最终决策 每个 SOW Repository 只拥有一棵公共树: <repository>/ pool/ # 正典包体 dists/ <dist>/ <architecture>/ # …

    这项决策起草于 2026-08-05 的 v0.2 发布前设计收敛阶段,并在 2026-08-08 随 SOW v0.2.0 正式交付,随后延续为 v0.3 与 v0.4 的布局契约。它记录的是架构选择,不是笼统的兼容性 PASS:协议闭包、普通软件包客户端、镜像工具、静态托管与对象存储始终属于彼此独立的证据层。 最终决策 每个 SOW Repository 只拥有一棵公共树: <repository>/ pool/ # 正典包体 dists/ <dist>/ <architecture>/ # …