Salta al contenuto
AImpact
IT EN
Infrastruttura AI 6 min di lettura

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 bucket test dalla console su localhost:9001, e fai un upload/download con boto3 usando endpoint_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