n8n en Queue Mode con Redis y Docker

Resumen

Montar n8n en Queue Mode es el paso lógico cuando quieres llevar tus workflows a producción sin que un solo contenedor cargue con todo. Aquí aprendes a configurar n8n con Redis como sistema de colas y Postgres como base de datos externa, separando un nodo main y un worker para escalar ejecuciones de forma ordenada.

La idea es sencilla: el main recibe webhooks y triggers, encola los jobs en Redis y los workers los procesan en paralelo. Postgres guarda los datos persistentes como workflows y ejecuciones.

¿Qué necesito antes de configurar n8n en Queue Mode?

Partimos de los ficheros .env y docker-compose.yml de la clase anterior. Sobre esa base añadimos las piezas que faltan para producción.

Lo primero es generar una clave de encriptación robusta para proteger las credenciales que guardará n8n. Puedes usar openssl desde tu terminal o entrar a randomkeygen.com y copiar una encryption key de 256 bits.

Esa clave la pegas en tu .env bajo la variable N8N_ENCRYPTION_KEY. Con eso aseguras que cualquier credencial almacenada quede cifrada.

¿Qué es el Queue Mode en n8n? Es el modo de ejecución pensado para producción. Separa el contenedor que recibe triggers (main) de los que procesan workflows (workers), usando Redis como cola intermedia.

¿Cómo configuro los servicios en docker-compose?

El docker-compose.yml pasa de tener dos servicios a cuatro: Postgres, Redis, n8n-main y n8n-worker. Cada uno con su rol claro.

¿Cómo añado Redis como sistema de colas?

Redis es el corazón de la cola. Estos son los parámetros básicos del servicio:

  • image: redis:6 como versión estable.
  • container_name: n8n_redis para identificarlo.
  • restart: always para que se reinicie ante fallos.
  • Puerto 6379:6379 mapeado al host.
  • Volumen ./redis_data:/data para persistencia.

La carpeta local redis_data guarda los datos del contenedor para que la cola sobreviva a reinicios.

¿Qué variables necesita el servicio main?

El servicio que antes se llamaba n8n ahora pasa a n8n-main. No cambia su estructura, pero sí las variables de entorno que indican el modo de operación.

Las variables clave que añades son:

  • EXECUTION_MODE=queue para indicar que opera en modo cola.
  • QUEUE_BULL_REDIS_HOST=redis apuntando al servicio Redis.
  • QUEUE_BULL_REDIS_PORT=6379 para coincidir con el puerto expuesto.
  • N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} desde el .env.
  • N8N_BASIC_AUTH_ACTIVE=true, N8N_BASIC_AUTH_USER=admin y N8N_BASIC_AUTH_PASSWORD=admin para proteger el editor.
  • N8N_RUNNERS_ENABLED=true para habilitar los runners que ejecutan code nodes.
  • OFFLOAD_MANUAL_EXECUTIONS_TO_WORKER=true para que las ejecuciones manuales viajen al worker y no saturen el main.

Con OFFLOAD_MANUAL_EXECUTIONS_TO_WORKER evitas cargar el contenedor principal cuando pruebas workflows desde el editor.

¿Cómo defino el servicio worker?

La forma rápida es duplicar todo el bloque de n8n-main, renombrarlo a n8n-worker y ajustar tres cosas. Mantén la misma imagen, el mismo restart y las mismas variables de conexión a Postgres y Redis.

Los cambios específicos del worker:

  • container_name: n8n-worker (cuidado con duplicar el nombre del main, eso lanza un error de conflicto al hacer docker compose up).
  • command: worker --concurrency=1 para indicarle que es worker y cuántas ejecuciones simultáneas acepta. El límite habitual ronda las 20.
  • depends_on: [redis, postgres] igual que el main.
  • Añadir N8N_WORKER_MODE=true al final de las variables.
  • Eliminar la exposición del puerto 5678, porque el worker no necesita estar accesible desde Internet.
  • Sumar el volumen redis_data que creaste en el servicio Redis.

El flag --concurrency=1 define cuántos jobs procesa ese worker a la vez. Si subes a 5, ese worker correrá 5 ejecuciones en paralelo.

¿Cómo verifico que el Queue Mode está funcionando?

Lanzas todo con docker compose up y revisas los logs de cada contenedor. En Docker Desktop puedes hacer clic en cada servicio para ver su salida en tiempo real.

Las señales de que todo arrancó bien son:

  • El main muestra la URL http://localhost:5678.
  • El worker registra un JavaScript task runner.
  • Redis indica ready to accept connections.
  • Postgres confirma que está aceptando conexiones.

Después entras al editor en localhost:5678, te registras con un correo y contraseña, y creas un workflow de prueba.

¿Cómo pruebo que los workers reciben jobs?

Un truco práctico para ver la cola en acción: arma un workflow con un nodo Cron que dispare cada segundo y un nodo Wait que espere 15 segundos antes de cerrar.

Como cada ejecución tarda 15 segundos pero entran nuevas cada segundo, los jobs se acumulan. Si tu concurrency es 1, verás varias ejecuciones en estado pending esperando turno.

¿Cómo veo la cola de Redis? Conéctate al data source de Redis en localhost:6379 sin usuario ni contraseña, despliega lists y busca bull:jobs:active y bull:jobs:wait. Ahí están los jobs activos y en espera.

Si esas dos listas aparecen, tu instalación de n8n en Queue Mode está completa. En los logs del worker verás mensajes tipo job 1 started, job 2 started, confirmando que está tomando tareas de la cola.

¿Cómo escalo a más workers?

Aquí viene la parte divertida. Con un solo comando puedes multiplicar la capacidad de procesamiento:

bash docker compose up --scale n8n-worker=3

Cambia el número por los workers que quieras. Cada uno se conecta a la misma Redis y reparte la carga automáticamente. Toma una captura cuando lo tengas corriendo y déjala en los comentarios para ver hasta dónde llegaste.