Ollama / Gemma 4 — Self-Hosted AI Guide
Ollama / Gemma 4 — Self-Hosted AI Guide
Fecha evaluación: 06-04-2026 Estado: Validado localmente, pendiente despliegue en servidor dedicado Aplicable a: Auto-Plan AI (visión) + CNS/Sentinel (texto)
1. Contexto y Motivación
La API de Gemini Flash 3 es el proveedor principal de IA en CreaRack. Sin embargo:
- Coste escalable: 4-5 EUR/mes en testing. Con N clientes SaaS, el coste crece linealmente (~5 EUR/cliente/mes).
- Data leakage: Los planos de datacenter y datos SNMP de clientes viajan a servidores de Google.
- Dependencia de vendor: Google ha subido precios recientemente y puede deprecar modelos.
Solución evaluada: Gemma 4 (modelo open-source de Google) corriendo en Ollama (self-hosted), con migración futura a vLLM para producción.
2. Resultados de la Evaluación
Subsistemas validados
| Subsistema | Tipo | Resultado | Tiempo (CPU laptop) | Tiempo estimado (EPYC server) |
|---|---|---|---|---|
| CNS/Sentinel | Texto (troubleshooting) | Correcto | 1.7s (warm) | <1s |
| Auto-Plan | Visión (análisis de planos) | Correcto | 2-3 min | 15-30s |
Hardware de pruebas
- Intel i7 13th Gen (16 hilos), sin GPU dedicada
- Modelo:
gemma4Q4_K_M (8B params, 9.6 GB en disco) - RAM consumida: 4-5 GB sostenido, pico 7 GB en arranque
- CPU: hasta 90% con perfil optimizado (14 threads)
Análisis de costes
| Escenario | Gemini API | Ollama self-hosted (Hetzner CCX33) |
|---|---|---|
| 1 cliente | ~5 EUR/mes | 35 EUR/mes (fijo) |
| 7 clientes | ~35 EUR/mes | 35 EUR/mes (breakeven) |
| 50 clientes | ~250 EUR/mes | 35 EUR/mes |
| 200 clientes | ~1000 EUR/mes | 35 EUR/mes |
Breakeven: 7 clientes activos.
3. Arquitectura Implementada
Toggle de proveedores (ya funcional)
.env
│
┌────────┴────────┐
│ │
AUTOPLAN_PROVIDER EDGE_AI_PROVIDER
(Auto-Plan AI) (CNS/Sentinel)
│ │
┌──────┼──────┐ ┌─────┼──────┐
│ │ │ │ │ │
gemini deepseek ollama gemini claude ollama
Ambos subsistemas soportan cambio de proveedor via variables de entorno, sin cambios de código.
Archivos clave
| Archivo | Propósito |
|---|---|
monitoring/services/ai_providers/ollama.py | OllamaProvider para CNS (async, aiohttp) |
monitoring/services/ai_providers/__init__.py | Factory con ollama registrado |
blueprints/services/autoplan.py | _analyze_with_ollama() para Auto-Plan (visión) |
blueprints/api/autoplan.py | Soporte provider ollama sin API key |
config/settings/base.py | OLLAMA_BASE_URL, OLLAMA_MODEL |
.env / .env.example | Toggle documentado |
Variables de entorno
| Variable | Valores | Default | Descripción |
|---|---|---|---|
AUTOPLAN_PROVIDER | gemini, deepseek, ollama | gemini | Proveedor para Auto-Plan AI |
EDGE_AI_PROVIDER | gemini, claude, ollama, static | gemini | Proveedor para CNS/Sentinel |
OLLAMA_BASE_URL | URL | http://localhost:11434 | Endpoint de Ollama |
OLLAMA_MODEL | string | gemma4 | Modelo de Ollama a usar |
4. Cómo Cambiar de Gemini a Ollama
Paso 1: Instalar Ollama y modelo
# Instalar Ollama (ver ollama.com)
# Descargar modelo base
ollama pull gemma4
# Crear perfil optimizado (16K contexto, 14 threads)
printf 'FROM gemma4\nPARAMETER num_ctx 16384\nPARAMETER num_thread 14' > Modelfile
ollama create gemma4-16k -f Modelfile
Paso 2: Configurar .env
# Cambiar providers
AUTOPLAN_PROVIDER=ollama
EDGE_AI_PROVIDER=ollama
OLLAMA_BASE_URL=http://host.docker.internal:11434 # Docker local
# OLLAMA_BASE_URL=http://10.0.0.X:11434 # Servidor dedicado
OLLAMA_MODEL=gemma4-16k
Paso 3: Reiniciar
docker compose restart web
Volver a Gemini
Cambiar en .env:
AUTOPLAN_PROVIDER=gemini
EDGE_AI_PROVIDER=gemini
5. Configuración de Ollama
Contexto (num_ctx)
| Perfil | Contexto | RAM aprox. | Uso recomendado |
|---|---|---|---|
gemma4 (default) | 4K | 3.5 GB | Solo CNS (texto corto) |
gemma4-16k | 16K | 4-5 GB | CNS + Auto-Plan |
gemma4-32k | 32K | 5-7 GB | No recomendado en CPU (35s por query) |
El contexto de 4K por defecto de Ollama es insuficiente para Auto-Plan (prompt largo + imagen). Usar siempre un perfil con 16K+.
Threads (num_thread)
Ollama por defecto usa ~5-6 hilos. Para aprovechar el hardware:
PARAMETER num_thread 14 # Para 16 hilos (dejar 2 para OS)
Cold start vs Warm
- Cold start (modelo no cargado): 60-160s dependiendo del contexto
- Warm (modelo en RAM): 1-2s para texto, 2-3 min para visión (CPU)
Ollama descarga el modelo tras 5 min de inactividad. Para evitarlo: keep_alive: -1 o llamada periódica.
6. Plan de Producción (Fase 2)
Servidor recomendado
| Opción | Specs | Precio | Rendimiento esperado |
|---|---|---|---|
| Hetzner CCX33 | 8 vCPU EPYC, 32 GB RAM | ~35 EUR/mes | 3-5x más rápido que laptop |
| Hetzner CCX43 | 16 vCPU EPYC, 64 GB RAM | ~70 EUR/mes | Margen para 2 modelos |
| GPU dedicada | NVIDIA A10/A30 | ~200+ EUR/mes | 10-20x, visión en <15s |
vLLM vs Ollama para producción
Edu ha decidido usar vLLM en lugar de Ollama para producción:
| Característica | Ollama | vLLM |
|---|---|---|
| Facilidad de uso | Excelente | Buena |
| Concurrencia | Limitada | Continuous batching |
| GPU utilization | Básica | PagedAttention (optimal) |
| API | OpenAI-compatible | OpenAI-compatible |
| Multi-request | Secuencial | Paralelo |
Zero cambios de código: vLLM expone la misma API OpenAI-compatible. Solo cambia OLLAMA_BASE_URL.
Arquitectura de red recomendada
┌─────────────────────────────┐
│ Hetzner Server 1 (actual) │
│ Django + PG + Valkey + VM │
│ │ │
│ Red privada Hetzner │
│ │ │
│ Hetzner Server 2 (nuevo) │
│ vLLM + Gemma 4 │
│ http://10.x.x.x:8000/v1/ │
└─────────────────────────────┘
Comunicación por red privada: <1ms latencia, sin tráfico externo, sin coste de bandwidth.
7. Lecciones Aprendidas
- Contexto por defecto de Ollama = 4K: Insuficiente para prompts largos. Siempre crear perfiles custom.
extra_body={"num_ctx": N}no funciona via endpoint/v1/(OpenAI-compatible). Usar perfiles Ollama.- Visión en CPU limitada por ancho de banda de RAM, no por cores. Más threads ayuda poco.
- Daphne
application-close-timeout: Debe ser 300s si se usa Ollama (requests de visión tardan minutos). - Gemma 4 envuelve JSON en triple backticks: El parser debe hacer strip de
```json ```. - Precalentar modelo: Primera llamada tras carga = 60-160s. Llamadas posteriores = 1-2s (texto).
Mantenido por: Equipo CreaRack Última actualización: 06-04-2026
Véase también
- [[crearack-tech—guides—gemini-api-setup]] — setup de Gemini API
- [[decision—20260401—gemini-3-flash-preview]] — ADR modelo Gemini fijo
- [[crearack-tech—backend—auto-plan-technical-reference]] — referencia técnica de Auto-Plan AI
- [[crearack-tech—agents—dev-cns]] — perfil de subagente dev-cns
- [[crearack-tech—agents—dev-map-editor]] — perfil de subagente dev-map-editor
- [[crearack-tech—architecture—saas-strategy-2026]] — estrategia SaaS 2026