Silo 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)、软件包(silorpm/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、curl或mc。 - Distroless 镜像试点:
pgsty/silo:<RELEASE>-distroless基于gcr.io/distroless/static,恰好装载一个程序——silo二进制——内置 exec 形式HEALTHCHECK,/data在镜像层内以可写方式创建。 - **经典镜像行为不变:**同样的入口脚本、同样的捆绑工具,
mc ready local继续可用,也没有给它添加HEALTHCHECK。捆绑客户端升级为mcli20260806。 - **合规补齐:**LICENSE 与 NOTICE 装入每个软件包与镜像,CREDITS 按实际链接的模块集合(291 个模块)重新生成并纳入 CI 守卫,项目采用无 CLA、基于 DCO 的贡献政策。
- **组件刷新:**内嵌 SILO Console 2.1.1、
silo-pkg3.11.0、mcli20260806、Go 1.26.5。 - **以溯源为门禁的发布:**容器镜像只从已发布、校验和与 attestation 双重验证过的发布产物构建;镜像 SBOM 与溯源 attestation 现在同样覆盖 Distroless 变体。
改名
改了什么,与刻意没改什么:
| 已重命名(交付表面) | 已保留(兼容表面) |
|---|---|
仓库:github.com/pgsty/silo(main 分支) | S3 API、管理 API 与请求签名行为 |
二进制:/usr/bin/silo | /minio/* 路由,含 /minio/health/* 与指标端点 |
软件包:silo-*.rpm、silo_*.deb、silo_*.apk | MINIO_* 环境变量与 x-minio-* 响应头 |
镜像:docker.io/pgsty/silo(另有 -distroless) | 磁盘格式(.minio.sys)、纠删码、版本控制 |
服务:silo.service(与 minio.service 冲突并取而代之) | Go 模块与导入路径(github.com/minio/...) |
默认配置目录:~/.silo(存在旧 ~/.minio 时回退兼容) | 捆绑 mcli 的 mc 兼容别名 |
服务器呈现自己的身份——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或 KubernetesrunAsUser)、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/silo、silo.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.<架构>.rpm 与 silo_<版本>-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、部分仍是 MinIO——无法组网:新节点停在 activating,无限期记录 Expected Silo binary checksum ... seen: ... 与 Waiting for at least 1 remote servers with valid configuration。请在所有节点上停止 MinIO,然后(近同时地)在所有节点上启动 Silo。全部节点运行 Silo 之后,滚动重启一切正常——每台重启前用 silo healthcheck --maintenance cluster 做闸门。
来自验收实测的迁移排障提示:若 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-pkg3.11.0 —— 保留策略/LDAP/证书修复,含 #15 跟踪的 LDAP-over-TLS 修复。mcli20260806 —— 镜像内捆绑并已单独发布;见其发布说明。- 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。
兼容性与升级注意
- **软件包升级是接管而非原地更新。**安装
silo,保持/etc/default/minio原样(会被继承),启用silo.service;启动它会经冲突关系停掉minio.service。数据不动。 - 用上述 legacy-user drop-in 保持数据属主稳定;迁移期间不要 chown 存储、不要移动证书。
- **分布式集群:只能全停切换。**见上方警告——Silo/MinIO 混合节点无法组网。
- **容器用户:**镜像现为
docker.io/pgsty/silo;docker.io/pgsty/minio冻结在 20260804 作为存档。经典镜像行为不变——包括mc ready local健康检查——Distroless 变体严格自愿选用。 - **Distroless 的差异是刻意的:**无 shell、无镜像内
mc、无MINIO_USERNAME路径;健康检查原生;CLI 参数配置的服务器需为内置探针设置MINIO_HEALTHCHECK_URL。 - **Helm 用户:**chart 7.0.1 的默认值现在能拉取本版本;若钉版本请显式覆盖
image.tag。 - **已知且未变:**经典镜像仍不在层内创建
/data,因此完全非 root 的docker run配 Docker 管理卷会一如既往失败(#55,Distroless 变体已修复);20260804 说明中继承的 Postgres/MySQL 遗留通知迁移限制仍然适用(#53)。 - 客户端配套使用
mcli20260806;旧客户端在未变的线上协议下继续可用。
验证
本版本分阶段验证,每一步留有证据记录:
- 健康检查命令的单元与端到端矩阵:目标推导与优先级链(flag/env/派生)、真实 TLS 自动探测、退出码契约、JSON schema、超时有界性、用法错误;
- 四节点集群上的语义验证:停掉 4 节点中的 2 个后,
cluster报告 503 且write-quorum=5,而cluster-read与live保持 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 服务(ready 与 live 分叉的唯一情形未对真实 KMS 演练);amd64 软件包做了交叉构建与 payload 检查但未在物理 x86-64 主机上安装;改名后的 Docker 发布工作流(含新增的 SBOM/attestation 通道)在本版本发布时才有首次生产运行;Windows 与 Intel macOS 未测试。
交付物
pgsty/silo的 GitHub ReleaseRELEASE.2026-08-06T00-00-00Z:带校验和的平台归档、溯源 attestation、RPM/DEB/APK 软件包(RPM 带 GPG 签名);docker.io/pgsty/silo:RELEASE.2026-08-06T00-00-00Z与latest;docker.io/pgsty/silo:RELEASE.2026-08-06T00-00-00Z-distroless与distroless——从完成的 Release 按需发布;- 配套发布:
mcli20260806、silo-pkg3.11.0、内嵌 SILO Console 2.1.1; - 设计记录:原生健康检查与 Distroless 镜像。
选定变更
15def34dc、77bdc4c0c:清除上游交付残留;呈现 Silo 身份并关闭继承的上游服务15ab10833:交付物改名为 silo 并补全软件包载荷30749911b:镜像装载 silo 二进制并翻译 legacy argv 命令e071bb77e:以保持身份的 silo chart 替换 minio chartbd8df5166:以兼容性、打包与溯源证据为 rebrand 设门禁6613c2a3c:钉住外部测试固件并针对 silo 二进制运行套件fd2ca1c6d、c46b16ec6、c47733abc、f1c77d5a2:切换到 pgsty/silo 与 main;记录归档分支6740e6978:工作流迁移到 Node 24 运行时b57275be3:采用无 CLA + DCO 政策并修正版权条款62717d7bf、a6d6d9b02:内嵌 Console 升级到 2.1.0、再到 2.1.16bd9cf77e:按实际链接模块集合重新生成 CREDITS 并纳入 CI 守卫219670d31:LICENSE 与 NOTICE 装入每个软件包与镜像2ff594f4b:新增原生silo healthcheck子命令4c34d2309:新增 Distroless 镜像变体试点b6d47b739、9462cce16:按对抗性评审加固;lint 清理16b78eb4e:捆绑 mcli 20260806 并将 Helm 默认值指向本版本062a91bee:将 CREDITS 模块闭包钉定到实际发布的 linux 目标467931455:统一 rpm 与 deb 的 release 段为1PGSTYb14ea22aa:镜像发布通道精确匹配校验和清单条目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 将在本版本发布后立即进入评审。