CLOUD
Guides

MinIO: S3-Compatible Object Storage on Your Server

CLOUD|April 16, 2026|2 min read|771 views
MinIO: S3-Compatible Object Storage on Your Server

Instead of paying for external cloud storage. MinIO gives you the same API on your Saudi server. Your data under your control. We explain setup.

MinIO: S3-Compatible Storage on Your Server

MinIO is an open-source object storage solution fully compatible with the S3 API. Run it on your own server and get the same benefits as Amazon S3 but with full control and no variable invoices.

Why MinIO Instead of S3?

Amazon S3 (for Saudi files — eu-west-1):
├── Storage: $0.023/GB/month
├── External data transfer: $0.09/GB
├── Requests: $0.0004/1,000 requests
└── Data on servers outside Saudi Arabia

MinIO on كلاود VPS:
├── Storage cost included in VPS price
├── No fees on internal data transfer
├── Data in Riyadh or Jeddah
└── 100% S3-compatible API

Choose S3 when: You need Amazon's reliability and can absorb variable cost. Choose MinIO when: Data is sensitive, cost must be fixed, and a server already exists.

Quick Installation

Using Docker (Fastest)

docker run -d \
 --name minio \
 -p 9000:9000 \
 -p 9001:9001 \
 -v /data/minio:/data \
 -e MINIO_ROOT_USER=admin \
 -e MINIO_ROOT_PASSWORD=YourStrongPassword123! \
 --restart unless-stopped \
 quay.io/minio/minio server /data --console-address ":9001"

# Verify
curl http://localhost:9000/minio/health/live
# Should return: 200 OK

Using Docker Compose

version: '3.8'
services:
 minio:
 image: quay.io/minio/minio:latest
 ports:
 - "9000:9000"
 - "9001:9001"
 volumes:
 - /data/minio:/data
 environment:
 MINIO_ROOT_USER: admin
 MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
 command: server /data --console-address ":9001"
 restart: unless-stopped

Nginx for MinIO

server {
 listen 443 ssl http2;
 server_name storage.yourcompany.com;
 
 ssl_certificate /etc/letsencrypt/live/storage.yourcompany.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/storage.yourcompany.com/privkey.pem;
 
 location / {
 proxy_pass http://localhost:9000;
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 
 client_max_body_size 1000M;
 proxy_buffering off;
 proxy_request_buffering off;
 }
}

Integration with Laravel

// config/filesystems.php
'minio' => [
 'driver' => 's3',
 'key' => env('MINIO_ACCESS_KEY'),
 'secret' => env('MINIO_SECRET_KEY'),
 'region' => 'us-east-1',
 'bucket' => env('MINIO_BUCKET'),
 'endpoint' => env('MINIO_ENDPOINT'),
 'use_path_style_endpoint' => true, // Required for MinIO
],
// Upload file
Storage::disk('minio')->put('avatars/' . $filename, $fileContent);

// Temporary URL (valid for 30 minutes)
$url = Storage::disk('minio')->temporaryUrl('avatars/' . $filename, now->addMinutes(30));

// Delete file
Storage::disk('minio')->delete('avatars/' . $filename);

MinIO for AI

# Python - MinIO integration for model storage
import boto3

s3_client = boto3.client(
 's3',
 endpoint_url='https://storage.yourcompany.com',
 aws_access_key_id='admin',
 aws_secret_access_key='password',
 region_name='us-east-1'
)

# Upload an AI model
s3_client.upload_file('llama3-8b.gguf', 'ai-models', 'llama3/llama3-8b.gguf')

# Download model when needed
s3_client.download_file('ai-models', 'llama3/llama3-8b.gguf', '/tmp/model.gguf')

This is exactly what gets installed in the AI Hosting template on كلاود (cloud.net.sa) — MinIO + PostgreSQL + pgvector in one ready package.

Conclusion

MinIO solves the large file storage problem on VPS: instead of filling the disk with files, you use a separate, scalable object storage. Full S3 API compatibility means no code changes if you decide to migrate to S3 in the future.

Share