DEV Community

Alex Spinov
Alex Spinov

Posted on

MinIO Has a Free Tier — S3-Compatible Object Storage You Can Self-Host Anywhere

A data engineer I know was spending $400/month on AWS S3 for internal analytics data. Not public-facing. Not customer data. Just internal CSVs and Parquet files that five people accessed. I asked why he didn't self-host his object storage.

Six months later, he runs MinIO on a $10 Hetzner server. Same S3 API. Same tools (boto3, aws-cli). $390/month saved.

What You Get Free

MinIO is open-source (AGPLv3) and free to self-host. No usage limits — only your hardware:

  • 100% S3-compatible API — every S3 SDK, tool, and library works unchanged
  • Unlimited storage — limited only by your disks
  • Unlimited bandwidth — no egress fees
  • Erasure coding — data protection without RAID
  • Versioning — keep every version of every object
  • Lifecycle policies — auto-delete old data
  • Server-side encryption — SSE-S3, SSE-KMS
  • Multi-site replication — sync between datacenters
  • Console UI — web dashboard for management
  • Prometheus metrics — built-in monitoring

Quick Start

# Single binary — download and run
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio

# Start with a data directory
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=secretpassword
./minio server /data --console-address ":9001"

# API: http://localhost:9000
# Console: http://localhost:9001
Enter fullscreen mode Exit fullscreen mode

Or with Docker:

docker run -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=admin \
  -e MINIO_ROOT_PASSWORD=secretpassword \
  -v /data:/data \
  minio/minio server /data --console-address ":9001"
Enter fullscreen mode Exit fullscreen mode

Real Example: Upload Files with Python

from minio import Minio

client = Minio(
    "localhost:9000",
    access_key="admin",
    secret_key="secretpassword",
    secure=False
)

# Create bucket
client.make_bucket("my-data")

# Upload file
client.fput_object("my-data", "report.csv", "/path/to/report.csv")

# Generate presigned URL (valid 1 hour)
url = client.presigned_get_object("my-data", "report.csv")
print(url)

# List objects
for obj in client.list_objects("my-data"):
    print(f"{obj.object_name}: {obj.size} bytes")
Enter fullscreen mode Exit fullscreen mode

Every boto3 script, aws-cli command, and S3 integration works by changing one line — the endpoint URL.

What You Can Build

1. Private S3 — replace AWS S3 for internal data. Same API, zero egress fees.

2. Backup storage — store server backups, database dumps, log archives. Versioning keeps history.

3. ML data lake — store training data, model artifacts, experiment results. Integrates with MLflow, DVC.

4. Media storage — images, videos, documents for your app. Presigned URLs for secure access.

5. Docker registry backend — use MinIO as storage for a private Docker registry.

Where to Host (Free or Cheap)

  • Hetzner CX22 — €3.79/month, 40GB SSD (expandable with volumes)
  • Oracle Cloud free tier — 200GB block storage, always free
  • Old laptop/Raspberry Pi — MinIO runs on ARM
  • Your existing server — add MinIO as a Docker container

Limits to Know

Single node = no fault tolerance. If the disk dies, data is gone. Use erasure coding (min 4 drives) for production, or just back up to another location.

AGPLv3 license. If you modify MinIO and distribute it, you must open-source your changes. Using it as-is (even commercially) is fine.

Memory usage scales with objects. Billions of tiny files will consume significant RAM for metadata. Fine for millions of files.

S3 Without the S3 Bill

MinIO exists because S3's API is brilliant but S3's pricing is painful. Egress fees, request fees, storage class complexity — it adds up fast for internal workloads.

If your data doesn't need to be on AWS, self-hosted MinIO gives you the same API with predictable costs.


Need data pipeline automation? Email spinov001@gmail.com

More free tiers: 45+ Free APIs Every Developer Should Bookmark

Top comments (0)