MinIO: storage S3-compatible self-hosted per sviluppatori e aziende
MinIO è un object storage compatibile con le API Amazon S3, ma gira su un tuo server. Setup Docker in 5 minuti, bucket policy, integrazione con Python/FastAPI, backup e RAG AI.
Pubblicato: 3 giugno 2025
Se usi AWS S3 per storage di file, puoi replicare esattamente la stessa interfaccia sul tuo server con MinIO. Boto3, le SDK S3 di qualsiasi linguaggio, i client AWS CLI — funzionano tutti senza modifiche al codice. Cambi solo l’endpoint. Costo: zero.
Setup Docker in 5 minuti
Un docker-compose.yml minimo per avere MinIO con console web:
services:
minio:
image: minio/minio:latest
command: server /data --console-address ":9001"
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=password123
volumes:
- minio_data:/data
ports:
- "9000:9000" # API S3
- "9001:9001" # Console web
restart: unless-stopped
volumes:
minio_data:
docker compose up -d, poi apri http://localhost:9001, accedi con admin/password123, crea un bucket. L’API S3 è disponibile su localhost:9000. In produzione cambia la password e metti Caddy davanti per HTTPS.
Tre casi d’uso reali
Backup automatici da script Python. Hai uno script che genera report o export CSV. Invece di salvarli sul filesystem, li mandi su MinIO con boto3:
import boto3
s3 = boto3.client(
's3',
endpoint_url='http://localhost:9000',
aws_access_key_id='admin',
aws_secret_access_key='password123'
)
s3.upload_file('report.pdf', 'backups', 'reports/2025-06-03/report.pdf')
# Download
s3.download_file('backups', 'reports/2025-06-03/report.pdf', 'local_copy.pdf')
Il codice funziona identico su AWS S3 reale: cambia solo endpoint_url. Zero lock-in.
Upload file in app FastAPI. Endpoint multipart che riceve un file e lo salva su MinIO:
from fastapi import FastAPI, UploadFile
import boto3
app = FastAPI()
s3 = boto3.client('s3', endpoint_url='http://minio:9000',
aws_access_key_id='admin', aws_secret_access_key='password123')
@app.post("/upload")
async def upload(file: UploadFile):
s3.upload_fileobj(file.file, 'uploads', file.filename)
return {"key": file.filename}
I file restano su MinIO, l’app non tiene niente in locale, e puoi scalare a più istanze FastAPI senza problemi di stato.
Source di documenti per RAG AI. Open WebUI si connette a MinIO tramite le sue impostazioni S3 (vedi la guida sullo stack AI self-hosted). Carichi i documenti aziendali nel bucket, Open WebUI li indicizza e il modello locale può rispondere a domande su di essi. Tutto in rete locale.
Bucket policy: public vs private
Per bucket con asset statici accessibili pubblicamente (immagini, CSS, font), imposta la policy da console o via API:
mc alias set local http://localhost:9000 admin password123
mc anonymous set public local/static-assets
Per bucket con documenti aziendali, mantieni la policy private (default) e genera URL pre-firmati con scadenza per condivisione temporanea:
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': 'documents', 'Key': 'contratto.pdf'},
ExpiresIn=3600 # URL valido 1 ora
)
L’URL funziona senza autenticazione per 3600 secondi, poi scade. Utile per mandare link a clienti o colleghi senza esporre il bucket.
Cosa fare
- Avvia MinIO con
docker compose up -d, crea un buckettestdalla console sulocalhost:9001, e fai un upload/download con boto3 usandoendpoint_url='http://localhost:9000'per verificare che tutto funzioni - Sostituisci il salvataggio su filesystem in almeno uno script Python esistente con upload su MinIO — ti accorgerai subito del vantaggio in termini di accesso da macchine multiple
- Se usi Open WebUI, collega il bucket MinIO come storage S3 nelle impostazioni e carica 3-4 PDF aziendali per testare il RAG su documenti reali