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:
| Concepto | n8n Cloud Starter | n8n Cloud Pro | Auto-hospedado en VPS |
|---|---|---|---|
| Costo mensual | 20 €/mes (anual) | 50 €/mes (anual) | Desde $9/mes (VPS 2 vCPU / 4 GB) |
| Costo anual aproximado | 240 € | 600 € | $108 |
| Ejecuciones incluidas | 2.500/mes | 10.000/mes | Sin contador; el límite es el hardware |
| Ejecuciones concurrentes | 5 | 20 | Las que aguante el servidor |
| Flujos y usuarios | Ilimitados | Ilimitados | Ilimitados |
| Dónde viven tus datos | Servidores de n8n | Servidores de n8n | Tu servidor |
| Actualizaciones | Automáticas | Automáticas | Manuales (un comando) |
| Copias de seguridad | Gestionadas | Gestionadas | Tu responsabilidad |
| Tiempo de mantenimiento | 0 | 0 | ~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
n8napuntando 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:
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:
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:
apt update && apt upgrade -y
adduser n8nadmin
usermod -aG sudo n8nadmin Cierra la sesión y vuelve a entrar con el usuario nuevo:
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:
# 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:
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:
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:
sudo usermod -aG docker $USER
newgrp docker Verifica que todo quedó bien. La segunda orden debe responder con una versión v2.x:
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:
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:
openssl rand -hex 32 Guarda esa cadena en un archivo .env junto al compose, para que no quede escrita dentro del YAML:
nano ~/n8n/.env Contenido del .env (sustituye el valor por el que generaste y el dominio por el tuyo):
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:
chmod 600 ~/n8n/.env Ahora el compose:
nano ~/n8n/docker-compose.yml Este es el archivo completo:
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_URLdefine la URL pública que n8n muestra en el editor para los webhooks. Sin esta variable, el editor te daría direcciones tipolocalhost:5678/webhook/...que ningún servicio externo puede alcanzar. Ojo: la variable antiguaWEBHOOK_URLquedó obsoleta en n8n 2.35.0 y fue reemplazada porN8N_WEBHOOK_URL. La mayoría de los tutoriales que encontrarás siguen usando la antigua. -
N8N_PROXY_HOPS=1le dice a n8n que hay exactamente un proxy delante (Nginx), para que interprete bien la cabeceraX-Forwarded-Fory registre la IP real del visitante en vez de la del proxy. -
N8N_RUNNERS_ENABLED=trueactiva 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_KEYfija 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:
docker compose up -d Y comprueba que arrancó bien:
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.
sudo apt install -y nginx Configura el firewall UFW para permitir SSH y el tráfico web, y nada más:
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:
sudo nano /etc/nginx/sites-available/n8n Pega esta configuración y cambia n8n.tudominio.com por tu dominio:
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:
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:
sudo apt install -y certbot python3-certbot-nginx Pide el certificado indicando tu dominio:
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:
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 En el panel, pulsa Create Workflow.
- 2 Añade un nodo Webhook como disparador.
- 3 Copia la Production URL que muestra el nodo. Debe empezar por
https://n8n.tudominio.com/webhook/.... Si empieza porlocalhost:5678, la variableN8N_WEBHOOK_URLno se aplicó: revisa el.envy el compose. - 4 Añade un segundo nodo, por ejemplo Edit Fields (Set), y conéctalo al webhook.
- 5 Guarda y activa el flujo con el interruptor de arriba a la derecha.
Prueba el webhook desde tu máquina local:
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:
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:
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:
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=168yEXECUTIONS_DATA_PRUNE=truea 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:
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.
Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.