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"
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'
}));
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
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)