AI Self-Hosted con Ollama: LLM locali per il tuo homelab

2026-04-01T10:00:00.000Z

Perché AI self-hosted

Eseguire modelli AI localmente offre vantaggi concreti per un SysAdmin:

  • Privacy totale — i tuoi dati non escono dall'infrastruttura
  • Costo zero — nessuna API key, nessun abbonamento
  • Offline — funziona anche senza internet
  • Personalizzabile — puoi fare fine-tuning sui tuoi dati
  • Velocità — con GPU dedicata, latenza bassissima

Hardware consigliato

| Configurazione | RAM GPU | Modelli supportati | Note | |---------------|---------|-------------------|------| | Entry (RX580 4GB) | 4 GB | 3B-7B quantizzati | Risposta lenta | | Mid (RTX 3080 10GB) | 10 GB | 7B-13B | Buona velocità | | Il mio setup | NVIDIA A10 24GB | 14B-34B | Ottimo per produzione | | High-end (A100 80GB) | 80 GB | 70B completo | Enterprise |


Installazione Ollama

# Linux (una riga)
curl -fsSL https://ollama.com/install.sh | sh

# Verifica
ollama --version

# Avvia servizio
systemctl enable ollama
systemctl start ollama

Configurazione per accesso remoto

# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_ORIGINS=*"

systemctl daemon-reload
systemctl restart ollama

Modelli consigliati

# Modelli generali
ollama pull llama3.1:8b          # 5GB — veloce, buona qualità
ollama pull llama3.1:70b         # 40GB — qualità elevata
ollama pull mistral:7b           # 4GB — ottimo per italiano

# Modelli specializzati
ollama pull deepseek-r1:14b      # 9GB — ragionamento complesso
ollama pull deepseek-coder:6.7b  # 4GB — generazione codice
ollama pull llava:13b            # 8GB — analisi immagini (multimodale)
ollama pull nomic-embed-text     # 274MB — embedding per RAG

# Lista modelli installati
ollama list

# Rimuovi modello
ollama rm nome-modello

API REST

Ollama espone un'API compatibile OpenAI su porta 11434:

# Chat completion
curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1:8b",
    "messages": [
      {"role": "system", "content": "Sei un assistente IT esperto."},
      {"role": "user", "content": "Come configuro il firewall su Ubuntu?"}
    ]
  }'

# Generazione embedding
curl http://localhost:11434/v1/embeddings \
  -H "Content-Type: application/json" \
  -d '{"model": "nomic-embed-text", "input": "testo da embeddare"}'

Integrazione con n8n

Workflow: analisi log automatica

// Nodo "Code" in n8n - Analisi log con AI
const logs = $input.first().json.logs;

const response = await $http.post('http://192.168.1.20:11434/v1/chat/completions', {
  model: 'llama3.1:8b',
  messages: [
    {
      role: 'system',
      content: 'Sei un esperto di sicurezza informatica. Analizza i log e identifica anomalie, possibili attacchi o errori critici. Rispondi in italiano.'
    },
    {
      role: 'user',
      content: `Analizza questi log:\n\n${logs}`
    }
  ],
  max_tokens: 500
});

return [{ json: { 
  analisi: response.choices[0].message.content,
  timestamp: new Date().toISOString()
}}];

Workflow: generazione script PowerShell

// Genera script PS da descrizione naturale
const task = $input.first().json.task;

const response = await $http.post('http://192.168.1.20:11434/v1/chat/completions', {
  model: 'deepseek-coder:6.7b',
  messages: [
    {
      role: 'system',
      content: 'Sei un esperto PowerShell. Genera script completi, sicuri e commentati. Usa solo cmdlet standard.'
    },
    {
      role: 'user', 
      content: `Scrivi uno script PowerShell per: ${task}`
    }
  ]
});

return [{ json: { script: response.choices[0].message.content }}];

Open WebUI: interfaccia ChatGPT-like

# docker-compose.yml
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://192.168.1.20:11434
    volumes:
      - open-webui:/app/backend/data
    restart: always

volumes:
  open-webui:

RAG: rispondi con i tuoi documenti

RAG (Retrieval-Augmented Generation) permette al modello di rispondere basandosi su documenti specifici (manuali, procedure, documentazione interna).

# Esempio base con Python
import ollama
import chromadb

# Indicizza documenti
client = chromadb.Client()
collection = client.create_collection("docs")

# Aggiungi documenti
collection.add(
    documents=["Procedura onboarding...", "Policy sicurezza..."],
    ids=["doc1", "doc2"]
)

# Query
results = collection.query(query_texts=["come creo un nuovo utente?"], n_results=2)
context = "\n".join(results["documents"][0])

# Genera risposta con contesto
response = ollama.chat(model='llama3.1:8b', messages=[
    {"role": "system", "content": f"Rispondi basandoti su: {context}"},
    {"role": "user", "content": "Come creo un nuovo utente?"}
])
print(response['message']['content'])

Monitoring performance

# Temperatura e utilizzo GPU NVIDIA
nvidia-smi --query-gpu=temperature.gpu,utilization.gpu,memory.used,memory.total \
  --format=csv -l 5

# Log Ollama
journalctl -u ollama -f

# Benchmark velocità (token/sec)
time ollama run llama3.1:8b "Scrivi una procedura per hardening Linux" --verbose

Best Practice

  • Quantizzazione Q4/Q8 — bilancio qualità/velocità ottimale per homelab
  • Modello separato per task specifici — coder per codice, llama per testo
  • Temperature bassa (0.1-0.3) per task tecnici, alta (0.7-0.9) per creatività
  • System prompt specifico — definisce il comportamento del modello
  • Timeout ragionevole — modelli grandi possono essere lenti al cold start
  • Non esporre l'API Ollama su internet senza autenticazione

Risorse