Stack AI self-hosted completo: Ollama + Open WebUI + MinIO + Caddy
Come costruire uno stack AI privato completo in casa o in azienda: chat con modelli locali, storage file, HTTPS. Un docker-compose.yml che gira su qualsiasi server con 16 GB RAM.
Pubblicato: 3 giugno 2025
Puoi avere un’alternativa privata a ChatGPT, con modelli che non escono dalla tua rete, su un server che già hai. Ci vogliono quattro componenti open source e un singolo docker-compose.yml. Tutto gira comodamente su una macchina con 16 GB di RAM e un SSD da 50 GB.
I quattro componenti
Ollama è il motore che scarica ed esegue i modelli LLM localmente. Espone un’API REST compatibile con OpenAI su localhost:11434. Supporta Qwen2.5, Llama 3.3, Mistral, Gemma 3 e decine di altri.
Open WebUI è l’interfaccia chat che si collega a Ollama. Ha la stessa UX di ChatGPT, gestisce conversazioni multiple, permette l’upload di documenti e si integra con storage S3 (quindi con MinIO).
MinIO è object storage S3-compatible self-hosted. Lo usi per caricare documenti aziendali e fare Q&A su di essi tramite RAG, senza che i file escano dal server.
Caddy fa da reverse proxy con HTTPS automatico. Espone Open WebUI e la console MinIO su domini con certificati Let’s Encrypt, senza toccare certbot.
Il docker-compose.yml completo
services:
ollama:
image: ollama/ollama:latest
volumes:
- ollama_data:/root/.ollama
ports:
- "11434:11434"
networks:
- ai-stack
open-webui:
image: ghcr.io/open-webui/open-webui:main
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- STORAGE_PROVIDER=s3
- S3_ENDPOINT_URL=http://minio:9000
- S3_ACCESS_KEY=admin
- S3_SECRET_KEY=password123
- S3_BUCKET_NAME=open-webui
depends_on:
- ollama
- minio
networks:
- ai-stack
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"
- "9001:9001"
networks:
- ai-stack
caddy:
image: caddy:2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
networks:
- ai-stack
networks:
ai-stack:
volumes:
ollama_data:
minio_data:
caddy_data:
Caddyfile minimo per esporre i due servizi pubblici:
chat.example.com {
reverse_proxy open-webui:8080
}
storage.example.com {
reverse_proxy minio:9001
}
Prerequisiti e primo avvio
Server minimo: Ubuntu 22.04 o 24.04, 16 GB RAM, SSD da 50 GB liberi. Se hai una GPU Nvidia, aggiungi deploy.resources.reservations.devices al servizio Ollama per CUDA — ma anche solo CPU, Qwen2.5-7B risponde in 3-5 secondi per messaggio.
Dopo docker compose up -d, carica il primo modello:
docker exec -it <nome-container-ollama> ollama pull qwen2.5:7b
Oppure fallo direttamente dall’interfaccia Open WebUI in Impostazioni → Modelli. Il modello pesa circa 4,7 GB, si scarica una volta e resta nella volume ollama_data.
RAG con documenti aziendali
Open WebUI si connette a MinIO tramite le variabili d’ambiente S3 che hai già nel compose. Crea un bucket open-webui dalla console MinIO su storage.example.com, poi da Open WebUI vai in Workspace → Knowledge, carica i tuoi PDF e attiva la Knowledge Base in una nuova conversazione.
Il modello risponde citando i documenti che hai caricato. I file restano sul tuo server, nessuna API esterna coinvolta.
Cosa fare
- Avvia lo stack con
docker compose up -de controlla i log condocker compose logs -fper verificare che tutti i servizi partano correttamente - Carica
qwen2.5:7bcome primo modello — bilancia bene qualità e velocità su CPU — poi valutallama3.3:70bse hai GPU con 24 GB VRAM - Crea un bucket MinIO, carica 5-10 documenti aziendali e testa il RAG da Open WebUI per vedere se risponde correttamente alle domande sul contenuto