Silo 20260806 发布

首个以 Silo 之名发布的版本:品牌切换完成而兼容面原样保留、原生健康检查、Distroless 镜像试点、捆绑 mcli 20260806、完整的许可合规材料,以及以构建溯源为门禁的发布管线。

版本: RELEASE.2026-08-06T00-00-00Z · 提交: 3be10fcc1a44f6620ded0bd303461f9d688cca23

SILO 20260806 是首个以 Silo 之名发布的版本。上一个版本 20260804 是以 pgsty/minio 名义交付的最后一版;本版本完成了向 github.com/pgsty/silo 的切换,重命名了每一个交付表面——二进制、软件包、容器镜像、systemd 服务、Helm chart——同时刻意原样保留了 MinIO 部署所依赖的每一个线上协议与配置表面。在改名之外,本版本新增了原生健康检查(silo healthcheck)、单二进制的 Distroless 容器镜像试点、装入每个交付物的完整许可合规材料,以及以兼容性快照与构建溯源为门禁的发布管线。

本版本覆盖 RELEASE.2026-08-04T00-00-00Z 之后的 28 个提交,变更 396 个文件新增 27,188 行、删除 19,561 行。发布前通过了六阶段验收,包括一次真实的四节点 TLS 集群从 MinIO 到 Silo 的迁移——数据逐字节校验、维护闸门滚动重启、故障注入,以及完整的回滚彩排。

亮点

  • **品牌切换完成,兼容性即契约。**仓库、二进制(/usr/bin/silo)、软件包(silo rpm/deb/apk)、镜像(docker.io/pgsty/silo)、服务(silo.service)全部改名;S3 与管理 API、/minio/* 路由、MINIO_* 环境变量、x-minio-* 响应头、磁盘上的 .minio.sys 格式、Go 模块路径全部保留,并由 CI 兼容性守卫冻结。
  • 原生健康检查:silo healthcheck [live|ready|cluster|cluster-read] 探测服务器自己的健康 API——正确的退出码、解码后的 quorum 诊断、TLS 自动探测、--maintenance 下线前闸门——容器内无需 shell、curlmc
  • Distroless 镜像试点:pgsty/silo:<RELEASE>-distroless 基于 gcr.io/distroless/static,恰好装载一个程序——silo 二进制——内置 exec 形式 HEALTHCHECK/data 在镜像层内以可写方式创建。
  • **经典镜像行为不变:**同样的入口脚本、同样的捆绑工具,mc ready local 继续可用,也没有给它添加 HEALTHCHECK。捆绑客户端升级为 mcli 20260806
  • **合规补齐:**LICENSE 与 NOTICE 装入每个软件包与镜像,CREDITS 按实际链接的模块集合(291 个模块)重新生成并纳入 CI 守卫,项目采用无 CLA、基于 DCO 的贡献政策。
  • **组件刷新:**内嵌 SILO Console 2.1.1、silo-pkg 3.11.0mcli 20260806、Go 1.26.5。
  • **以溯源为门禁的发布:**容器镜像只从已发布、校验和与 attestation 双重验证过的发布产物构建;镜像 SBOM 与溯源 attestation 现在同样覆盖 Distroless 变体。

改名

改了什么,与刻意没改什么:

已重命名(交付表面)已保留(兼容表面)
仓库:github.com/pgsty/silo(main 分支)S3 API、管理 API 与请求签名行为
二进制:/usr/bin/silo/minio/* 路由,含 /minio/health/* 与指标端点
软件包:silo-*.rpmsilo_*.debsilo_*.apkMINIO_* 环境变量与 x-minio-* 响应头
镜像:docker.io/pgsty/silo(另有 -distroless磁盘格式(.minio.sys)、纠删码、版本控制
服务:silo.service(与 minio.service 冲突并取而代之)Go 模块与导入路径(github.com/minio/...
默认配置目录:~/.silo(存在旧 ~/.minio 时回退兼容)捆绑 mclimc 兼容别名

服务器呈现自己的身份——silo --version 输出 AGPL-3.0 许可、MinIO 2015-2025 版权、PGSTY 修改版权与 “based on MinIO technology” 归属——所有继承自上游的 MinIO 运营服务连接(更新源及其验签密钥、SUBNET、遥测)被切断而非重定向。容器入口脚本翻译 legacy minio argv 词元,因此 docker run pgsty/silo minio server /data 继续可用。

CI 中运行快照式 rebrand 守卫:对 334 个路由字面量、437 个环境变量词元、84 个响应头与 9,014 个导出符号的任意双向漂移直接判失败。

原生健康检查

服务器二进制现在可以探测自己的健康端点,使容器健康检查不再需要第二个二进制——这也是 Distroless 镜像的依赖所在:

silo healthcheck [FLAGS] [live|ready|cluster|cluster-read]
  • 检查词汇与 /minio/health/<path> 一一对应;live(默认)回答"这个进程是否在服务",ready 在配置了 KMS/etcd 时追加其可达性,cluster 一对评估每个纠删集的写/读 quorum。
  • 退出码只有 0(健康)与 1(其余一切)——绝不使用 Docker 保留的 2。单行诊断解码服务端的 x-minio-server-status 与 quorum 响应头供 docker inspect 采集;--json 输出机器可读判定。
  • 探测目标按服务器推导自身监听地址的方式推导:--address / MINIO_ADDRESS,HTTPS 由 certs 目录中 public.crt + private.key 的存在自动判定,或用 --url / MINIO_HEALTHCHECK_URL 整体覆盖。环境变量形式的存在是因为探针进程看不到服务器的命令行——当服务器地址或 TLS 来自 CLI 参数时,一个环境变量即可矫正内置探针。
  • silo healthcheck --maintenance cluster 回答下线前的问题:退出 0 表示此节点可安全下线而不失去高可用;HTTP 412(退出 1)表示不可以。
  • 跳过证书校验,与 kubelet 对 HTTPS 探针的文档行为一致;传输层忽略 HTTP_PROXY,环回探测永不进代理。

Kubernetes 完全不需要这些——kubelet 的 httpGet 探针从容器外打 /minio/health/live/minio/health/ready——且 cluster 检查不应进入单容器探针:它反映的是全集群 quorum,不是单个进程。完整设计依据(含源码核实的端点语义)记录于健康检查设计笔记

Distroless 镜像试点

在经典镜像之外,本版本发布 Distroless 变体pgsty/silo:RELEASE.2026-08-06T00-00-00Z-distroless,另有滚动 distroless 标签。

  • 基底为 gcr.io/distroless/static-debian12:CA 证书、tzdata、/tmp、含 nonroot(65532)条目的 /etc/passwd——没有 shell、没有包管理器、没有 libc。之上恰好一个程序:/usr/bin/silo(外加 /licenses/ 下的许可三件套)。镜像 128 MB,对比经典镜像 199 MB。
  • 二进制即 ENTRYPOINT;内置 exec 形式 HEALTHCHECK 运行 silo healthcheck ready(interval 30s、timeout 10s、start-period 2m、retries 3),Compose 用户零配置即获得可用的 depends_on: condition: service_healthy
  • /data 在镜像层内以全员可写方式创建——运行时已没有入口脚本可以修补卷属主,而这正是让所有权限模式(含 --user)都能工作的原因。这在 Distroless 变体中修复了 #55 记录的非 root 失败。
  • 此变体不支持:已弃用的 MINIO_USERNAME/MINIO_GROUPNAME 降权路径(改用 --user 或 Kubernetes runAsUser)、docker exec <c> sh 式调试(改用临时容器工具)、镜像内 mc(改用已发布的 mcli 或客户端镜像)。
  • TLS:把证书挂到 /tmp/.silo/certs(容器内默认 certs 目录),服务器与内置探针会从同一位置各自推导出 HTTPS;CLI 参数配置的服务器则设置 MINIO_HEALTHCHECK_URL

经典镜像仍是默认且保持不变。试点验证充分后,Distroless 变体将成为推荐镜像;决策记录见上述设计笔记。

容器镜像

经典镜像与 pgsty/minio:RELEASE.2026-08-04T00-00-00Z 做了逐字段对照:入口、暴露端口、卷、工作目录、用户与(不存在的)健康检查配置完全一致。差异恰好三处且均为刻意变更:Cmd["minio"] 改为 ["silo"];移除上游更新验签密钥变量 MINIO_UPDATE_MINISIGN_PUBKEY(上游渠道更新永久关闭);声明 HOME=/tmp 以与入口脚本的可写 home 保证一致。

捆绑客户端升级为 mcli RELEASE.2026-08-06T00-00-00Z(保留 mc 别名),按架构以 SHA-256 摘要钉版并在构建期对照发布校验和验证。已发布的 mcli 20260806 与本服务器的互操作性——分段上传、版本控制、预签名 URL、metadata/tags、用户与策略管理——已在发布验收中验证。

Helm chart

Chart 以 silo 7.0.1 发布,经迁移守卫验证在模拟升级中与旧 chart 的 7 个渲染资源身份保持稳定。默认镜像标签现在指向本版本——docker.io/pgsty/silo 是全新仓库,继承的旧默认值本不可能拉取成功。Chart 仍未附带 liveness/readiness/startup 探针;按设计笔记的后续阶段规划补齐。

打包与迁移

RPM、DEB、APK 软件包恰好安装六个文件:/usr/bin/silosilo.service、sysusers 定义(创建 silo 系统用户)、/etc/default/silo(config/noreplace)、LICENSE 与 NOTICE。RPM 以 PGSTY 维护者密钥 GPG 签名(9592A7BC 7A682E73 33376E09 E7935D8D B9BD8B20)。RPM 与 DEB 现在统一携带 PGDG 风格的 1PGSTY release 段——silo-<版本>-1PGSTY.<架构>.rpmsilo_<版本>-1PGSTY_<架构>.deb——取代此前 RPM 继承的裸 -1 与 DEB 缺失的 revision;APK 命名保持不变,因为 Alpine pkgrel 只接受 -r<整数>

silo.service 为接管而设计:Type=notify(就绪由服务器自己发信号)、Conflicts=minio.service + After=minio.service(启动 Silo 会停掉运行中的 MinIO 服务)、以及两个环境文件——先读 /etc/default/minio、后以 /etc/default/silo 覆盖——现有 MinIO 配置无需编辑即被继承。对数据属主为 minio 用户的既有部署,用文档规定的 drop-in 保持属主不动:

# /etc/systemd/system/silo.service.d/10-legacy-user.conf
[Service]
User=minio
Group=minio

来自验收实测的迁移排障提示:若 Silo 以软件包默认的 silo 用户启动,而部署的 TLS 证书位于 minio 用户家目录之下,会以 HTTPS specified in endpoints, but no TLS certificate is found 失败并连续重启直至 systemd 启动限制生效——上面的 legacy-user drop-in 即是解法。迁移窗口期间保留 MinIO 软件包与服务(处于 disabled):回滚路径——停 Silo、起 MinIO——已经彩排,且能读取 Silo 窗口期写入的全部数据,因为迁移既不动数据属主也不动数据格式。

组件与依赖

  • SILO Console 2.1.1 —— 内嵌控制台,取自 pgsty/silo-console,保留 github.com/minio/console 导入路径。
  • silo-pkg 3.11.0 —— 保留策略/LDAP/证书修复,含 #15 跟踪的 LDAP-over-TLS 修复。
  • mcli 20260806 —— 镜像内捆绑并已单独发布;见其发布说明
  • Go 1.26.5 —— 工具链与 20260804 一致。

构建、CI 与发布管线

  • **兼容性即 CI 门禁:**rebrand 守卫对路由、环境变量词元、响应头、指标、存储/策略标识符与导出符号做快照,任何未经评审的漂移直接失败;配套脚本断言交付表面(二进制路径、unit 内容、镜像布局),并确保运行时代码中不再存在任何上游在线端点。
  • **发布镜像门禁:**发布管线的每次运行都构建两个容器镜像并断言(除其他外):Distroless 的 HEALTHCHECK 存活于镜像配置(它是 OCI 规范之外的 Docker 扩展)、/data 以全员可写交付、不存在 shell 与 /usr/bin/minio、Docker 健康状态仅凭内置探针即转 healthy、SIGTERM 在 root 与 --user 1001:1001 双路径下均优雅停机。
  • **溯源链:**镜像从已发布的发布产物构建,先经校验和验证与对确切 tag 的 gh attestation verify;经典与 Distroless 镜像均推送分架构 SBOM 与溯源 attestation;Distroless 健康检查门禁在多架构 manifest 提升之前运行。
  • 工作流运行时全面迁移到 Node 24。

兼容性与升级注意

  1. **软件包升级是接管而非原地更新。**安装 silo,保持 /etc/default/minio 原样(会被继承),启用 silo.service;启动它会经冲突关系停掉 minio.service。数据不动。
  2. 用上述 legacy-user drop-in 保持数据属主稳定;迁移期间不要 chown 存储、不要移动证书。
  3. **分布式集群:只能全停切换。**见上方警告——Silo/MinIO 混合节点无法组网。
  4. **容器用户:**镜像现为 docker.io/pgsty/silodocker.io/pgsty/minio 冻结在 20260804 作为存档。经典镜像行为不变——包括 mc ready local 健康检查——Distroless 变体严格自愿选用。
  5. **Distroless 的差异是刻意的:**无 shell、无镜像内 mc、无 MINIO_USERNAME 路径;健康检查原生;CLI 参数配置的服务器需为内置探针设置 MINIO_HEALTHCHECK_URL
  6. **Helm 用户:**chart 7.0.1 的默认值现在能拉取本版本;若钉版本请显式覆盖 image.tag
  7. **已知且未变:**经典镜像仍不在层内创建 /data,因此完全非 root 的 docker run 配 Docker 管理卷会一如既往失败(#55,Distroless 变体已修复);20260804 说明中继承的 Postgres/MySQL 遗留通知迁移限制仍然适用(#53)。
  8. 客户端配套使用 mcli 20260806;旧客户端在未变的线上协议下继续可用。

验证

本版本分阶段验证,每一步留有证据记录:

  • 健康检查命令的单元与端到端矩阵:目标推导与优先级链(flag/env/派生)、真实 TLS 自动探测、退出码契约、JSON schema、超时有界性、用法错误;
  • 四节点集群上的语义验证:停掉 4 节点中的 2 个后,cluster 报告 503 且 write-quorum=5,而 cluster-readlive 保持 200——写/读 quorum 分野现场观测,与纠删码推演一致;
  • 镜像验收:经典镜像与 20260804 基线逐字段对照;Distroless 镜像断言至文件清单、精确健康检查配置,及 root/非 root/TLS/环境变量覆盖四个运行场景;
  • 对新增代码的对抗性模型评审,全部确认发现均已修复并复验;
  • 以真实迁移收尾的六阶段发布前验收:Pigsty 部署的四节点 TLS MinIO 20260804 集群(16 盘、EC:4)经软件包接管路径迁移至 Silo——参考数据(分段、多版本、带标签对象)逐字节读回一致、四轮维护闸门滚动重启、kill -9 故障注入下负载均衡持续 IO 24 轮成功 23 轮(唯一失败恰在击杀当秒)、Prometheus 指标连续,以及完整的回滚至 MinIO 再切回——证明迁移可逆。

验证边界

以下内容本版本未予证明,亦不应据此推断:外部 LDAP/OIDC/KMS/etcd 服务(readylive 分叉的唯一情形未对真实 KMS 演练);amd64 软件包做了交叉构建与 payload 检查但未在物理 x86-64 主机上安装;改名后的 Docker 发布工作流(含新增的 SBOM/attestation 通道)在本版本发布时才有首次生产运行;Windows 与 Intel macOS 未测试。

交付物

  • pgsty/silo 的 GitHub Release RELEASE.2026-08-06T00-00-00Z:带校验和的平台归档、溯源 attestation、RPM/DEB/APK 软件包(RPM 带 GPG 签名);
  • docker.io/pgsty/silo:RELEASE.2026-08-06T00-00-00Zlatestdocker.io/pgsty/silo:RELEASE.2026-08-06T00-00-00Z-distrolessdistroless——从完成的 Release 按需发布;
  • 配套发布:mcli 20260806silo-pkg 3.11.0、内嵌 SILO Console 2.1.1;
  • 设计记录:原生健康检查与 Distroless 镜像

选定变更

  • 15def34dc77bdc4c0c:清除上游交付残留;呈现 Silo 身份并关闭继承的上游服务
  • 15ab10833:交付物改名为 silo 并补全软件包载荷
  • 30749911b:镜像装载 silo 二进制并翻译 legacy argv 命令
  • e071bb77e:以保持身份的 silo chart 替换 minio chart
  • bd8df5166:以兼容性、打包与溯源证据为 rebrand 设门禁
  • 6613c2a3c:钉住外部测试固件并针对 silo 二进制运行套件
  • fd2ca1c6dc46b16ec6c47733abcf1c77d5a2:切换到 pgsty/silo 与 main;记录归档分支
  • 6740e6978:工作流迁移到 Node 24 运行时
  • b57275be3:采用无 CLA + DCO 政策并修正版权条款
  • 62717d7bfa6d6d9b02:内嵌 Console 升级到 2.1.0、再到 2.1.1
  • 6bd9cf77e:按实际链接模块集合重新生成 CREDITS 并纳入 CI 守卫
  • 219670d31:LICENSE 与 NOTICE 装入每个软件包与镜像
  • 2ff594f4b:新增原生 silo healthcheck 子命令
  • 4c34d2309:新增 Distroless 镜像变体试点
  • b6d47b7399462cce16:按对抗性评审加固;lint 清理
  • 16b78eb4e:捆绑 mcli 20260806 并将 Helm 默认值指向本版本
  • 062a91bee:将 CREDITS 模块闭包钉定到实际发布的 linux 目标
  • 467931455:统一 rpm 与 deb 的 release 段为 1PGSTY
  • b14ea22aa:镜像发布通道精确匹配校验和清单条目
  • 3be10fcc1:新增手动 finalize 通道,为已签名的 Draft 软件包刷新 SBOM 与校验和

致谢

以新名字发布的第一个版本,正是感谢所有为这个分支提交过 issue 的人的时刻——缺陷报告、兼容性发现与提案,无论已解决还是仍在处理:

@mosesdd(#1)、@Xavier-777(#2、#17)、@jiadzh(#3)、@TLINDEN(#4)、@AntonOfTheWoods(#5)、@zylpsrs(#6)、@nsanitate(#7)、@makinikm(#9)、@magicxor(#10)、@spaceg00se-r(#11、#14)、@heroes1412(#13)、@vampywiz17(#15)、@davinkevin(#20)、@chalukyaj(#30)、@cbornet(#31、#32)、@jvasile(#33)、@Kesavaambati(#35)、@redfoxfox(#38)、@kuldeep-link11(#39、#40)、@meesudzu(#42)、@pmezhuev(#43)、@kh0mka(#51)。

本版本的多项核心内容可以直接追溯到这些报告:内置客户端的保证来自 #4#9,LDAP-over-TLS 修复来自 #15,软件包载荷补全来自 #33,RPM GPG 签名来自 #43,迁移指南来自 #42,distroless 的 /data 修复来自 #55

代码贡献值得单独致谢。@davinkevin 的 distroless 镜像 PR(#21)比本版本的试点早了数月——最终交付的变体以内置原生健康检查取代了该 PR,但方向是在那里首先提出的。@magicxor#12)与 @ycjlin#37)的一致性修复 PR 将在本版本发布后立即进入评审。