Tools: MinIO Has a Free API — S3-Compatible Object Storage You Can Self-Host (2026)
AWS S3 API, But Free and On Your Server
Setup (Docker)
Python (boto3 — Same as AWS S3!)
JavaScript
Real Use Cases
MinIO vs AWS S3 MinIO is S3-compatible object storage you can run anywhere. Same API as AWS S3, but free and open-source. Dashboard at localhost:9001. API at localhost:9000. Same code works with AWS S3 — just change the endpoint_url. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse
$ -weight: 500;">docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=admin \ -e MINIO_ROOT_PASSWORD=password123 \ minio/minio server /data --console-address ":9001"
-weight: 500;">docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=admin \ -e MINIO_ROOT_PASSWORD=password123 \ minio/minio server /data --console-address ":9001"
-weight: 500;">docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=admin \ -e MINIO_ROOT_PASSWORD=password123 \ minio/minio server /data --console-address ":9001"
import boto3 s3 = boto3.client("s3", endpoint_url="http://localhost:9000", aws_access_key_id="admin", aws_secret_access_key="password123") # Create bucket
s3.create_bucket(Bucket="my-files") # Upload
s3.upload_file("report.pdf", "my-files", "reports/2026/report.pdf") # Download
s3.download_file("my-files", "reports/2026/report.pdf", "downloaded.pdf") # List objects
for obj in s3.list_objects_v2(Bucket="my-files")["Contents"]: print(f"{obj[Key]}: {obj[Size]} bytes")
import boto3 s3 = boto3.client("s3", endpoint_url="http://localhost:9000", aws_access_key_id="admin", aws_secret_access_key="password123") # Create bucket
s3.create_bucket(Bucket="my-files") # Upload
s3.upload_file("report.pdf", "my-files", "reports/2026/report.pdf") # Download
s3.download_file("my-files", "reports/2026/report.pdf", "downloaded.pdf") # List objects
for obj in s3.list_objects_v2(Bucket="my-files")["Contents"]: print(f"{obj[Key]}: {obj[Size]} bytes")
import boto3 s3 = boto3.client("s3", endpoint_url="http://localhost:9000", aws_access_key_id="admin", aws_secret_access_key="password123") # Create bucket
s3.create_bucket(Bucket="my-files") # Upload
s3.upload_file("report.pdf", "my-files", "reports/2026/report.pdf") # Download
s3.download_file("my-files", "reports/2026/report.pdf", "downloaded.pdf") # List objects
for obj in s3.list_objects_v2(Bucket="my-files")["Contents"]: print(f"{obj[Key]}: {obj[Size]} bytes")
import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; const s3 = new S3Client({ endpoint: "http://localhost:9000", region: "us-east-1", credentials: { accessKeyId: "admin", secretAccessKey: "password123" }, forcePathStyle: true
}); await s3.send(new PutObjectCommand({ Bucket: "my-files", Key: "hello.txt", Body: "Hello World"
}));
import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; const s3 = new S3Client({ endpoint: "http://localhost:9000", region: "us-east-1", credentials: { accessKeyId: "admin", secretAccessKey: "password123" }, forcePathStyle: true
}); await s3.send(new PutObjectCommand({ Bucket: "my-files", Key: "hello.txt", Body: "Hello World"
}));
import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; const s3 = new S3Client({ endpoint: "http://localhost:9000", region: "us-east-1", credentials: { accessKeyId: "admin", secretAccessKey: "password123" }, forcePathStyle: true
}); await s3.send(new PutObjectCommand({ Bucket: "my-files", Key: "hello.txt", Body: "Hello World"
})); - Development/testing without AWS costs
- On-premises file storage for regulated industries
- Backup target for databases
- Media storage for self-hosted apps
- Data lake for analytics