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
- Ollama.com — libreria modelli e documentazione
- Open WebUI — interfaccia web
- LLM Leaderboard
- Ollama API Docs