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

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 -d e controlla i log con docker compose logs -f per verificare che tutti i servizi partano correttamente
  • Carica qwen2.5:7b come primo modello — bilancia bene qualità e velocità su CPU — poi valuta llama3.3:70b se 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