Desplegando n8n + IA Local + WordPress: Noticias Automáticas en un VPS de 6€


Si estás aquí es porque quieres montar un sistema de noticias que funcione solo, pero no tienes un presupuesto de la NASA.

Pues escucha bien, porque vamos a exprimir un VPS estándar de 2 vCPUs y 4 GB de RAM hasta que pida clemencia.

Mi servidor de pruebas es lo suficientemente barato para que no te duela el bolsillo y lo suficientemente potente para que Ollama no se ahogue… si sabes cómo domarlo. Coste: 6 €/mes. Ni una caña con tapa en Madrid.

El motor: Instalar Ollama y el modelo Phi-3

No te compliques la vida con compilaciones eternas. Usa el instalador oficial para Linux:

 curl -fsSL https://ollama.com/install.sh | sh

Con 4 GB de RAM, Phi-3 Mini es tu mejor elección. Es un modelo de 3.8B parámetros que vuela en CPUs limitadillas. Olvídate de Llama-3 de 8B a menos que quieras ver tu servidor arder. ollama run phi3:mini

Truco de veterano: La primera vez tardará en descargar. Cuando veas el prompt para escribir, pulsa Ctrl+D. El servicio se queda corriendo de fondo.

La instalación de n8n en Docker

Para tener el control total y no ensuciar el sistema, levantamos n8n en un contenedor. Si no tienes Docker, instálalo primero. Luego, lanza esto:

docker run -d --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  --restart always \
  n8nio/n8n

El «Puente» Ollama-Docker

Aquí es donde la mayoría falla. n8n está en un contenedor y Ollama en el host. Para que hablen:

  • Edita el servicio de Ollama: sudo systemctl edit ollama.service
  • Añade esto:
[Service]
Environment="OLLAMA_HOST=0.0.0.0"

  • Reinicia: sudo systemctl daemon-reload && sudo systemctl restart ollama
  • En n8n: Usa la IP de la interfaz de Docker (normalmente http://172.17.0.1:11434).

Preparando WordPress (JWT y Seguridad)

Para que n8n «entre» en tu WordPress sin pedir permiso cada vez, necesitas el plugin «JWT Authentication for WP REST API».

Configuración en wp-config.php: Añade estas líneas para que el token funcione:

define('JWT_AUTH_SECRET_KEY', 'tu-clave-super-secreta-y-larga');
define('JWT_AUTH_CORS_ENABLE', true);

El Setup «Alpha» en n8n

Escucha bien: en n8n no se tiran cables a lo loco. Aquí tienes la anatomía de la bestia:

A. El Nodo LIMIT (El Segurata)

Max Items: 1. Esto es sagrado. Si dejas pasar 20 noticias a la vez, tu VPS de 4GB entrará en pánico y n8n morirá. Una noticia por ejecución = Control total.

B. El Redactor (Ollama + Prompt Pro)

Usa el nodo Basic LLM Chain. Pero ojo con el prompt, o la IA empezará a hablarte de sembrar patatas en una web de tecnología:

"Actúa como redactor jefe de redtietar.es. Escribe una noticia de 200 palabras. TEMA: {{ $json.title }}. DATOS: {{ $json.contentSnippet }}. Sé directo y técnico. No inventes alucinaciones climáticas. Termina con: KEYWORD: [palabra en inglés]."

C. El «Cerebro» (Nodo Code)

Este es el paso que separa a los niños de los hombres. El nodo Code limpia el texto de la IA (quita asteriscos, títulos repetidos) y monta el HTML:

const ai = items[0].json.text;
const rss = $("Limit").first().json;
let cleanBody = ai.replace(/\*\*.*?\*\*/g, "").replace(/KEYWORD:.*/i, "").trim();
return [{ 
  json: { 
    postTitle: rss.title.split(' - ')[0], 
    postContent: `<p>${cleanBody.split('\n').join('</p><p>')}</p>` 
  } 
}];

El Publicador (HTTP Request JWT)

Para el nodo final de WordPress, usa el método POST a /wp-json/wp/v2/posts. Importante: En el Body JSON, usa JSON.stringify para que las comillas no te rompan el invento:

{
  "title": {{ JSON.stringify($json.postTitle) }},
  "content": {{ JSON.stringify($json.postContent) }},
  "status": "publish"
}

Supervivencia del VPS: Swap al rescate

Si Ollama tiene un pico de hambre, la Swap evitará que el sistema mate a n8n. Crea una de 6GB:

sudo fallocate -l 6G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Cuando le des a «Execute Workflow», abre htop en tu terminal. Verás tus 2 CPUs al 100% sudando sangre. Tranquilo, es normal. Tu VPS de 6 pavos está trabajando para ti mientras tú te relajas.

Así ha quedado en mi caso 😀