Saltar al contenido
homelab@casa:~/servidor
~$homelabista

// AUTOMATIZACIÓN

n8n autoalojado: automatiza tu homelab (guía)

Qué es n8n, cuánto ocupa de verdad en un mini PC y cómo montarlo en Docker sin exponerlo. Con medidas propias y los avisos que suelta al arrancar.

14 min de lecturaGonzalo
  • #n8n
  • #automatización
  • #docker
  • #self-hosted
  • #homelab
n8n autoalojado en un homelab: un motor de automatizaciones corriendo en Docker sobre un mini PC de bajo consumo, sin cuota por ejecución y sin que los datos salgan de casa

El 27 de julio dejó de llegarme un resumen que llevaba cinco días llegando puntual a las ocho de la mañana. No me di cuenta. Lo descubrí hoy, mirando otra cosa, cuando pedí el historial de ejecuciones y me salió esto:

13  error    2026-07-31T06:00:23Z  trigger
12  error    2026-07-30T06:00:23Z  trigger
11  error    2026-07-29T06:00:23Z  trigger
10  error    2026-07-28T06:00:23Z  trigger
 9  error    2026-07-27T06:00:23Z  trigger
 8  success  2026-07-26T06:00:23Z  trigger

Cinco días fallando a la misma hora, con el mismo error, y en ningún momento me enteré. Esa es la primera cosa honesta que hay que decir de n8n: automatizar en casa es fácil, y darte cuenta de que tu automatización se ha roto es lo difícil. Vuelvo a ello al final, porque la causa era buena.

Esta guía va de montar n8n en tu propio servidor: qué es, cuánto pesa de verdad (medido, no de la web oficial), el docker-compose.yml con el que lo tengo corriendo, los avisos que suelta al arrancar y cuáles de ellos importan.

[aff]Hay enlaces de afiliado más abajo: si compras algo desde ellos me llevo una pequeña comisión y a ti no te cuesta ni un céntimo más. En calidad de Afiliado de Amazon, obtengo ingresos por las compras adscritas que cumplen los requisitos aplicables.

Qué es n8n, en una frase

n8n es un motor de automatizaciones: encadenas bloques —lee de aquí, transforma esto, manda aquello— y se ejecutan solos, por horario o cuando algo los dispara. Si has oído hablar de Zapier o de Make, es la misma idea, con dos diferencias que cambian el cálculo por completo: lo instalas en tu propia máquina, y no te cobran por ejecución.

Ese segundo punto es el que engancha a la gente del homelab. En los servicios de nube la unidad de cobro es la tarea ejecutada, así que una automatización que se dispara cada cinco minutos se convierte en una suscripción. En tu servidor, dispararla cada cinco minutos cuesta lo que cuesten esos ciclos de CPU, que en un mini PC de bajo consumo es aproximadamente nada.

El precio a pagar es que ahora eres tú quien lo mantiene. Y quien se entera de que lleva cinco días roto, o no.

las tres piezas de un flujo
tu servidor · contenedor n8nDisparadorhorario o webhookNodosleen y transformanEntregamensaje, fichero, APIcuándo se ejecutadónde se rompe casi siemprelo único que tú ves

Un flujo son tres cosas: qué lo arranca, qué hace por el camino y dónde deja el resultado. El del medio es el que se rompe.

Lo que ocupa de verdad en un mini PC

Aquí es donde la mayoría de guías te dicen “es ligero” y siguen. Los números de mi instancia, medidos hoy sobre un Intel N100, con la versión 2.30.7:

$ docker stats --no-stream n8n
NAME   CPU %   MEM USAGE / LIMIT     MEM %
n8n    0.15%   317.1MiB / 1.5GiB     20.64%

Esos 317 MiB son recién arrancado. Después de siete horas y media en marcha con un solo flujo activo, sin tocar nada, la misma orden daba 382 MiB. Crece un poco y se estabiliza; no lo he visto dispararse, pero tampoco tiene pinta de bajar solo.

Arrancar en frío le cuesta 8,3 segundos desde que el contenedor se levanta hasta que la interfaz responde. A partir de ahí, la web contesta en 13 milisegundos en red local. La base de datos, después de doce días funcionando, ocupa 1,9 MB. Eso no es una errata: SQLite guardando flujos, credenciales y el historial de ejecuciones cabe en un correo con foto.

Donde n8n sí es gordo es en disco de imagen: n8nio/n8n:latest pesa 1.420 MB descomprimida. Casi un giga y medio de contenedor para un motor de automatizaciones. Si vas justo de SSD en el servidor, tenlo en cuenta antes que la RAM.

Para situarlo, en esa misma máquina y en el mismo instante: el servidor de Immich, la alternativa autoalojada a Google Fotos, estaba en 292 MiB; Portainer, en 12 MiB. O sea que n8n en reposo come más que un gestor de fotos con biblioteca cargada. No es un servicio que puedas colar en una Raspberry Pi de 2 GB junto a otras seis cosas y olvidarte.

El compose con el que lo tengo corriendo

Esto es literalmente mi fichero, con la clave sacada a un .env aparte:

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    mem_limit: 1536m
    memswap_limit: 1536m
    ports:
      - "10.8.0.5:5678:5678"
    environment:
      - GENERIC_TIMEZONE=Europe/Madrid
      - TZ=Europe/Madrid
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_SECURE_COOKIE=false
      - N8N_RUNNERS_ENABLED=true
      - N8N_DIAGNOSTICS_ENABLED=false
      - N8N_PERSONALIZATION_ENABLED=false
      - N8N_HIRING_BANNER_ENABLED=false
      - DB_SQLITE_POOL_SIZE=3
    volumes:
      - n8n_data:/home/node/.n8n
volumes:
  n8n_data:

Tres decisiones que no vienen en la documentación oficial y que sí explico:

El mem_limit. Está ahí por una mala experiencia previa con otro servicio en esta misma máquina: algo se desmadró de memoria, el kernel salió a matar procesos y se llevó por delante cosas que no tenían nada que ver. Un tope duro convierte “se cae el servidor entero” en “se cae n8n”. Si el contenedor muere solo, ya sabes exactamente qué mirar.

El bind a una IP concreta. Fíjate en que el puerto no es 5678:5678 a secas, sino 10.8.0.5:5678:5678. Esa IP es la de mi interfaz de WireGuard, así que el panel solo existe dentro de la VPN. Desde la red de casa, desde fuera o desde cualquier otra cosa, ese puerto no está abierto. Es una línea de texto y te ahorra el 90 % de los sustos.

N8N_ENCRYPTION_KEY fijada a mano. n8n cifra las credenciales que guardas dentro con esa clave. Si no la pones, se genera sola y vive dentro del volumen; el día que restaures un backup en otra máquina sin ella, tus credenciales son ruido. Ponla tú, guárdala donde guardes las contraseñas, y el backup vuelve a ser un backup.

Un detalle que se me ha quedado viejo, y lo dejo escrito porque es la clase de cosa que pasa: mi compose todavía trae N8N_RUNNERS_ENABLED=true, y al arrancar la propia n8n te avisa de que esa variable ya no hace falta. La quitaré en la próxima revisión. Que la configuración se vaya oxidando sola es normal; leer los avisos del arranque de vez en cuando, también debería serlo.

Cómo se ve un flujo por dentro

Este es el flujo que llevaba cinco días fallando, tal cual sale en mi instancia:

Editor de flujos de n8n autoalojado: un disparador por horario a las 08:00 y un webhook alimentan un nodo que consulta la API de Hacker News, otro que da formato al resumen y un último nodo que lo envía por Telegram
Captura del editor en mi instancia. Dos disparadores a la izquierda, tres nodos de trabajo y el envío al final.

Se lee de izquierda a derecha. A la izquierda, dos formas de arrancarlo: un horario diario y un webhook, por si quiero lanzarlo a mano desde otro sitio. En medio, una llamada a la API de Hacker News y un nodo de código que convierte la respuesta en un resumen legible. A la derecha, el envío por Telegram.

Cuatro nodos. Se monta en un rato y no hay que escribir casi nada, que es justo el atractivo y también la trampa: como cuesta tan poco montarlo, acabas con quince flujos y ninguna idea de cuál se rompió.

Los avisos del arranque, y cuáles importan

Cuando levantas n8n suelta un buen párrafo de texto. Estos son los míos, en vivo, y qué hacer con cada uno:

«Failed to start Python task runner. Python 3 is missing from this system.» La imagen oficial no trae Python. Si vas a usar nodos de código en JavaScript —lo normal—, esto te da igual. Si querías escribir Python dentro de los flujos, ahí tienes el motivo de que no te funcione.

Cinco avisos de variables obsoletas. No son errores, son cambios de valor por defecto anunciados: el tiempo máximo de una tarea va a bajar de 5 minutos a 1, los límites de descompresión de ficheros van a estrecharse, y un par de variables desaparecen. Si te apoyas en alguno de esos valores, fíjalo explícitamente ahora y no el día que actualices y algo deje de ir.

getaddrinfo EAI_AGAIN api.n8n.io. Este merece un párrafo aparte. Yo tengo la telemetría desactivada (N8N_DIAGNOSTICS_ENABLED=false), y aun así el arranque intenta llamar a api.n8n.io para refrescar un registro de servidores MCP. No es telemetría, es catálogo, y falla sin consecuencias si no hay salida a internet. Pero conviene saberlo: desactivar diagnósticos no es lo mismo que dejar la instancia muda.

SQLite o PostgreSQL

Por defecto, n8n guarda todo en SQLite, un fichero suelto dentro del volumen. Opcionalmente admite PostgreSQL configurando unas variables de entorno, y así lo documenta la guía oficial de bases de datos.

Mi opinión, que va contra el consejo habitual de foro: quédate en SQLite. Un fichero de 1,9 MB después de doce días te dice el tamaño real del problema en una casa.

Y ojo, que aquí casi meto la pata yo: iba a escribirte que un Postgres al lado te cuesta un buen pellizco de memoria, fui a comprobarlo antes de afirmarlo y resulta que los dos contenedores de Postgres que corren en esta misma máquina, cada uno con su aplicación encima, gastan 16 y 17 MiB. O sea que el argumento de la RAM no vale. El que sí vale es más aburrido: otro contenedor que actualizar, otro backup que cuadrar y un punto de fallo nuevo, para una base de datos que en tu caso cabe en un disquete. El cambio compensa cuando tienes muchos flujos ejecutándose a la vez y empiezas a ver bloqueos de escritura, o cuando montas n8n en modo escalado con varios trabajadores. Eso no es un homelab, es una empresa pequeña.

Lo que sí tienes que hacer, uses lo que uses, es podar el historial de ejecuciones. Guardar cada ejecución completa de un flujo que corre cada cinco minutos infla ese fichero rápido.

La licencia, que no es exactamente código abierto

Un matiz que se pasa por alto y que a mí me parece de justicia contar. n8n no es software libre en el sentido clásico: usa la Sustainable Use License, una licencia de modelo fair-code creada por ellos. Te da derecho a usar, modificar, crear obras derivadas y redistribuir, con limitaciones; la primera de ellas es que puedes usarlo «solo para tus propios fines internos de negocio, o para uso personal o no comercial». Está escrito así en su documentación de licencia.

Para lo que tú y yo vamos a hacer con ello —automatizar cosas de casa, o de tu propio negocio— cae de lleno dentro de lo permitido y es gratis. Lo que no puedes es coger n8n y montar con él un servicio de automatización para vender a terceros. Me parece razonable, pero prefiero que lo sepas por mí y no por un correo de abogados.

Volviendo a los cinco días de silencio

El error de las cinco ejecuciones fallidas era siempre el mismo, en el mismo nodo:

node: HN self-hosted
msg:  The DNS server returned an error, perhaps the server is offline

No era Hacker News, ni el flujo, ni n8n. Cuando fui a mirar el contenedor, estaba sin red de Docker: docker inspect devolvía la lista de redes vacía y no había nada escuchando en su puerto, pese a que docker ps lo daba por Up y la base de datos estaba intacta. Un contenedor a medio conectar es peor que uno caído, porque uno caído se nota.

Y aquí va el detalle que me costó un rato: docker restart no lo arregló. El contenedor volvía a levantarse igual de aislado. Lo que lo arregló fue recrearlo:

$ cd ~/n8n && docker compose up -d
 Container n8n Recreated
 Container n8n Started

$ docker exec n8n node -e "require('dns').lookup('hn.algolia.com',(e,a)=>console.log(e?e.code:a))"
34.160.168.181

Reiniciar reutiliza la configuración de red que el contenedor ya tenía rota; recrearlo la vuelve a pedir de cero. Me lo apunto, porque la próxima vez que algo esté Up y no funcione, esa va a ser mi primera prueba.

Qué hardware pide

Poco, con matices. Un procesador modesto le sobra: los flujos son ráfagas de trabajo de segundos, y entre ráfaga y ráfaga n8n se queda en un 0,15 % de CPU. Lo que quieres es RAM y un disco decente, por ese giga y medio de imagen y por los 300-400 MB que ocupa en marcha.

Un mini PC con Intel N100 o N150 y 16 GB va sobradísimo, y es la máquina que yo pondría: silenciosa, de bajo consumo y con margen para todo lo demás que acabarás metiéndole. El Beelink S12 Pro con N100 es el caballo de batalla típico de esta gama; si además quieres almacenamiento serio en la misma caja, el Beelink ME Mini con sus seis ranuras M.2 cambia el planteamiento por completo. Para comparar por consumo y precio antes de decidir, tienes el comparador de mini PC con filtro de vatios, y la factura anual está calculada en la guía de cuánto cuesta un servidor encendido todo el año.

¿Y una Raspberry Pi? Funciona, y hay imagen para ARM. Pero con 300-400 MB solo para n8n y otro tanto para lo que ya tengas encima, en un modelo de 4 GB vas apretado y en uno de 2 GB no me metería. Si la Pi es tu única máquina y ya lleva domótica y descargas, esta pieza pídesela a otra.

// preguntas frecuentes

Preguntas frecuentes

¿n8n autoalojado es gratis?
Sí para uso personal y para los fines internos de tu propio negocio. Usa la Sustainable Use License, de modelo fair-code, que permite usar, modificar y redistribuir con limitaciones; la principal es que no puedes ofrecerlo como servicio de automatización a terceros. No es una licencia de código abierto en el sentido clásico.
¿Cuánta RAM necesita n8n?
Medido en un Intel N100 con la versión 2.30.7: 317 MiB recién arrancado y 382 MiB tras siete horas y media con un flujo activo. Reserva 1 GB si vas a usarlo en serio. La imagen de Docker ocupa además unos 1.420 MB en disco, que suele ser la restricción olvidada.
¿Puedo usar n8n en una Raspberry Pi?
Hay imagen para ARM y funciona, pero entre la imagen de disco y los 300-400 MB de memoria en marcha, en una Pi de 2 GB va justo y en una de 4 GB compartida con otros servicios se nota. En un mini PC x86 con 16 GB ni te enteras.
¿Necesito PostgreSQL o me vale SQLite?
SQLite, que es lo que trae por defecto, aguanta de sobra un uso doméstico: tras doce días de funcionamiento la base de datos ocupaba 1,9 MB. PostgreSQL compensa cuando ejecutas muchos flujos en paralelo y aparecen bloqueos de escritura, o si montas n8n en modo escalado con varios trabajadores. No lo descartes por consumo de memoria: medido en esta máquina, un contenedor de Postgres en marcha se mueve en 16-17 MiB.
¿Es seguro exponer n8n a internet?
No sin protección delante. n8n almacena las credenciales de todos los servicios que conectas, así que el panel es la llave de todo. Publícalo solo en tu red local, bíndalo a la IP de tu VPN o ponle un proxy inverso con autenticación. Nunca el puerto 5678 abierto directamente.
¿Cómo me entero de que un flujo ha fallado?
Por defecto no te enteras: la ejecución queda marcada como error en el historial y ahí se queda. Configura un flujo de error en los que te importen, o monta uno que consulte periódicamente las ejecuciones fallidas y te avise. Es lo primero que deberías montar, antes que la automatización en sí.

Mi veredicto después de doce días: n8n compensa si ya tienes una máquina encendida a todas horas y se te acumulan tareas repetitivas que hoy haces a mano. Instalarlo son cinco minutos y montar el primer flujo, veinte. Lo que de verdad cuesta es la disciplina de vigilar que sigan funcionando, y en eso la herramienta no te ayuda gran cosa: eso lo pones tú.