1 de sept de 20261.488 palabras7 min de lectura
n8n self-hosted en Coolify
Cómo desplegar n8n en Coolify con PostgreSQL, ponerlo detrás de tu propio dominio o de un Cloudflare Tunnel, configurar las variables de entorno que hacen funcionar los webhooks y mantenerlo sano con el tiempo.

Introducción
n8n es una herramienta de automatización de workflows: conectás disparadores (un webhook, un cron, una fila nueva en una base de datos) con acciones (mandar un mensaje, llamar a una API, correr un poco de JavaScript) uniendo nodos en un editor visual. Pensá en Zapier o Make, pero que podés correr en tu propio servidor.
Hacerlo self-hosted tiene sentido por varias razones. Los planes hosteados cobran por ejecución, mientras que la versión self-hosted no tiene ese límite y es gratis para uso propio bajo su licencia fair-code. Tus datos y credenciales quedan en tu máquina. Y es un único contenedor de Docker con una base de datos al lado, que es exactamente el tipo de cosa en la que Coolify es bueno.
En este artículo te muestro cómo desplegar n8n en Coolify con una base de datos PostgreSQL, ponerlo detrás de tu propio dominio, dejar bien las variables de entorno para que los webhooks funcionen y probar un primer workflow. Se apoya en mi post sobre cómo instalar Coolify, y si seguiste el de Cloudflare Tunnels, también hay una sección para vos.
Para esta guía asumo que ya tenés una instancia de Coolify corriendo en un servidor Linux y un dominio, o un subdominio, que podés apuntar a ella.
Qué necesitás
- Un servidor con Coolify instalado. n8n en sí es liviano, pero tené en cuenta que cada ejecución de un workflow se guarda en la base de datos, así que dejale algo de lugar:
2 GBde RAM van cómodos para uso personal. - Un dominio para el editor, por ejemplo
n8n.example.com. Los webhooks son la razón principal para tener n8n online, y los servicios de terceros solo van a llamar a una URL pública con HTTPS. - Diez minutos.
Creando el servicio
Coolify trae n8n como servicio de un clic, así que no hay que escribir ningún compose. Andá a Projects, abrí tu proyecto y entorno, hacé clic en + New y escribí n8n en el buscador. Vas a ver dos variantes: n8n a secas, que guarda todo en un archivo SQLite, y n8n with PostgreSQL. Elegí la de PostgreSQL.
SQLite funciona, pero n8n escribe una fila por cada ejecución y sus datos, y ese archivo crece rápido y se vuelve lento de compactar. PostgreSQL lo maneja sin quejarse, y es la base de datos que n8n recomienda para cualquier cosa que no sea una prueba rápida. Coolify crea los dos contenedores por vos, los conecta en la misma red privada y genera la contraseña de la base de datos.
Una vez creado el servicio caés en su página. El compose que lo define está ahí mismo en el editor, y podés retocarlo después; por ahora, fijate en las dos cosas que importan:
- El volumen montado en
/home/node/.n8n. Ahí n8n guarda su configuración y la clave de cifrado que protege todas las credenciales que guardes. Aparece en la pestaña Persistent Storage y tiene que sobrevivir a los redeploys. - Las variables mágicas como
SERVICE_FQDN_N8N. Coolify las completa a partir del dominio que configures en el servicio, y el template las usa para decirle a n8n cuál es su URL pública.
Configurando el dominio
En la página del servicio, buscá el contenedor de n8n y configurale el dominio. Cómo lo escribís depende de cómo esté expuesto tu servidor.
Con un servidor público
Si tu servidor tiene IP pública y Coolify se encarga del TLS, como en mi primer post, configurá el dominio como https://n8n.example.com y creá el registro DNS correspondiente si no cae ya dentro de tu wildcard. Traefik pide el certificado de Let's Encrypt en el primer deploy:
n8n.example.com A IP_DE_TU_SERVIDORDetrás de un Cloudflare Tunnel
Si tus apps pasan por un tunnel, aplica la regla del post anterior: configurá el dominio en Coolify como http://n8n.example.com (http plano, el TLS termina en Cloudflare) y agregá un public hostname en Zero Trust apuntando a localhost:80, o coolify-proxy:80 si tu conector corre como contenedor.
Configurando el entorno
Abrí la pestaña Environment Variables del servicio. El template ya configura lo esencial, pero hay un puñado de variables que vale la pena agregar o cambiar antes del primer deploy:
# URL pública que n8n anuncia (necesaria detrás de un tunnel, inofensiva si no)
N8N_PROTOCOL=https
N8N_EDITOR_BASE_URL=https://n8n.example.com/
WEBHOOK_URL=https://n8n.example.com/
# Confiar en el proxy delante de n8n (Traefik, más Cloudflare si lo usás)
N8N_PROXY_HOPS=1
# Tu zona horaria, para los schedules y los nodos de fecha
GENERIC_TIMEZONE=America/Argentina/Buenos_Aires
TZ=America/Argentina/Buenos_Aires
# Clave con la que se cifran las credenciales guardadas. Generala una vez, guardala para siempre.
N8N_ENCRYPTION_KEY=<UNA_CADENA_LARGA_AL_AZAR>
# Evitar que la tabla de ejecuciones crezca sin límite (en horas)
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168
# Correr los nodos Code en un proceso aparte, como recomienda n8n
N8N_RUNNERS_ENABLED=trueLa clave de cifrado la podés generar en cualquier máquina con openssl rand -hex 32. Lo que nos lleva a la única cosa que de verdad no querés perder:
Desplegando
Apretá Deploy y mirá los logs. Coolify descarga las dos imágenes, levanta primero PostgreSQL y después n8n, que corre sus migraciones de base de datos en el primer arranque. Cuando el contenedor aparece como healthy, abrí tu dominio.
La primera pantalla te pide crear la cuenta de owner: email, nombre y contraseña. Después de esto no hay un registro aparte, así que hacelo enseguida. Más adelante podés invitar usuarios desde Settings -> Users.
Poniéndolo a prueba
Un webhook es la forma más rápida de comprobar que toda la cadena funciona, desde internet hasta el contenedor y de vuelta. Creá un workflow nuevo, agregá un disparador Webhook, dejá el método en GET y copiá la URL de prueba que muestra. Hacé clic en Listen for test event y llamala desde tu computadora:
curl -i https://n8n.example.com/webhook-test/TU_RUTA_DE_WEBHOOKEl nodo debería iluminarse en el editor con los detalles de la solicitud, y la terminal debería recibir un 200. Dos cosas para revisar en esa salida:
- La URL que copiaste empieza con
https://n8n.example.com. Si dice http,WEBHOOK_URLno se está tomando. - La respuesta es un
200, no un301ni un308. Una redirección significa que quien mande un POST va a perder el payload.
Ahora agregá un segundo nodo, por ejemplo Respond to Webhook con un mensaje fijo, guardá y pasá el workflow a Active. La URL de producción pierde el sufijo -test:
curl https://n8n.example.com/webhook/TU_RUTA_DE_WEBHOOKSi te vuelve tu mensaje, tenés un servidor de automatización funcionando. Cualquier cosa que pueda hacer una solicitud HTTP ahora puede disparar un workflow.
Manteniéndolo sano
- Actualizaciones: n8n saca versiones seguido y sus versiones menores pueden incluir migraciones de base de datos. En el editor del compose, fijá la imagen a una versión en vez de latest, y cuando quieras actualizar, leé las release notes, cambiá el tag y volvé a desplegar. Volver atrás es entonces solo cambiar el tag de vuelta.
- Backups: la base de datos es el estado. Hacé backup del volumen de PostgreSQL, o de la base en sí, de forma programada, y guardá la clave de cifrado junto con él. Un extra barato es exportar tus workflows como JSON desde adentro del contenedor con el comando de abajo y mandar los archivos a donde quieras.
- Ejecuciones: si la base de datos sigue creciendo, bajá
EXECUTIONS_DATA_MAX_AGEo configurá a nivel de workflow que guarde solo las ejecuciones fallidas. La mayoría de las veces no necesitás el payload de cada corrida exitosa.
docker exec -it <CONTENEDOR_N8N> n8n export:workflow --all --output=/home/node/.n8n/workflows-backup.json¡Eso es todo! Tenés n8n corriendo en tu propio servidor, accesible por HTTPS, con sus credenciales cifradas con una clave que controlás vos. Desde acá podés conectarlo con lo que ya tengas corriendo en Coolify (una base de datos, una API, este blog) y empezar a automatizar las partes aburridas. Cuando una sola instancia deje de alcanzar, el siguiente paso es el queue mode de n8n con Redis y contenedores worker, que también encaja bien en un servicio compose de Coolify.

