n8n en un VPS: tu propia plataforma de automatización sin tareas manuales repetitivas
Llega una solicitud desde el sitio web. n8n verifica los datos, busca duplicados, crea una oportunidad, prepara un borrador de respuesta con ayuda de la IA y avisa al responsable por Telegram. Una persona solo interviene cuando hay que tomar una decisión, no para trasladar datos entre pestañas.
A continuación veremos cómo funciona n8n y cómo instalarlo en un VPS con Docker Compose, PostgreSQL, HTTPS y ejecución de código aislada.
n8n en siete pasos
Plan mínimo de puesta en marcha:
- Crea un VPS y apunta un subdominio hacia él, por ejemplo
n8n.example.com. - Instala Docker y Docker Compose.
- Inicia n8n con PostgreSQL, un task runner externo y Caddy.
- Abre la interfaz mediante HTTPS y crea la cuenta del propietario.
- Conecta Telegram, un CRM, el correo electrónico o cualquier API externa.
- Configura el tratamiento de errores y el periodo de conservación de las ejecuciones.
- Automatiza las copias de seguridad de la base de datos, los datos y la clave de cifrado.
Para una pequeña instalación en producción, es razonable empezar con 2 vCPU y 4 GB de RAM. Para las pruebas suelen bastar 2 GB, pero PostgreSQL, Docker y los procesos paralelos consumen rápidamente el margen disponible.
Qué es n8n y cómo funciona
n8n es una plataforma de automatización de flujos de trabajo. Un escenario se construye con nodos: uno inicia el proceso, los siguientes reciben y transforman los datos, y el último ejecuta una acción.
Un workflow sencillo tiene este aspecto:
Webhook → verificación de datos → CRM → Telegram → respuesta al sitio web
La cadena puede activarse mediante un webhook, una programación, un correo, un mensaje o un evento de un servicio externo. Entre los nodos pueden utilizarse condiciones, bucles, filtros, esperas y tratamiento de errores.
Una de las ventajas de n8n es que la automatización no se limita a las integraciones ya preparadas. Cualquier servicio que disponga de una API puede utilizarse mediante HTTP Request, mientras que la lógica especial puede escribirse en un Code node con JavaScript o Python. Por eso n8n se sitúa entre un constructor no-code sencillo y un código de servidor desarrollado desde cero.
Por qué es más que reenviar datos
n8n resulta útil cuando un proceso atraviesa varios sistemas y requiere una decisión:
formulario → verificación → búsqueda de duplicados → evaluación con IA → aprobación del responsable → CRM
La intervención humana puede limitarse a un único punto de control. Por ejemplo, la IA prepara una respuesta, pero el mensaje solo se envía al cliente después de que un empleado lo apruebe.
Escenarios habituales:
- ventas y soporte: recopilación de solicitudes, distribución de leads y creación de oportunidades;
- contenido e IA: preparación de borradores, clasificación de consultas y publicación tras la aprobación;
- DevOps: avisos de fallos, webhooks de Git y comprobaciones de API;
- operaciones internas: sincronización de hojas de cálculo, correo, calendarios y sistemas corporativos.
Una instalación self-hosted permite controlar el proceso y la base de datos, pero no convierte los servicios externos en locales. Los datos enviados a Telegram, un CRM o un modelo de IA en la nube salen del VPS.
n8n Cloud o servidor propio
| Parámetro | n8n Cloud | n8n en un VPS |
|---|---|---|
| Puesta en marcha | Sin configurar un servidor | Requiere dominio, Docker y HTTPS |
| Actualizaciones | Las realiza n8n | Las realiza el propietario |
| Base de datos y archivos | En la infraestructura del servicio | En el servidor elegido |
| Escalado | Según las condiciones del plan en la nube | Se configura de forma independiente |
| Responsabilidad | Menos administración | Las copias, la seguridad y la supervisión dependen del propietario |
| Para quién es adecuado | Inicio rápido sin DevOps | Control, personalización y procesos permanentes |
Community Edition puede alojarse gratuitamente en un servidor propio y utilizarse para procesos personales e internos de una empresa. Sin embargo, n8n no se distribuye bajo una licencia open source clásica, sino mediante el modelo fair-code Sustainable Use License. Esta licencia permite el uso interno y las modificaciones, pero no permite desplegar n8n sin más, añadir un logotipo propio y vender el acceso como un SaaS independiente. Para ese tipo de producto, hay que revisar por separado las condiciones de la licencia.
Requisitos de servidor de n8n
La carga depende del volumen de datos, la concurrencia y el tipo de operaciones. Los archivos, las listas largas, los Code nodes y los flujos con IA necesitan más memoria que el envío de pequeños objetos JSON entre API.
| Escenario | Configuración inicial |
|---|---|
| Pruebas y workflows personales de texto | 1 vCPU, 2 GB de RAM, 20 GB NVMe |
| Pequeña instalación en producción | 2 vCPU, 4 GB de RAM, 25–40 GB NVMe |
| Procesos paralelos, IA o archivos | 4 vCPU, 8 GB de RAM o más |
| Varios procesos worker en queue mode | Cálculo según el número de ejecuciones |
SQLite es adecuado para familiarizarse con la plataforma y para una pequeña instancia individual. Para una instalación en producción, PostgreSQL es más práctico: facilita las copias de seguridad y una futura migración al queue mode.
Cómo instalar n8n en un VPS
En este ejemplo se utilizan Ubuntu 24.04, PostgreSQL, Caddy y un task runner externo. Sustituye n8n.example.com y la zona horaria por tus propios valores.
1. Configura el DNS y prepara el servidor
Crea un registro DNS A que apunte a la dirección IPv4 del VPS y después conéctate mediante SSH:
ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw opensslInstala Docker Engine y el complemento Compose desde el repositorio oficial:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
apt update
apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
docker compose versionAbre únicamente SSH, HTTP y HTTPS:
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enableNo cierres la sesión SSH actual hasta comprobar que una nueva conexión funciona.
2. Crea las variables de entorno
Prepara el directorio:
mkdir -p /opt/n8n
cd /opt/n8nCrea el archivo .env. Los comandos siguientes generan de inmediato distintos secretos aleatorios para PostgreSQL, el cifrado de n8n y el task runner:
cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF
chmod 600 .envLa etiqueta stable resulta cómoda para el primer inicio. Después de verificar la instalación, es mejor fijar una versión concreta de n8n para evitar que una futura actualización de la imagen se produzca de forma inesperada.
No se puede perder N8N_ENCRYPTION_KEY. n8n utiliza esta clave para cifrar las contraseñas, los tokens y otras credenciales guardadas. Si solo se restaura PostgreSQL sin la clave, los registros permanecerán en la base de datos, pero n8n no podrá leerlos.
3. Crea la configuración de Docker Compose
Crea el archivo compose.yaml:
services:
postgres:
image: postgres:18-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
PGDATA: /var/lib/postgresql/data
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: unless-stopped
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: "5432"
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_HOST: ${N8N_HOST}
N8N_PORT: "5678"
N8N_PROTOCOL: https
N8N_EDITOR_BASE_URL: https://${N8N_HOST}
N8N_WEBHOOK_URL: https://${N8N_HOST}/
N8N_PROXY_HOPS: "1"
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
TZ: ${GENERIC_TIMEZONE}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"
N8N_RUNNERS_MODE: external
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: "168"
EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
volumes:
- n8n_data:/home/node/.n8n
expose:
- "5678"
depends_on:
postgres:
condition: service_healthy
n8n-runner:
image: n8nio/runners:${N8N_VERSION}
restart: unless-stopped
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
depends_on:
- n8n
caddy:
image: caddy:2-alpine
restart: unless-stopped
environment:
N8N_HOST: ${N8N_HOST}
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
- n8n
volumes:
postgres_data:
name: n8n_postgres_data
n8n_data:
name: n8n_data
caddy_data:
name: n8n_caddy_data
caddy_config:
name: n8n_caddy_configEl task runner externo ejecuta el código separado del proceso principal de n8n. Es más seguro que el modo interno y reduce la posibilidad de que un error en un Code node afecte al editor y al procesamiento de los webhooks.
4. Activa HTTPS
Crea el archivo Caddyfile:
{$N8N_HOST} {
reverse_proxy n8n:5678
}Caddy obtendrá automáticamente un certificado TLS si el DNS ya apunta al VPS y los puertos 80 y 443 están accesibles. El puerto interno 5678 no se publica en Internet: desde el exterior solo están disponibles los puertos 80 y 443, mientras que Caddy accede a n8n a través de la red de Docker.
Las variables N8N_WEBHOOK_URL y N8N_PROXY_HOPS son necesarias para que el editor genere las direcciones públicas correctas de los webhooks y confíe en las cabeceras procedentes de un reverse proxy.
5. Inicia n8n
Comprueba la configuración final e inicia los contenedores:
docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddyAbre:
https://n8n.example.comCrea la cuenta del propietario. No compartas su contraseña con tus compañeros: para trabajar en equipo, utiliza cuentas separadas y concede únicamente los accesos necesarios.
Primer workflow útil
Una buena prueba consiste en procesar una solicitud del sitio web:
- Añade un nodo
Webhookcon el métodoPOST. - Con
Edit Fields, conserva únicamente el nombre, el correo electrónico y la fuente. - Usa un nodo
Ifpara rechazar una solicitud que no tenga los datos obligatorios. - Crea una oportunidad en el CRM o envía una solicitud mediante
HTTP Request. - Añade una notificación en Telegram.
- Termina la cadena con un nodo
Respond to Webhook. - Después de la prueba, activa el workflow y sustituye el webhook de prueba por la URL de producción.
Este ejemplo comprueba de inmediato el dominio, HTTPS, las solicitudes entrantes, las credenciales y la integración externa. Después conviene añadir un Error Workflow separado que avise si falla la cadena principal.
Seguridad de n8n después de la instalación
Tener n8n instalado todavía no significa tener un n8n fiable. Después de iniciarlo, comprueba que:
- el editor solo sea accesible mediante HTTPS;
.envtenga permisos600y no se incluya en Git;- las claves de API externas tengan los permisos mínimos;
- cada webhook compruebe la firma o el secreto del origen;
- el historial de ejecuciones se elimine automáticamente;
- los errores de los workflows críticos se envíen al administrador.
Los Community nodes se instalan como paquetes y pueden obtener acceso a los datos de los workflows y al servidor. No añadas nodos desconocidos sin revisarlos. Si no los necesitas, desactívalos con N8N_COMMUNITY_PACKAGES_ENABLED=false.
Ejecuta la auditoría integrada:
docker compose exec n8n n8n auditAyuda a detectar webhooks desprotegidos, nodos arriesgados y problemas con las credenciales, pero no sustituye una revisión manual.
Historial de ejecuciones y datos personales
n8n guarda los datos de entrada y salida para depuración. Junto con ellos, pueden permanecer en la base de datos correos, números de teléfono, documentos y respuestas de API.
En la configuración anterior, las ejecuciones se eliminan a los siete días y su número se limita a 10 000. Para procesos sensibles, el periodo debe elegirse según la política de conservación de datos y los campos innecesarios deben eliminarse antes de que finalice el workflow.
Copias de seguridad y actualizaciones
Para restaurar el sistema se necesitan un volcado de PostgreSQL, el volumen n8n_data, los archivos de configuración y .env con N8N_ENCRYPTION_KEY. Antes de copiar, detén los procesadores y deja PostgreSQL en funcionamiento. Esto producirá una breve interrupción de los workflows:
cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner
docker compose exec -T postgres sh -c \
'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
| gzip > "backup/n8n-db-$(date +%F).sql.gz"
docker run --rm \
-v n8n_data:/source:ro \
-v "$PWD/backup":/backup \
alpine sh -c \
'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'
tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
.env compose.yaml Caddyfile
docker compose start n8n n8n-runnerEl archivo que contiene .env incluye secretos: cífralo y guárdalo fuera del VPS. Comprueba periódicamente la copia mediante una restauración de prueba.
Antes de actualizar, realiza una copia de seguridad y revisa las notas de la versión:
cd /opt/n8n
docker compose pull
docker compose up -d
docker compose psEl task runner y el contenedor principal deben utilizar la misma etiqueta de versión.
Cuándo será necesario escalar
No empieces con Redis y varios workers antes de tener una carga real. Una sola instancia con PostgreSQL es más sencilla de mantener y normalmente cubre pequeños procesos internos.
El queue mode será necesario cuando las tareas largas retrasen los webhooks, se inicien muchos workflows al mismo tiempo o el procesamiento de archivos ocupe regularmente toda la memoria. En ese caso, la instancia principal recibe los eventos, Redis distribuye los trabajos y los workers los ejecutan en paralelo. Todos los componentes deben conectarse al mismo PostgreSQL y utilizar la misma N8N_ENCRYPTION_KEY.
Qué VPS elegir para n8n
Para ejecutar n8n, PostgreSQL, Caddy y un task runner, es razonable comenzar con 2 vCPU, 4 GB de RAM y un disco NVMe. En tropic.host, esta configuración corresponde al plan Light: 2 vCPU, 4 GB de RAM y 25 GB NVMe. Es suficiente para los primeros workflows de producción sin un procesamiento pesado de archivos.
Para documentos, grandes volúmenes de datos y muchos flujos paralelos con IA, es mejor elegir 8 GB de RAM. También es importante contar con una red estable: los webhooks, las devoluciones de OAuth y las tareas programadas deben permanecer disponibles en todo momento.
Conclusión
n8n convierte las operaciones repetitivas en flujos visuales claros: los nodos preparados aceleran la puesta en marcha, HTTP Request conecta casi cualquier API y un Code node permite añadir lógica propia.
La versión self-hosted ofrece control sobre el servidor y la base de datos, pero requiere HTTPS, claves con permisos limitados, limpieza del historial y copias de seguridad verificadas. Guarda N8N_ENCRYPTION_KEY junto con PostgreSQL: sin ella, las credenciales restauradas no pueden descifrarse.
FAQ
¿Se puede utilizar n8n gratis?
Sí. Community Edition puede alojarse gratuitamente en un servidor propio para procesos personales e internos. La reventa de una instancia alojada de n8n como un SaaS independiente está limitada por la licencia fair-code.
¿Se puede instalar n8n sin dominio?
Para una prueba local, sí. Para webhooks públicos y OAuth, es mejor utilizar un dominio y HTTPS.
¿Cuánta memoria RAM necesita n8n?
Los workflows personales sencillos suelen funcionar con 2 GB de RAM. Para n8n con PostgreSQL, Caddy y un task runner, 4 GB son más razonables; los archivos y las ejecuciones paralelas pueden requerir 8 GB o más.
¿Todos los datos permanecen dentro del VPS?
Solo los datos que el workflow no envíe al exterior. La base de datos y el historial de ejecuciones están en el VPS, pero los nodos de Telegram, CRM o un modelo de IA externo envían los datos seleccionados al servicio correspondiente.
¿Qué debe incluir una copia de seguridad de n8n?
Un volcado de PostgreSQL, el volumen n8n_data, compose.yaml, Caddyfile y el archivo .env con N8N_ENCRYPTION_KEY. Guarda la copia cifrada fuera del VPS y verifícala mediante una restauración.
