Feng Ruohang b10fd0e9c0 fix(ilm): report refused purges of all versions, and account their keys
An expiry of all versions of a key purges exactly that key, and the
purge can refuse it or stop early. Those outcomes were hard to see, and
the scanner reported a key it had queued as if it were already gone.

- Refusals and failures of a purge are counted in
  expiry_incomplete_total with their own reasons: tier_unsupported (a
  version is in a remote tier), budget (stopped after progress; the next
  expiry continues), changed (the latest version a batch matched
  changed) and history_unavailable. They are traced with the reason and
  send no removal event. A partial purge keeps its audit record, now
  with the reason. A tier refusal is also logged, once per key and hour,
  in words.
- A drive that cannot be read or decoded during the purge's own drive
  check now returns errDeleteAllHistoryUnavailable, which names the
  cause and stays a write quorum error (503) for API callers.
- The scanner does not queue an expiry of all versions whose latest
  version is hot when the pool holds a version in a remote tier: the
  purge would refuse it each cycle. It counts each such observation as
  tier_unsupported_skipped, once per drive scanner and cycle. A tiered
  version only another pool holds is unknown here, so the purge still
  decides; a transitioned latest version keeps the transitioned expiry.
  The tier predicate is shared with the purge's own check, for FileInfo
  and ObjectInfo, and excludes free versions.
- The scanner accounts every version of a key under an expiry of all
  versions at its size, queued or not, instead of as already removed.
  Usage, and so hard quota, drops after a fresh scan of the subtree once
  the purge succeeded. The alerts on many or large versions count the
  versions of a key that is not queued.
- A lifecycle expiry never deletes a prefix: DeleteObject refuses
  DeletePrefix with Expiration.Expire as InvalidArgument. No caller
  sends it since expiries of all versions became purges; a force delete
  of a prefix is unchanged.

Not done from the plan: queuing an MRF heal per version when a drive's
xl.meta fails to decode. Object heal does not rewrite metadata that
fails its CRC check (it reports the drive as unknown and skips it), so
those heals would not repair the drive. Such a key stays refused until
its metadata on that drive is repaired.

Tests: TestPurgeAllVersionsRefusalReasons,
TestPurgeAllVersionsRefusesCorruptDrive,
TestScannerSkipsDeleteAllForTieredKey and
TestPoolsDeleteObjectRejectsExpirePrefix are new. Tests that expected
the scanner to queue a refused purge, the predictive accounting, or
the old prefix options are converted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Feng Ruohang <rh@vonng.com>
2026-11-06 19:59:42 +08:00
2026-11-05 10:48:23 +08:00
2026-11-05 10:48:23 +08:00
2021-04-23 11:58:53 -07:00

Silo

S3-compatible object storage — a MinIO fork maintained by PGSTY

Website · Documentation · Download · Release Notes · Compatibility · Manifesto · Security · 中文

Website GitHub Release Docker Pulls Go Version License

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.

Note

Renamed from pgsty/minio to pgsty/silo, default branch master → main, on 2026-08-06. Artifacts under the original MinIO identity stay published on the archived minio branch and in releases up to RELEASE.2026-08-04T00-00-00Z.

SILO 20261026000000

SILO 20261026000000 is available as platform archives, Linux packages, and standard or distroless Docker images for amd64 and arm64. The release tag is RELEASE.2026-10-26T00-00-00Z; the package version is 20261026000000.0.0, built from source c3ad836aed0d.

This release fixes LDAP long-DN login, IAM policy refresh, multi-pool deletion safety, tiered-object expiry, multipart replication checksums, and remote rollback-option propagation. It embeds Console v2.5.1 (fff1618d9abb) and uses silo-pkg v3.15.2, Go 1.27.3, and upstream minio-go v7.4.2-0.20261025165926-320af050c445. Use mcli 20261026 for administration; the container images bundle it as mcli.

The Server IAM cache repair enables Console's Reset to default action. Existing storage timeouts and cancellation behavior remain: a timeout does not prove that a disk operation stopped or a write did not commit. Read the coordinated release notes and remaining storage limits before upgrading. See CONTRIBUTORS.md for the people behind the code, reports, and documentation.

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 client (shipped as mcli) · pgsty/silo-console · pgsty/silo-pkg · pgsty/pigsty

Silo Console

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-10-26T00-00-00Z server /data --console-address ":9001"

Silo Console

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.

SILO community contributors

View contribution notes and actual PR status.

Star History

SILO GitHub 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

S
Description
No description provided
Readme AGPL-3.0 197 MiB
Languages
Go 98.8%
Shell 1%
Makefile 0.1%