The version history that an ILM expiry reads accepts a version only when one revision of it is on more than half of the drives and on its read quorum, and a revision was the header as the drive stores it plus a digest of the metadata. A drive holds the header that the release which wrote the version there stored: before RELEASE.2024-04-28 without erasure coding, and until RELEASE.2022-01-25 with a signature that counted empty part ETags. A heal writes the header of its own release and leaves the other drives alone. Reads and heal take both for one version; the history counted two revisions. With 5 to 11 of 16 drives healed (EC:4) neither had the quorum, objectVersions failed with a read quorum error, and every expiry that reads the history was refused on each scanner cycle, with nothing to bring the drives together: every expiry in a versioned bucket with several pools, and an expiry of all versions of a key with one pool too. versionRevision now gives the key of an object version the signature and the erasure coding as the current release computes them from the decoded metadata. The key of a version this release wrote carries its header as stored, so its history decides as before, including the order of versions of one time, which the signature breaks. The digest covers what both fields say. The stored flags stay in the key: whether a transitioned version uses its data directory follows the moment a drive wrote the entry (fileInfoRevisions). TestPoolsLifecycleHeaderEras accepts both old headers on every count of healed drives. TestPoolsLifecycleHealedOldHeaders expires a noncurrent version with two pools, and all versions with one, after half of the drives were wiped and healed. Both fail before this change. Drives that differ only in the data directory flag of a restored version are still two revisions; that is a separate defect. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Signed-off-by: Feng Ruohang <rh@vonng.com>
S3-compatible object storage — a MinIO fork maintained by PGSTY
Website · Documentation · Download · Release Notes · Compatibility · Manifesto · Security · 中文
Important
PGSTY Silo (hereinafter “Silo”) is an independent, community-maintained fork of the open-source MinIO server, published by Pigsty from
pgsty/silo. It is not affiliated with, endorsed by, or sponsored by MinIO, Inc. “MinIO” is used only to identify the upstream project and compatibility lineage.
Overview
PGSTY SILO keeps one maintained release line of the open-source MinIO server alive after upstream ended community distribution: builds, packages, multi-arch images, security fixes, and the full web console. Pigsty runs it in production as its PostgreSQL backup repository.
It follows one rule — the product and its delivery surfaces are renamed; the protocol and your data are not. Everything else lives on silo.pgsty.com.
Related: pgsty/mc · pgsty/silo-console · pgsty/silo-pkg · pgsty/kes · pgsty/pigsty
SILO 20261109
Warning
SILO 20261109 fixes bugs and security vulnerabilities. We strongly recommend scheduling an upgrade to reduce security risks.
Note
On 2026-08-06,
pgsty/miniobecamepgsty/silo, and the default branch changed frommastertomain. The last MinIO-branded release is20260804on theminiobranch.
Quick Start
docker run -d --name silo -p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD=change-me-long-password \
-v "$PWD/data:/data" \
docker.io/pgsty/silo:RELEASE.2026-11-09T00-00-00Z server /data --console-address ":9001"
Console on http://localhost:9001, S3 API on http://localhost:9000. The image bundles the client as mcli:
docker exec silo mcli alias set local http://127.0.0.1:9000 minioadmin change-me-long-password
docker exec silo mcli mb local/demo && docker exec silo mcli ls local
Warning
For production, pin a release, use unique credentials and TLS, monitor the service, keep independent backups, and test recovery. Start from the documentation.
Install
| Method | Where |
|---|---|
| Container | pgsty/silo, multi-arch for linux/amd64 and linux/arm64 |
| Binaries | GitHub Releases — Linux, macOS, Windows on amd64 and arm64 |
| Packages | RPM, DEB, and APK, also via the Pigsty repository |
| Kubernetes | Helm chart, see Download & Install |
| Source | go build -o silo . && ./silo --version |
Every release ships checksums, SPDX SBOMs, Sigstore-signed manifests, and GitHub build attestations. Installation methods and verification commands are documented at Download & Install; migrating from upstream MinIO — taking over an existing minio.service and its /etc/default/minio, and keeping data ownership stable with a /etc/systemd/system/silo.service.d/10-legacy-user.conf drop-in — is covered by the migration guide and the binary & service notes.
Compatibility
Silo preserves S3 and storage-format compatibility, including existing MINIO_* variables, minio_* metrics, x-minio-* headers, /minio/* routes, and .minio.sys data. CI guards selected compatibility identifiers; release notes document intentional security and behavior changes. Silo-owned delivery surfaces use the silo executable, package, service, Helm chart, and container image; no minio server binary alias is installed.
The supported release stack is pgsty/silo + pgsty/silo-console + pgsty/mc + pgsty/silo-pkg; compatibility with unmodified upstream MinIO/MC is best effort. The Server, Console, and client retain their historical module paths where needed, while maintained code imports github.com/pgsty/silo-pkg/v3 directly. The SDK github.com/minio/minio-go/v7 is an explicit upstream dependency. See the current go.mod for versions and replacements.
Every divergence from upstream is listed in the code-verified compatibility audit. Treat each release as a downstream upgrade: pin versions, read the release notes, and keep a rollback path.
TLS and Go upgrades
Server 20260916 restored Go's default key exchange; Server 20261018 retains it with Go 1.27.2.
TLS key exchange follows Go's defaults across the S3 listener, node links,
replication, identity providers, etcd, and external HTTP services. If an endpoint
cannot accept ML-KEM, GODEBUG=tlsmlkem=0 disables the default hybrid exchanges
for the process; certificate verification remains enabled. This option does not
disable ML-DSA signatures or resolve every TLS reset. Prefer updating the
incompatible endpoint before removing the temporary setting.
If only the new SecP hybrids cause problems, GODEBUG=tlssecpmlkem=0 disables
those groups while retaining X25519MLKEM768.
For builds targeting Go 1.27, setting either SSL_CERT_FILE or SSL_CERT_DIR
on macOS replaces Keychain trust with on-disk roots and Go's verifier. Stale or
incomplete CA paths can break previously trusted connections; unset inherited
values to restore Keychain trust. Explicit certificates in the configured CAs
directory remain additive to the selected root pool.
Go 1.27 binaries require macOS 13 or later. See the
Go release notes and the
Go 1.27 TLS and OIDC discovery guide.
Documentation ownership
User documentation is maintained at silo.pgsty.com,
with source in pgsty/silo.pgsty.com.
The remaining docs/ tree contains inherited references, examples, and tooling
fixtures. Investigation logs, AI work records, and temporary reports are kept
outside this repository; reusable findings belong in the companion site.
See AGENTS.md for repository ownership and maintenance rules.
Security & Contributing
Report vulnerabilities privately as described in SECURITY.md; every fix ships with a public advisory. Contributions are accepted inbound=outbound under AGPL-3.0-or-later with no CLA — only DCO sign-off (git commit -s) is required; see CONTRIBUTING.md.
Contributors
Every human issue or pull-request author is part of the SILO community, including open and unmerged work. We also recognize security reports, including reports sent by email, with the reporter's permission. Merged fixes, adopted proposals, and actionable reports receive priority, with first participation guiding the remaining order. Gold rings highlight reviewed significant contributions.
View contribution notes and actual PR status.
Star History
Background
Upstream wound down its community edition: the web console was cut back to a stub, prebuilt community binaries stopped, and the community repository was archived. Silo exists to keep those deployments running. The fork is a means, not an identity — if upstream restores its community edition, we will narrow our scope and offer the fixes back.
The Manifesto is the project's public commitment in eleven articles, under one discipline: every article is either something already done with public evidence, or something explicitly refused. In short:
- Compatibility contract — the protocol and your data do not change, and every release documents its tested rollback target and path.
- The license cannot change — AGPLv3, no CLA, no copyright aggregation; nobody here, ourselves included, holds enough copyright to relicense on everyone else's behalf.
- The never list, append-only — no paywalling existing features, no registration wall on downloads, no telemetry (upstream's phone-home paths are removed outright), no CLA, no license change, no trademark enforcement against normal use.
- Security and release discipline — a public advisory for every fix, and a release every one to two months, at most a quarter apart. Judge both against the public record.
Essays: MinIO Is Dead · Who Takes Over? · Long Live MinIO · Promise Kept
License & Trademark
Silo is AGPL-3.0-or-later, derived from minio/minio with upstream copyright and third-party notices preserved in NOTICE and CREDITS. MinIO is a trademark of MinIO, Inc.; the name is used here only to identify the upstream project and compatibility lineage.
Details: license · attribution · trademark

