Tropic Host

n8n: qué es y cómo instalarlo en un VPS con Docker Compose

10 min de lectura
Tropic
n8n: qué es y cómo instalarlo en un VPS con Docker Compose

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:

  1. Crea un VPS y apunta un subdominio hacia él, por ejemplo n8n.example.com.
  2. Instala Docker y Docker Compose.
  3. Inicia n8n con PostgreSQL, un task runner externo y Caddy.
  4. Abre la interfaz mediante HTTPS y crea la cuenta del propietario.
  5. Conecta Telegram, un CRM, el correo electrónico o cualquier API externa.
  6. Configura el tratamiento de errores y el periodo de conservación de las ejecuciones.
  7. 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ámetron8n Cloudn8n en un VPS
Puesta en marchaSin configurar un servidorRequiere dominio, Docker y HTTPS
ActualizacionesLas realiza n8nLas realiza el propietario
Base de datos y archivosEn la infraestructura del servicioEn el servidor elegido
EscaladoSegún las condiciones del plan en la nubeSe configura de forma independiente
ResponsabilidadMenos administraciónLas copias, la seguridad y la supervisión dependen del propietario
Para quién es adecuadoInicio rápido sin DevOpsControl, 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.

EscenarioConfiguración inicial
Pruebas y workflows personales de texto1 vCPU, 2 GB de RAM, 20 GB NVMe
Pequeña instalación en producción2 vCPU, 4 GB de RAM, 25–40 GB NVMe
Procesos paralelos, IA o archivos4 vCPU, 8 GB de RAM o más
Varios procesos worker en queue modeCá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 openssl

Instala 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 version

Abre únicamente SSH, HTTP y HTTPS:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

No 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/n8n

Crea 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 .env

La 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_config

El 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 caddy

Abre:

https://n8n.example.com

Crea 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:

  1. Añade un nodo Webhook con el método POST.
  2. Con Edit Fields, conserva únicamente el nombre, el correo electrónico y la fuente.
  3. Usa un nodo If para rechazar una solicitud que no tenga los datos obligatorios.
  4. Crea una oportunidad en el CRM o envía una solicitud mediante HTTP Request.
  5. Añade una notificación en Telegram.
  6. Termina la cadena con un nodo Respond to Webhook.
  7. 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;
  • .env tenga permisos 600 y 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 audit

Ayuda 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-runner

El 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 ps

El 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.