DEV Community

Alex Spinov
Alex Spinov

Posted on

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

AWS S3 costs money. Cloudflare R2 has limits. MinIO gives you S3-compatible object storage on YOUR server — same API, same SDKs, zero cloud bills. Run it for free and use any S3 client library.

What MinIO Gives You for Free

  • S3-compatible API — use AWS SDK, any S3 client
  • Unlimited storage — limited only by your disk
  • High performance — written in Go, designed for speed
  • Console UI — web-based file manager
  • Bucket notifications — webhooks on upload/delete
  • Versioning — keep file history
  • Encryption — server-side and client-side
  • Docker or binary — single binary, no dependencies

Quick Start

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

Console at http://localhost:9001, API at http://localhost:9000.

Use With AWS SDK (Same Code as S3)

import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';

const s3 = new S3Client({
  endpoint: 'http://localhost:9000',
  region: 'us-east-1',
  credentials: {
    accessKeyId: 'admin',
    secretAccessKey: 'password123'
  },
  forcePathStyle: true
});

// Upload
await s3.send(new PutObjectCommand({
  Bucket: 'uploads',
  Key: 'photos/sunset.jpg',
  Body: fileBuffer,
  ContentType: 'image/jpeg'
}));

// Download
const { Body } = await s3.send(new GetObjectCommand({
  Bucket: 'uploads',
  Key: 'photos/sunset.jpg'
}));
Enter fullscreen mode Exit fullscreen mode

Same code works with AWS S3 — just change the endpoint.

Presigned URLs (Direct Upload From Browser)

import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const uploadUrl = await getSignedUrl(s3, new PutObjectCommand({
  Bucket: 'uploads',
  Key: `user-uploads/${userId}/${filename}`,
}), { expiresIn: 3600 });

// Send this URL to the frontend
// Frontend uploads directly to MinIO — no server proxy needed
Enter fullscreen mode Exit fullscreen mode

Use Cases

  • App file storage — user uploads, avatars, documents
  • Backup storage — database backups, log archives
  • Data lake — store raw data for analysis
  • Static assets — serve images, CSS, JS
  • Development — local S3 replacement for testing

MinIO vs S3 vs Cloudflare R2 vs Backblaze B2

Feature MinIO AWS S3 Cloudflare R2 Backblaze B2
Price Free (self-hosted) $0.023/GB/mo $0.015/GB/mo $0.006/GB/mo
Egress Free $0.09/GB Free Free (with CF)
S3 compatible 100% Native 99% 90%
Self-hosted Yes No No No
Console UI Built-in AWS Console Dashboard Dashboard
Setup 1 minute N/A N/A N/A

The Verdict

MinIO is S3 on your own hardware. Same API, same SDKs, zero cloud bills. Perfect for development, self-hosted apps, and anyone who wants S3-compatible storage without the AWS invoice.


Need help building production web scrapers or data pipelines? I build custom solutions. Reach out: spinov001@gmail.com

Check out my awesome-web-scraping collection — 400+ tools for extracting web data.

Top comments (0)