Saltar al contenido
Servidores 2026-10-06 15 min de lectura

Cómo instalar n8n en un VPS con Docker y Nginx (guía 2026)

Si automatizas procesos con Zapier o Make, ya sabes lo que pasa cuando el volumen crece: la factura sube cada mes y tus datos pasan por servidores ajenos. Instalar n8n en un VPS propio resuelve las dos cosas de una vez: el software no te cobra por ejecución y toda la información se queda en tu servidor. Esta guía es un tutorial completo para dejar n8n funcionando en un VPS con Ubuntu 22.04 o 24.04, usando Docker, Nginx como proxy inverso y un certificado SSL gratuito de Let's Encrypt. Si copias los comandos tal cual, el proceso completo toma menos de 30 minutos. Todos los comandos y archivos de configuración están listos para pegar, y las variables de entorno están actualizadas a la versión 2.x de n8n, que cambió varias cosas respecto a los tutoriales que todavía circulan.

Cómo instalar n8n en un VPS con Docker y Nginx (guía 2026)
#VPS#n8n#Docker#Automatización#Servidores
T
Equipo Terranode
Editorial

Qué es n8n y por qué instalar n8n en un VPS propio

n8n es una plataforma de automatización de flujos de trabajo que conecta aplicaciones entre sí sin escribir código: "cuando llegue un correo con factura adjunta, súbelo a Drive, extrae el total con IA y anótalo en una hoja de cálculo". Es la alternativa auto-hospedable a Zapier y Make. La diferencia clave es que puedes instalarla en tu propio servidor, y entonces no hay contador de ejecuciones ni límite de tareas: el único límite es el hardware que le pongas.

Un apunte de terminología antes de seguir. Un VPS (Virtual Private Server) es un servidor virtual con recursos dedicados dentro de una máquina física, al que entras como administrador y donde instalas lo que quieras. Docker es la herramienta que empaqueta una aplicación con todas sus dependencias en un contenedor, de forma que se ejecuta igual en cualquier servidor. Un proxy inverso es un servidor web —aquí Nginx— que recibe las peticiones de internet y las reenvía a la aplicación que corre por dentro, encargándose del HTTPS por el camino.

Hay un matiz de licencia que conviene aclarar, porque muchos artículos lo pasan por alto: n8n no es open source certificado por la Open Source Initiative, sino "fair-code". Se distribuye bajo la Sustainable Use License, que permite usarlo gratis y sin límites para fines internos de tu empresa, incluidos los comerciales, pero prohíbe revenderlo como servicio a terceros para que ellos conecten sus cuentas y construyan sus flujos. Para el 99% de los casos —automatizar tu propio negocio o el de un cliente al que le montas los flujos— la licencia no supone ningún obstáculo. Si tu plan es lanzar un SaaS encima de n8n, necesitas hablar con ellos.

n8n Cloud frente a n8n auto-hospedado: comparativa de costos

La versión auto-hospedada elimina el costo de licencia y el límite de ejecuciones, pero traslada a ti el mantenimiento. Esta es la comparación con los precios publicados por n8n en su página oficial (facturación anual) frente a un VPS capaz de correrlo con holgura:

Concepton8n Cloud Startern8n Cloud ProAuto-hospedado en VPS
Costo mensual20 €/mes (anual)50 €/mes (anual)Desde $9/mes (VPS 2 vCPU / 4 GB)
Costo anual aproximado240 €600 €$108
Ejecuciones incluidas2.500/mes10.000/mesSin contador; el límite es el hardware
Ejecuciones concurrentes520Las que aguante el servidor
Flujos y usuariosIlimitadosIlimitadosIlimitados
Dónde viven tus datosServidores de n8nServidores de n8nTu servidor
ActualizacionesAutomáticasAutomáticasManuales (un comando)
Copias de seguridadGestionadasGestionadasTu responsabilidad
Tiempo de mantenimiento00~30 min al mes

Fuente de los precios: página oficial de precios de n8n, consultada en septiembre de 2026. El plan Business figura en 667 €/mes con 40.000 ejecuciones.

Ahora la parte honesta: no todo el mundo necesita auto-hospedar. Si vas a correr 300 ejecuciones al mes, no tienes a nadie que administre un servidor Linux y no manejas datos sensibles, n8n Cloud a 20 € cuesta menos que el tiempo que le dedicarás al VPS. El auto-hospedaje gana claramente cuando se cumple al menos una de estas condiciones: superas las 2.500 ejecuciones mensuales, tienes flujos que se disparan cada minuto, procesas datos que no pueden salir de tu infraestructura, o ya administras servidores y el costo marginal de uno más es casi cero.

Requisitos antes de empezar

Necesitas cuatro cosas antes del primer comando, y las cuatro se consiguen en minutos:

  • Un VPS con Ubuntu 22.04 LTS o 24.04 LTS y acceso root o un usuario con sudo. Cualquiera de las dos versiones sirve; los comandos de esta guía son idénticos.
  • Mínimo 2 GB de RAM, recomendado 4 GB. La documentación oficial de n8n pide 4 GB de RAM y 2 vCPU para el despliegue con Docker Compose, porque el ejecutor de código aislado corre en un proceso aparte. Con 2 GB funciona una instalación sencilla; con 4 GB puedes usar nodos de IA y varios flujos concurrentes sin que el sistema empiece a matar procesos por falta de memoria.
  • Al menos 20 GB de disco. n8n en sí ocupa poco, pero el historial de ejecuciones crece rápido si guardas los datos de cada corrida.
  • Un dominio o subdominio apuntando al VPS. Crea un registro DNS de tipo A con el nombre n8n apuntando a la IP pública de tu servidor. La propagación tarda entre unos minutos y una hora. Sin esto no hay certificado SSL.

Comprueba que el DNS ya resuelve antes de continuar, porque Certbot fallará si no lo hace:

bash
dig +short n8n.tudominio.com

Debe devolver la IP de tu VPS. Si no devuelve nada, espera a que propague.

Paso 1: Conectarte al VPS por SSH

Se entra al servidor con ssh seguido del usuario y la IP. Desde Linux, macOS o el terminal de Windows:

bash
ssh root@IP_DE_TU_VPS

Lo primero, antes de instalar nada, es actualizar el sistema y crear un usuario sin privilegios de root para el trabajo diario. Trabajar siempre como root es la forma más rápida de que un error de tecleo se convierta en un servidor inutilizable:

bash
apt update && apt upgrade -y
adduser n8nadmin
usermod -aG sudo n8nadmin

Cierra la sesión y vuelve a entrar con el usuario nuevo:

bash
exit
ssh n8nadmin@IP_DE_TU_VPS

Si además quieres cerrar el acceso por contraseña y dejar solo claves SSH —muy recomendable en un servidor expuesto a internet—, el proceso completo está en nuestra guía de seguridad para servidores Linux.

Paso 2: Instalar Docker y Docker Compose

Docker se instala desde el repositorio oficial de Docker, no desde el de Ubuntu. El paquete docker.io que trae Ubuntu suele ir varias versiones por detrás y no incluye el plugin de Compose v2. Estos son los comandos oficiales, uno detrás de otro:

bash
# Dependencias y llave GPG de Docker
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

Ahora se añade el repositorio de Docker a las fuentes de apt:

bash
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<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

sudo apt update

Y se instalan el motor y los plugins:

bash
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Para no tener que escribir sudo en cada comando de Docker, añade tu usuario al grupo docker y vuelve a iniciar sesión:

bash
sudo usermod -aG docker $USER
newgrp docker

Verifica que todo quedó bien. La segunda orden debe responder con una versión v2.x:

bash
docker --version
docker compose version

Un detalle que confunde a mucha gente: el comando correcto hoy es docker compose, con espacio. El antiguo docker-compose con guion era la versión 1 escrita en Python, que dejó de mantenerse. Si tu servidor todavía responde a docker-compose, tiene software sin soporte.

Paso 3: Crear el docker-compose.yml de n8n

El archivo docker-compose.yml describe el contenedor de n8n, sus variables de entorno y el volumen donde se guardan los flujos. Crea una carpeta para el proyecto:

bash
mkdir -p ~/n8n && cd ~/n8n

Antes del compose, genera una clave de cifrado. n8n usa esta clave para cifrar las credenciales que guardas (tokens de Google, claves de API, contraseñas). Si la pierdes, pierdes el acceso a todas las credenciales guardadas, así que anótala en tu gestor de contraseñas:

bash
openssl rand -hex 32

Guarda esa cadena en un archivo .env junto al compose, para que no quede escrita dentro del YAML:

bash
nano ~/n8n/.env

Contenido del .env (sustituye el valor por el que generaste y el dominio por el tuyo):

bash
N8N_ENCRYPTION_KEY=pega_aqui_la_cadena_de_64_caracteres
DOMINIO=n8n.tudominio.com
TZ=America/Guayaquil

Protege el archivo para que solo tu usuario pueda leerlo:

bash
chmod 600 ~/n8n/.env

Ahora el compose:

bash
nano ~/n8n/docker-compose.yml

Este es el archivo completo:

yaml
services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=${DOMINIO}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - N8N_EDITOR_BASE_URL=https://${DOMINIO}
      - N8N_WEBHOOK_URL=https://${DOMINIO}/
      - N8N_PROXY_HOPS=1
      - N8N_RUNNERS_ENABLED=true
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - N8N_DIAGNOSTICS_ENABLED=false
      - GENERIC_TIMEZONE=${TZ}
      - TZ=${TZ}
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

Cada línea importa, y estas cinco son las que suelen dar problemas:

  • ports: "127.0.0.1:5678:5678" publica el puerto solo en la interfaz local. Es la línea más importante del archivo desde el punto de vista de seguridad: si escribes "5678:5678" a secas, Docker abre el puerto a todo internet escribiendo reglas directamente en iptables, saltándose el firewall UFW. Mucha gente cree que su n8n está protegido por UFW cuando en realidad es accesible por IP y puerto desde cualquier parte del mundo.
  • N8N_WEBHOOK_URL define la URL pública que n8n muestra en el editor para los webhooks. Sin esta variable, el editor te daría direcciones tipo localhost:5678/webhook/... que ningún servicio externo puede alcanzar. Ojo: la variable antigua WEBHOOK_URL quedó obsoleta en n8n 2.35.0 y fue reemplazada por N8N_WEBHOOK_URL. La mayoría de los tutoriales que encontrarás siguen usando la antigua.
  • N8N_PROXY_HOPS=1 le dice a n8n que hay exactamente un proxy delante (Nginx), para que interprete bien la cabecera X-Forwarded-For y registre la IP real del visitante en vez de la del proxy.
  • N8N_RUNNERS_ENABLED=true activa los task runners, que ejecutan el código de los nodos Code en un proceso separado y aislado. Además de ser más seguro, evita el aviso de obsolescencia en los registros.
  • N8N_ENCRYPTION_KEY fija la clave de cifrado. Si no la defines, n8n genera una automáticamente y la guarda dentro del volumen; funciona, pero si algún día restauras una copia sin ese archivo, las credenciales quedan ilegibles.

Levanta el contenedor:

bash
docker compose up -d

Y comprueba que arrancó bien:

bash
docker compose ps
docker compose logs -f n8n

En los registros debe aparecer Editor is now accessible via: http://localhost:5678. Sal de los registros con Ctrl+C: el contenedor sigue corriendo en segundo plano.

Sobre la etiqueta de la imagen: latest es cómodo, pero en producción conviene fijar una versión concreta, por ejemplo n8nio/n8n:2.37.3. Así una actualización nunca te sorprende con cambios incompatibles a mitad de semana.

Paso 4: Instalar Nginx y configurar el firewall

Nginx se instala desde los repositorios de Ubuntu con un solo comando. Va a ser la única puerta abierta a internet: recibe el tráfico en los puertos 80 y 443, y lo reenvía al puerto 5678 interno donde escucha n8n.

bash
sudo apt install -y nginx

Configura el firewall UFW para permitir SSH y el tráfico web, y nada más:

bash
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

El resultado debe mostrar permitidos el puerto 22 (SSH) y los puertos 80 y 443 (Nginx Full). El puerto 5678 no debe aparecer: n8n no se expone directamente. Si por accidente publicaste el puerto sin el prefijo 127.0.0.1, revisa el Paso 3 y vuelve a levantar el contenedor, porque UFW no va a taparlo por ti. Si quieres afinar más las reglas, tenemos una guía dedicada a configurar firewalls en Linux.

Paso 5: Configurar Nginx como proxy inverso para n8n

El proxy inverso se define en un archivo dentro de /etc/nginx/sites-available/ que reenvía todo el tráfico del dominio al puerto 5678 local. Crea el archivo:

bash
sudo nano /etc/nginx/sites-available/n8n

Pega esta configuración y cambia n8n.tudominio.com por tu dominio:

nginx
server {
    listen 80;
    listen [::]:80;
    server_name n8n.tudominio.com;

    # Tamaño máximo de los archivos que suben tus flujos
    client_max_body_size 100M;

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_http_version 1.1;

        # Imprescindible: el editor de n8n usa WebSockets
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Cabeceras que n8n necesita para construir bien sus URLs
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Los flujos largos no deben cortarse a mitad de ejecución
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;

        # Sin buffering: el editor recibe eventos en tiempo real
        proxy_buffering off;
        proxy_cache off;
    }
}

Las tres cabeceras X-Forwarded-For, X-Forwarded-Host y X-Forwarded-Proto son las que la documentación de n8n exige en el último proxy de la cadena. Sin ellas, n8n cree que está sirviendo por HTTP en localhost y genera enlaces rotos.

Las dos líneas de Upgrade y Connection merecen atención aparte: son la causa número uno de que el editor de n8n se quede en blanco o cargando eternamente detrás de Nginx. El lienzo del editor se actualiza por WebSocket, y sin esas cabeceras la conexión nunca se establece.

Activa el sitio, elimina el sitio por defecto y verifica la sintaxis:

bash
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Si nginx -t responde syntax is ok y test is successful, vas bien. Ya puedes entrar a http://n8n.tudominio.com y ver la pantalla de n8n, todavía sin cifrar.

Paso 6: Instalar el certificado SSL con Certbot

Certbot obtiene un certificado gratuito de Let's Encrypt y modifica solo la configuración de Nginx para activar HTTPS. En Ubuntu 22.04 y 24.04 se instala desde apt junto con su plugin de Nginx:

bash
sudo apt install -y certbot python3-certbot-nginx

Pide el certificado indicando tu dominio:

bash
sudo certbot --nginx -d n8n.tudominio.com

Certbot te pedirá un correo (lo usa para avisarte si un certificado va a caducar sin renovarse), la aceptación de los términos y si quieres redirigir todo el tráfico HTTP a HTTPS. Responde que sí a la redirección: n8n marca sus cookies de sesión como seguras y no funcionará bien sobre HTTP plano.

El certificado de Let's Encrypt dura 90 días y se renueva solo: el paquete de Ubuntu instala un temporizador de systemd que lo comprueba dos veces al día. Puedes verificar que la renovación automática funciona sin llegar a renovar de verdad:

bash
sudo certbot renew --dry-run
sudo systemctl list-timers | grep certbot

Si el ensayo termina sin errores, ya no tienes que preocuparte por el certificado. Entra a https://n8n.tudominio.com y comprueba que aparece el candado.

Un aviso sobre otro método que verás recomendado: Certbot también se distribuye como paquete snap. Funciona y suele traer versiones más nuevas, pero no instales las dos versiones a la vez: acabarías con dos temporizadores de renovación apuntando al mismo directorio /etc/letsencrypt, lo que provoca conflictos difíciles de diagnosticar. Elige una.

Paso 7: Crear tu cuenta y tu primer flujo en n8n

La primera vez que entras, n8n te pide crear la cuenta de propietario de la instancia: correo, nombre y contraseña. Esa cuenta es el administrador y no hay forma de recuperarla desde fuera, así que guarda la contraseña donde no la pierdas.

Si vienes de tutoriales antiguos, quizá busques las variables N8N_BASIC_AUTH_USER y N8N_BASIC_AUTH_PASSWORD. Ya no existen: n8n eliminó la autenticación básica en la versión 1.0 y la reemplazó por su sistema de gestión de usuarios integrado. Si las pones en tu compose, no hacen nada.

Para probar que todo funciona de punta a punta, crea un flujo mínimo con un webhook, que además valida la parte más frágil de la instalación:

  1. 1 En el panel, pulsa Create Workflow.
  2. 2 Añade un nodo Webhook como disparador.
  3. 3 Copia la Production URL que muestra el nodo. Debe empezar por https://n8n.tudominio.com/webhook/.... Si empieza por localhost:5678, la variable N8N_WEBHOOK_URL no se aplicó: revisa el .env y el compose.
  4. 4 Añade un segundo nodo, por ejemplo Edit Fields (Set), y conéctalo al webhook.
  5. 5 Guarda y activa el flujo con el interruptor de arriba a la derecha.

Prueba el webhook desde tu máquina local:

bash
curl -X POST https://n8n.tudominio.com/webhook/tu-ruta \
  -H "Content-Type: application/json" \
  -d '{"prueba": "hola"}'

Si en la pestaña de ejecuciones de n8n aparece una corrida con ese dato, la instalación está completa: DNS, proxy, SSL, WebSockets y URL pública de webhooks funcionan.

Cómo actualizar n8n sin perder tus flujos

Actualizar n8n con Docker Compose son tres comandos, y los datos sobreviven porque viven en el volumen, no en el contenedor. Antes de nada, haz una copia del volumen:

bash
docker run --rm \
  -v n8n_n8n_data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/n8n-backup-$(date +%F).tar.gz -C /data .

El nombre del volumen suele llevar como prefijo el de la carpeta del proyecto. Confírmalo con docker volume ls antes de ejecutar el comando.

Con la copia hecha, la actualización:

bash
cd ~/n8n
docker compose pull
docker compose up -d

Docker descarga la imagen nueva, recrea el contenedor y vuelve a montar el mismo volumen. Tus flujos, credenciales e historial siguen ahí. Revisa después que arrancó sin errores:

bash
docker compose logs --tail=50 n8n

Conviene leer las notas de la versión antes de actualizar, sobre todo al saltar de una versión mayor a otra. n8n publica cambios frecuentes: en agosto de 2026 iba por la rama 2.37, y los saltos de versión mayor han retirado variables de entorno más de una vez, como pasó con la autenticación básica en la 1.0 y con WEBHOOK_URL en la 2.35.

Seguridad: qué hacer después de instalar n8n

n8n guarda las credenciales de todas tus cuentas conectadas, así que un servidor comprometido equivale a entregar el acceso a tu Google, tu CRM y tu banco. Estas son las medidas que marcan la diferencia, ordenadas por relación entre esfuerzo y protección:

  • Verifica que el puerto 5678 no está expuesto. Desde otra máquina, ejecuta curl http://IP_DE_TU_VPS:5678. Debe fallar por tiempo de espera o conexión rechazada. Si responde, corrige el mapeo de puertos del compose como se explicó en el Paso 3.
  • Activa la autenticación de dos factores en tu cuenta de n8n, desde Settings, en el perfil de usuario. Es gratis en la Community Edition y bloquea el uso de una contraseña robada.
  • Instala Fail2ban para frenar los ataques de fuerza bruta contra SSH. Es cuestión de minutos y lo explicamos en Fail2ban: protección contra fuerza bruta.
  • Deshabilita el acceso SSH por contraseña y usa solo claves. Un servidor con SSH por contraseña recibe miles de intentos automatizados al día.
  • Activa las actualizaciones de seguridad desatendidas de Ubuntu con sudo apt install unattended-upgrades, para que los parches del sistema se apliquen sin depender de tu memoria.
  • Copias de seguridad del volumen, automatizadas. Un respaldo que nunca has restaurado es una suposición, no un respaldo. Programa el comando de copia del apartado anterior en cron y prueba una restauración al menos una vez.
  • Limita el historial de ejecuciones. Añade EXECUTIONS_DATA_MAX_AGE=168 y EXECUTIONS_DATA_PRUNE=true a las variables de entorno para conservar solo siete días. Evita que la base crezca sin control y reduce el volumen de datos expuestos si alguien accede.
  • No compartas la clave de cifrado. Guárdala en tu gestor de contraseñas, fuera del servidor. Sin ella, un atacante que se lleve una copia de tu volumen no puede leer las credenciales.

Cuándo pasar de SQLite a PostgreSQL

Con la configuración de esta guía, n8n guarda todo en SQLite, un único archivo dentro del volumen, y eso es suficiente hasta que aparecen escrituras concurrentes. SQLite no admite varias escrituras simultáneas: cuando tienes cinco flujos disparándose a la vez, unos esperan a otros y aparecen bloqueos.

Cambia a PostgreSQL cuando se cumpla alguna de estas señales: varios flujos que se ejecutan al mismo tiempo de forma habitual, un historial de ejecuciones que ya no cabe cómodamente en el disco, o un editor que tarda en abrir ejecuciones antiguas. Es lo que n8n recomienda para producción. Se añade como un segundo servicio al mismo docker-compose.yml:

yaml
services:
  postgres:
    image: postgres:16
    container_name: n8n-postgres
    restart: unless-stopped
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=n8n
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
      - N8N_HOST=${DOMINIO}
      - N8N_PROTOCOL=https
      - N8N_EDITOR_BASE_URL=https://${DOMINIO}
      - N8N_WEBHOOK_URL=https://${DOMINIO}/
      - N8N_PROXY_HOPS=1
      - N8N_RUNNERS_ENABLED=true
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=${TZ}
      - TZ=${TZ}
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:
  pg_data:

Añade POSTGRES_PASSWORD a tu .env con una contraseña larga generada al azar. Importante: este cambio empieza con una base vacía; los flujos que ya tenías en SQLite no se migran solos. Expórtalos antes desde el menú de n8n, o hazlo desde el principio si sabes que vas a necesitar PostgreSQL. Nota también que el contenedor de Postgres no publica ningún puerto al exterior: n8n lo alcanza por el nombre del servicio dentro de la red interna de Docker, que es exactamente como debe ser.

Qué VPS necesitas para correr n8n

Para n8n en producción, el punto óptimo son 2 vCPU y 4 GB de RAM: es lo que pide la documentación oficial y lo que aguanta flujos con nodos de IA sin quedarse corto. Con 1 GB n8n arranca, pero cualquier flujo que procese un archivo grande o llame a un modelo de lenguaje termina con el proceso muerto por falta de memoria.

Hay un factor que se subestima en las guías de n8n: la red. Los flujos de automatización son, casi por definición, muchas llamadas a APIs externas. Un servidor con red saturada convierte un flujo de diez pasos en una espera de varios segundos por cada ejecución, y eso se nota cuando el flujo corre cientos de veces al día.

En Terranode, el plan TNS-03 tiene 2 vCPU, 4 GB de RAM, 40 GB de disco NVMe y 3 TB de transferencia por $9 al mes, con virtualización KVM (recursos realmente dedicados, no compartidos como en un contenedor OpenVZ) y puertos de 10 Gbps. Es la configuración que corresponde a lo que la documentación de n8n recomienda, y el disco NVMe ayuda de forma directa con la base de datos de ejecuciones. Todos los planes usan Ubuntu como sistema disponible, así que los comandos de esta guía funcionan tal cual desde el primer minuto. Puedes ver las especificaciones y regiones disponibles en la página de VPS de Terranode.

Si tus flujos son pocos y sencillos, el TNS-02 con 2 GB de RAM a $5 al mes te sirve para empezar y siempre puedes crecer después. Y si ya tienes otro proyecto en Docker en el mismo servidor, la guía de cómo migrar un proyecto Docker de local a un VPS explica cómo convivan varios contenedores detrás del mismo Nginx sin pelearse por los puertos.

Instalar n8n en un VPS son siete pasos: entrar por SSH, instalar Docker, escribir el docker-compose.yml, instalar Nginx, configurarlo como proxy inverso, pedir el certificado con Certbot y crear la cuenta de propietario. Con los comandos de esta guía copiados tal cual, el proceso completo cabe en media hora, y a partir de ahí tienes una plataforma de automatización sin contador de ejecuciones y con tus datos en tu propio servidor.

Los tres detalles que separan una instalación que funciona de una que da problemas son fáciles de recordar: publica el puerto solo en 127.0.0.1 para que Docker no se salte tu firewall, incluye las cabeceras de WebSocket en Nginx para que el editor cargue, y usa N8N_WEBHOOK_URL en lugar de la variable obsoleta WEBHOOK_URL. Los tres son errores silenciosos: no rompen el arranque, solo hacen que algo no funcione después sin decirte por qué.

Y la decisión previa, la que nadie te va a tomar: si vas a correr menos de 2.500 ejecuciones al mes y nadie en tu equipo administra servidores, n8n Cloud a 20 € probablemente te cueste menos que el tiempo que dedicarás a mantener el VPS. El auto-hospedaje gana cuando el volumen crece, cuando los datos no pueden salir de casa, o cuando ya tienes un servidor y añadir n8n encima es casi gratis.

¿Listo para llevar tu sitio al siguiente nivel?

Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.

Ver planes de hosting

Preguntas frecuentes