MinIO
Audited from github.com/minio/minio
MinIO is a Go implementation of the S3 API: an erasure-coded object store (klauspost/reedsolomon) with optional etcd-backed distributed IAM, LDAP and OpenID Connect identity integration, and tiering to Azure Blob Storage or Google Cloud Storage.
- Language
- Go
- Hosting
- Docker
- License
- AGPL-3.0
- Running for
- 8 years
- Team
- 20+ people
Why this architecture
Implementing erasure coding, IAM, and multi-protocol event notifications directly in the Go server, instead of delegating to RAID or an external message broker, keeps a deployment to a single binary while still integrating with existing enterprise identity and messaging systems through native client libraries.
Tech stack by layer
5 technologies · audited Sep 17, 2026- GoImplements the entire server, including the S3 API handlers under cmd/.
- Erasure coding (Reed-Solomon)Encodes objects across drives for redundancy and self-healing, implemented in cmd/erasure-*.go.
- etcdOptional distributed backend for IAM and configuration state alongside the local object store.
- LDAPExternal identity provider integration for admin-managed users and groups.
- OpenID ConnectExternal identity provider integration via OIDC, alongside LDAP, for admin authentication.
- S3MinIO implements Amazon's S3 API directly; this is the primary object storage protocol it serves.
- Azure Blob StorageTiering target for moving colder objects out of local erasure sets.
- Google Cloud StorageTiering target alongside Azure Blob Storage for cold object data.
- Event notification targetsPublishes bucket events to Kafka, NATS, NSQ, RabbitMQ, MQTT, Redis, MySQL, PostgreSQL, and Elasticsearch.
- DockerRelease image copies prebuilt platform binaries into a minimal container.
- KubernetesShips a Helm chart, linted in CI, for cluster deployment.
- PrometheusExposes cluster, drive, and API metrics through the built-in metrics endpoints.
- GitHub ActionsRuns Go linting, resiliency and healing test suites, and dependency vulnerability checks.
- MintMinIO's own S3-API compliance test suite, run in CI against built server binaries.
MinIO architecture diagram
Open SVGDiagram as text
- S3 clients (AWS SDKs · CLI) → S3 API handlers (cmd/api-*.go): S3
- Admin clients (admin API) → S3 API handlers (cmd/api-*.go): admin API
- S3 API handlers (cmd/api-*.go) → IAM (cmd/iam*.go): authorize
- S3 API handlers (cmd/api-*.go) → Erasure engine (Reed-Solomon): put / get
- Erasure engine (Reed-Solomon) → Erasure sets (local drives): data + parity
- Self-healing (global-heal · background ops) → Erasure sets (local drives): repair
- IAM (cmd/iam*.go) → etcd (IAM & config (optional)): state
- IAM (cmd/iam*.go) → LDAP / OIDC (identity providers): federate
- Erasure engine (Reed-Solomon) → Tiering targets (Azure Blob · GCS): tier cold data
- S3 API handlers (cmd/api-*.go) → Event targets (Kafka · NATS · Redis …): bucket events
Key architectural decisions
6 decisions- 01
The project is now archived with an explicit deprecation notice
GitHub marks the repository archived, and README.md opens with a callout stating this repository is no longer maintained, pointing users to AIStor Free and AIStor Enterprise as replacements, so the audited commit reflects the final state of the community-maintained server rather than an actively developed one.
- 02
IAM and config state can be distributed via etcd, not only local disk
go.mod depends directly on go.etcd.io/etcd/api/v3 and client/v3, and cmd/iam-etcd-store.go implements an etcd-backed IAM store alongside cmd/iam-object-store.go, so multi-node deployments can centralize identity and policy state in etcd instead of each node holding it independently.
- 03
Enterprise identity integrates through LDAP and OpenID Connect
go.mod depends on go-ldap/ldap and coreos/go-oidc, and cmd/admin-handlers-idp-ldap.go and cmd/admin-handlers-idp-openid.go implement dedicated admin API handlers for each, so external identity providers plug in through standard protocols rather than a MinIO-specific directory service.
- 04
Data redundancy is application-level erasure coding, not RAID
go.mod depends on klauspost/reedsolomon, and cmd/erasure-encode.go, cmd/erasure-decode.go, and cmd/erasure-healing.go implement Reed-Solomon encoding and self-healing across drives in Go, so redundancy is handled by the MinIO process itself rather than a hardware or filesystem RAID layer.
- 05
Tiering targets other object stores rather than a proprietary cold format
go.mod depends on cloud.google.com/go/storage and github.com/Azure/azure-sdk-for-go/sdk/storage/azblob, so colder data can move to Google Cloud Storage or Azure Blob Storage using their native SDKs instead of a MinIO-specific archive format.
- 06
Bucket notifications fan out to general-purpose messaging systems
go.mod depends directly on IBM/sarama (Kafka), nats-io/nats-server and nats.go, nsqio/go-nsq, rabbitmq/amqp091-go, and eclipse/paho.mqtt.golang, so bucket event notifications are implemented as native clients for each of these systems rather than one generic webhook mechanism.
How MinIO is built
How MinIO is structured
As of this audit, GitHub marks minio/minio archived, and README.md opens with a note stating the repository is no longer maintained, pointing readers to AIStor Free and AIStor Enterprise as the maintained successors. The code at the audited commit is nonetheless a complete, working S3-compatible object storage server: the entire implementation lives in cmd/ as a single Go module (go.mod), organized by concern rather than by package boundary — cmd/api-*.go for S3 API request handling, cmd/erasure-*.go for the storage engine, cmd/iam*.go for identity and access management, cmd/admin-*.go for the cluster admin API, and cmd/metrics-v2*.go/cmd/metrics-v3-*.go for two generations of a metrics system. buildscripts/ holds shell and Go helper scripts for cross-compilation, dependency checks, and healing verification, and .github/workflows runs a large CI suite (go.yml, go-lint.yml, go-resiliency.yml, go-healing.yml, replication.yaml, iam-integrations.yaml, mint.yml) covering the different subsystems.
Backend & APIs
The server exposes Amazon's S3 API directly — cmd/api-router.go, cmd/bucket-handlers.go, and cmd/object-handlers.go implement bucket and object operations, cmd/post-policy-fan-out.go and cmd/postpolicyform.go implement browser-based POST uploads, and cmd/object-lambda-handlers.go implements S3 Object Lambda-style request transformation. Beyond S3, go.mod depends on goftp.io/server/v2 and the tree includes cmd/ftp-server.go/cmd/ftp-server-driver.go, adding an FTP interface onto the same object store, and cmd/sftp-server.go-adjacent code depends on github.com/pkg/sftp for SFTP access. Cluster and node coordination runs over an internal REST protocol: cmd/peer-rest-client.go/peer-rest-server.go for general peer calls, cmd/lock-rest-client.go/lock-rest-server.go for the distributed lock manager (cmd/namespace-lock.go), and cmd/grid.go for the newer inter-node messaging grid.
Data & persistence
Objects are protected by erasure coding rather than RAID: go.mod depends on github.com/klauspost/reedsolomon, and cmd/erasure-encode.go, cmd/erasure-decode.go, cmd/erasure-healing.go, and cmd/erasure-server-pool.go implement striping data and parity across a configured set of drives, with cmd/global-heal.go and cmd/background-heal-ops.go driving continuous self-healing. Identity and configuration can live purely on local erasure-coded storage (cmd/iam-object-store.go) or in an external etcd cluster (cmd/iam-etcd-store.go, backed by the direct go.etcd.io/etcd/api/v3 and client/v3 dependencies), which is the documented path for larger or multi-site deployments. cmd/bucket-targets.go and cmd/bucket-replication.go implement cross-cluster and cross-cloud bucket replication, and tiering support depends directly on cloud.google.com/go/storage and github.com/Azure/azure-sdk-for-go/sdk/storage/azblob, letting an operator move less-frequently-accessed objects to Google Cloud Storage or Azure Blob Storage. Bucket event notifications (cmd/event-notification.go, cmd/notification.go) fan out to Kafka (IBM/sarama), NATS and NATS Streaming (nats-io/nats-server, nats.go, stan.go), NSQ (nsqio/go-nsq), RabbitMQ (rabbitmq/amqp091-go), MQTT (eclipse/paho.mqtt.golang), and database targets including MySQL (go-sql-driver/mysql), PostgreSQL (lib/pq), Redis (gomodule/redigo), and Elasticsearch (elastic/go-elasticsearch/v7), all as direct go.mod dependencies rather than a single generic webhook abstraction.
Build, test & deploy
The published Dockerfile does not compile from source: it starts FROM minio/minio:latest and simply copies in prebuilt, architecture-specific binaries (minio-${TARGETARCH}.${RELEASE}) along with their signature and checksum files, with the actual cross-compilation handled by buildscripts/cross-compile.sh and the go-cross.yml workflow elsewhere in CI. Correctness testing runs on multiple axes: go.yml and go-lint.yml for unit tests and static analysis, go-resiliency.yml and go-healing.yml (backed by buildscripts/verify-healing*.sh and buildscripts/heal-manual.go) for drive-failure and self-healing scenarios, replication.yaml for cross-cluster replication, iam-integrations.yaml for the LDAP/OIDC/etcd-backed IAM paths, and mint.yml, which runs MinIO's own S3-API compliance test suite against a built server. vulncheck.yml and depsreview.yaml gate dependency and vulnerability review on pull requests, and helm-lint.yml lints the project's Helm chart for Kubernetes deployment.
Self-hosting notes
Because the repository is archived, README.md is explicit that pre-compiled binary releases are no longer provided for the community edition — the two documented installation paths are go install github.com/minio/minio@latest or building a Docker image from source, both explicitly framed as options for existing users rather than an actively supported product going forward. Anyone self-hosting from this commit should read README.md's "Source-Only Distribution" section and the AIStor links before depending on continued updates, security patches, or new features from this repository. The underlying architecture — erasure-coded storage, optional etcd-backed IAM, S3/FTP/SFTP protocol support, and the Helm chart validated by helm-lint.yml — remains a valid reference for how a self-hosted, Kubernetes-deployable S3-compatible store can be built in Go.
What to copy (and what not to)
Implementing erasure coding directly in the application layer (cmd/erasure-*.go, backed by klauspost/reedsolomon) rather than depending on RAID or a filesystem feature is a strong pattern for a storage system that needs the same redundancy guarantees on any commodity disks, in any cloud, with no special hardware. Making IAM state swappable between local storage and etcd (cmd/iam-object-store.go versus cmd/iam-etcd-store.go) behind one interface is a good template for scaling from a single node to a coordinated cluster without a rewrite. Depending on native client libraries for half a dozen messaging systems (Kafka, NATS, NSQ, RabbitMQ, MQTT) for bucket notifications, rather than one generic outbound webhook, maximizes compatibility with existing infrastructure but is a meaningfully larger dependency and maintenance surface than a single HTTP callback would be — worth it for a widely deployed storage product, less so for a smaller project with one or two known consumers.
Sources & repo audit
- go.mod (Go, etcd, LDAP/OIDC, erasure coding, cloud tiering, messaging clients)
- Dockerfile (release image copying prebuilt binaries)
- README.md (archived and no-longer-maintained notice, AIStor redirection)
- .github/workflows/helm-lint.yml (Helm chart lint workflow)
- .github/workflows/mint.yml (S3 API compliance test suite)
Independent analysis of repository at github.com/minio/minio. Spotted an inaccuracy? Use the claim form to request a correction.
Show this stack on your README or website
[](https://stackitfast.com/project/minio)Paste it into your README. It shows your current stack and links to this page.
Scaffold it with your agent
Paste this prompt into Claude Code, Cursor, Windsurf or AGY to start a project with MinIO's architecture.
- 1Copy the promptThe full markdown spec, with every layer and decision.
- 2Open your AI toolClaude Code, Cursor, Windsurf or Copilot, in a new repo.
- 3Paste and scaffoldUse it as the first instruction; review before you ship.
# MISSION: Scaffold "MinIO" Production Architecture
You are an expert Senior Staff Software Architect and Full-Stack Engineer. Your mission is to scaffold and implement a production-grade, highly reliable, and modular codebase following the proven architecture of **MinIO**.
---
## 1. PROJECT SPECIFICATIONS & BENCHMARK
- **Reference Architecture**: MinIO
- **What It Does**: MinIO is a Go implementation of the S3 API: an erasure-coded object store (klauspost/reedsolomon) with optional etcd-backed distributed IAM, LDAP and OpenID Connect identity integration, and tiering to Azure Blob Storage or Google Cloud Storage.
- **Domain & Category**: High-Performance S3 Object Storage
- **Production Scale**: 20+ people
- **Development Mode**: CLASSIC
- **Architectural Rationale**: Implementing erasure coding, IAM, and multi-protocol event notifications directly in the Go server, instead of delegating to RAID or an external message broker, keeps a deployment to a single binary while still integrating with existing enterprise identity and messaging systems through native client libraries.
- **Live Website Reference**: https://min.io
- **Source Repository**: https://github.com/minio/minio
---
## 2. PRODUCTION TECH STACK
- **Full Stack Array**: Go, S3, Docker, Prometheus, Kubernetes
- **Primary Language(s)**: Go
- **License of the reference repo**: AGPL-3.0
- **Backend & APIs**: Go — Implements the entire server, including the S3 API handlers under cmd/.; Erasure coding (Reed-Solomon) — Encodes objects across drives for redundancy and self-healing, implemented in cmd/erasure-*.go.; etcd — Optional distributed backend for IAM and configuration state alongside the local object store.; LDAP — External identity provider integration for admin-managed users and groups.; OpenID Connect — External identity provider integration via OIDC, alongside LDAP, for admin authentication.
- **Data & persistence**: S3 — MinIO implements Amazon's S3 API directly; this is the primary object storage protocol it serves.; Azure Blob Storage — Tiering target for moving colder objects out of local erasure sets.; Google Cloud Storage — Tiering target alongside Azure Blob Storage for cold object data.; Event notification targets — Publishes bucket events to Kafka, NATS, NSQ, RabbitMQ, MQTT, Redis, MySQL, PostgreSQL, and Elasticsearch.
- **Infrastructure & deploy**: Docker — Release image copies prebuilt platform binaries into a minimal container.; Kubernetes — Ships a Helm chart, linted in CI, for cluster deployment.; Prometheus — Exposes cluster, drive, and API metrics through the built-in metrics endpoints.
- **Tooling, testing & ops**: GitHub Actions — Runs Go linting, resiliency and healing test suites, and dependency vulnerability checks.; Mint — MinIO's own S3-API compliance test suite, run in CI against built server binaries.
---
## 3. KEY ARCHITECTURAL DECISIONS (audited from https://github.com/minio/minio @ 7aac2a2)
1. **The project is now archived with an explicit deprecation notice**: GitHub marks the repository archived, and README.md opens with a callout stating this repository is no longer maintained, pointing users to AIStor Free and AIStor Enterprise as replacements, so the audited commit reflects the final state of the community-maintained server rather than an actively developed one.
2. **IAM and config state can be distributed via etcd, not only local disk**: go.mod depends directly on go.etcd.io/etcd/api/v3 and client/v3, and cmd/iam-etcd-store.go implements an etcd-backed IAM store alongside cmd/iam-object-store.go, so multi-node deployments can centralize identity and policy state in etcd instead of each node holding it independently.
3. **Enterprise identity integrates through LDAP and OpenID Connect**: go.mod depends on go-ldap/ldap and coreos/go-oidc, and cmd/admin-handlers-idp-ldap.go and cmd/admin-handlers-idp-openid.go implement dedicated admin API handlers for each, so external identity providers plug in through standard protocols rather than a MinIO-specific directory service.
4. **Data redundancy is application-level erasure coding, not RAID**: go.mod depends on klauspost/reedsolomon, and cmd/erasure-encode.go, cmd/erasure-decode.go, and cmd/erasure-healing.go implement Reed-Solomon encoding and self-healing across drives in Go, so redundancy is handled by the MinIO process itself rather than a hardware or filesystem RAID layer.
5. **Tiering targets other object stores rather than a proprietary cold format**: go.mod depends on cloud.google.com/go/storage and github.com/Azure/azure-sdk-for-go/sdk/storage/azblob, so colder data can move to Google Cloud Storage or Azure Blob Storage using their native SDKs instead of a MinIO-specific archive format.
6. **Bucket notifications fan out to general-purpose messaging systems**: go.mod depends directly on IBM/sarama (Kafka), nats-io/nats-server and nats.go, nsqio/go-nsq, rabbitmq/amqp091-go, and eclipse/paho.mqtt.golang, so bucket event notifications are implemented as native clients for each of these systems rather than one generic webhook mechanism.
---
## 4. NON-NEGOTIABLE ARCHITECTURAL GUARDRAILS
1. **Monorepo & Modular Separation**:
- Structure as a Turborepo monorepo with strict package boundaries:
- `apps/web`: Application UI, routing, layouts, and server endpoints.
- `packages/ui`: Shared design tokens, CSS variables, and Radix UI primitive components.
- `packages/db`: Database schemas, client singleton, declarative migrations, and seed scripts.
- `packages/config`: Shared TypeScript, ESLint, and build configurations.
2. **Strict Type Safety & Zero `any` Policy**:
- Enable `strict: true`, `noImplicitAny: true`, and `strictNullChecks: true`.
- Validate ALL external inputs, API request bodies, and query parameters with **Zod** schemas before execution.
3. **Frontend & Rendering Guidelines**:
- Isolate interactive UI state to leaf components. Keep core pages lightweight and performant.
4. **Design System & Aesthetics**:
- Keep every color, radius, shadow and font in a single token file (CSS variables) and consume tokens everywhere; never hardcode hex values in components.
- Prefer crisp 1px borders and one subtle shadow scale over blurry default shadows. Pair one sans-serif for body/headings with one monospace for tags, badges, metrics, and code.
5. **Data Layer & Reliability**:
- Write declarative schema definitions with foreign keys, composite indexes on queried filters, and automated timestamp triggers.
- Use connection pooling and prepared statements for serverless database execution.
---
## 5. STEP-BY-STEP SCAFFOLDING ROADMAP
- **Phase 1: Workspace & Root Config**: Initialize package manager, monorepo configuration (`turbo.json`, `tsconfig.base.json`, `package.json`).
- **Phase 2: Database Schema & Client**: Set up the data layer (S3, Azure Blob Storage, Google Cloud Storage, Event notification targets): client, connection pool, models, and migration scripts.
- **Phase 3: Design Tokens & UI Primitives**: Build accessible `Button`, `Input`, `Card`, `Badge`, and layout wrappers inside `packages/ui`.
- **Phase 4: Core Application Routes & Handlers**: Implement primary authentication, user session handling, and application routes.
- **Phase 5: Quality Assurance & Build Verification**: Run `tsc --noEmit`, ESLint, Prettier, and smoke test suites to ensure zero compilation or runtime errors.
---
## 6. EXECUTION INSTRUCTIONS
1. Review all specifications, architectural guardrails, and stack choices above.
2. Present the full monorepo directory tree structure.
3. Systematically generate the complete, production-ready codebase according to the 5-phase roadmap above — starting with the root workspace setup, followed by the database schema, UI design system package, and full-stack application routes until the repository is fully scaffolded and ready to run.Frequently asked about MinIO
What is MinIO built with?
MinIO is written in Go (go.mod), implementing the S3 API directly in cmd/api-*.go, with Reed-Solomon erasure coding (klauspost/reedsolomon) for data redundancy and an optional etcd (go.etcd.io/etcd) backend for distributed IAM and configuration state.
Does MinIO need a backend?
No, MinIO is the backend: it is an object storage server, not a client library. An optional embedded web console ships as a separate MinIO-maintained module (github.com/minio/console) rather than a distinct application server in this repository.
Can I self-host MinIO?
The source in this commit can still be built from source with go install github.com/minio/minio@latest, per README.md, but as of this audit the upstream GitHub repository is archived and its README states the project is no longer maintained, directing new users to AIStor Free or AIStor Enterprise instead.
Which external systems can MinIO send bucket event notifications to?
go.mod depends directly on client libraries for Kafka (IBM/sarama), NATS and NATS Streaming, NSQ, RabbitMQ (amqp091-go), and MQTT (eclipse/paho.mqtt.golang), alongside database-backed targets such as MySQL, PostgreSQL, Redis, and Elasticsearch.
Does MinIO support enterprise identity providers?
Yes. go.mod depends on go-ldap/ldap and coreos/go-oidc, and cmd/admin-handlers-idp-ldap.go and cmd/admin-handlers-idp-openid.go implement dedicated LDAP and OpenID Connect integration in the admin API.
One email a month: new deep dives and stack trends
New source-audited architectures, head-to-head comparisons and the monthly stack report. No spam, unsubscribe anytime.
Similar architectures
- SeaweedFSClassicDistributed Blob & File Storage · 2-5 PeopleShares Go · Docker · Kubernetes
- RustFSClassicS3-Compatible Object Storage · 20+ peopleShares S3 · Docker · Kubernetes
- GarageClassicGeo-Distributed Object Storage Engine · 2-5 PeopleShares S3 · Prometheus · Docker
- DragonflyClassicMulti-Threaded In-Memory Key-Value Store · 20+ PeopleShares Go · Docker
- HasuraClassicInstant GraphQL Engine & Unified Data Access · 20+ peopleShares Go · Docker
- Mage AIHybridData Pipeline Engine · 6-20 peopleShares Docker · Kubernetes