Instalar n8n en tu propio servidor es la diferencia entre pagar por cada ejecución y tener automatización ilimitada a costo de un VPS. Para instalar n8n self-hosted necesitás un VPS de 2 GB de RAM o más (USD 6-12/mes), un dominio apuntando al servidor, y Docker Compose con tres piezas: el contenedor de n8n, PostgreSQL como base de datos y un reverse proxy que resuelva HTTPS. El proceso completo lleva 1-2 horas, y los dos errores que arruinan la mayoría de las instalaciones —webhooks que no llegan y credenciales perdidas al actualizar— se previenen con dos variables de entorno. Esta guía va al grano y marca exactamente dónde están las trampas.
Paso 0: el servidor y el dominio
Requisitos mínimos realistas para producción liviana:
- VPS: 2 vCPU, 4 GB RAM, 40 GB de disco. Proveedores típicos: Hetzner (~USD 6), DigitalOcean (~USD 24), Vultr (~USD 12). Con 2 GB funciona, pero los workflows con IA o muchos datos lo van a sufrir.
- Sistema: Ubuntu 22.04 o 24.04 LTS.
- Dominio: un subdominio tipo
n8n.tuempresa.comcon un registro A apuntando a la IP del VPS. Hacelo antes de empezar: la emisión del certificado SSL lo necesita propagado.
Instalá Docker con el script oficial:
curl -fsSL https://get.docker.com | sh
Paso 1: estructura y variables de entorno críticas
Creá la carpeta del proyecto y el archivo .env:
mkdir -p /opt/n8n && cd /opt/n8n
# .env
N8N_HOST=n8n.tuempresa.com
WEBHOOK_URL=https://n8n.tuempresa.com/
N8N_PROTOCOL=https
N8N_PORT=5678
# LA variable más importante de toda la instalación:
N8N_ENCRYPTION_KEY=una-clave-larga-aleatoria-que-vas-a-guardar-afuera
GENERIC_TIMEZONE=America/Argentina/Buenos_Aires
TZ=America/Argentina/Buenos_Aires
# Base de datos
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=otra-clave-fuerte
# Higiene: limpiar ejecuciones viejas para que el disco no explote
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=336
Dos de estas variables previenen los dos desastres clásicos:
WEBHOOK_URL: sin ella, n8n arma las URLs de webhook conlocalhost:5678. Todo parece funcionar en el editor… hasta que conectás WhatsApp, Mercado Pago o cualquier servicio externo y los eventos jamás llegan. Es el error número uno de instalación, y el síntoma es engañoso porque las ejecuciones manuales sí andan.N8N_ENCRYPTION_KEY: n8n cifra todas las credenciales guardadas (tokens de Google, claves de API, accesos a bases) con esta clave. Si no la fijás, n8n genera una; si el contenedor se recrea sin el volumen correcto o migrás de servidor, la clave cambia y todas tus credenciales quedan ilegibles, sin recuperación posible. Generala conopenssl rand -hex 24, ponela en el.envy guardá una copia fuera del servidor (gestor de contraseñas).
Paso 2: docker-compose.yml
services:
postgres:
image: postgres:16
restart: unless-stopped
environment:
- POSTGRES_DB=n8n
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
env_file: .env
ports:
- "127.0.0.1:5678:5678"
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
volumes:
postgres_data:
n8n_data:
Detalle de seguridad importante: el puerto está atado a 127.0.0.1, así n8n no queda expuesto directo a internet. Solo el reverse proxy del paso siguiente lo va a alcanzar. Levantá todo con:
docker compose up -d
Paso 3: HTTPS con reverse proxy
n8n sin HTTPS no es opción: las credenciales y los datos de tus clientes viajarían en texto plano, y la mayoría de los servicios (Meta, Google) directamente rechazan webhooks sin TLS. La vía más simple es Caddy, que emite y renueva los certificados solo:
apt install -y caddy
# /etc/caddy/Caddyfile
n8n.tuempresa.com {
reverse_proxy 127.0.0.1:5678
}
systemctl reload caddy
Listo: https://n8n.tuempresa.com ya responde con certificado válido. Si preferís nginx + certbot funciona igual de bien; solo acordate de habilitar el soporte de WebSocket (cabeceras Upgrade y Connection), porque el editor de n8n lo usa y sin eso la interfaz se comporta raro.
Al entrar por primera vez, n8n te pide crear el usuario owner. Hacelo de inmediato: una instancia recién instalada y sin owner, expuesta a internet, es una invitación abierta.
Paso 4: backups, o el seguro que cuesta 10 minutos
Una instancia de n8n en producción acumula dos activos: los workflows y las credenciales. Perderlos es rehacer semanas de trabajo. El backup mínimo viable es un cron diario:
#!/bin/bash
# /opt/n8n/backup.sh
FECHA=$(date +%F)
docker exec $(docker compose -f /opt/n8n/docker-compose.yml ps -q postgres) \
pg_dump -U n8n n8n | gzip > /opt/backups/n8n-$FECHA.sql.gz
cp /opt/n8n/.env /opt/backups/env-$FECHA
find /opt/backups -mtime +14 -delete
Y la regla que separa un backup de una ilusión: copialo fuera del servidor (S3, Backblaze B2, o al menos otro VPS). Un backup que vive en la misma máquina muere con la misma máquina. Acordate de que el .env contiene la encryption key: el dump de la base sin esa clave es inservible.
¿Preferís que todo esto lo haga alguien que lo hizo decenas de veces? Agendá una reunión de presentación y te cotizamos la instalación llave en mano: servidor, HTTPS, backups y monitoreo funcionando en menos de una semana.
Errores típicos y su solución rápida
| Síntoma | Causa probable | Solución |
|---|---|---|
| Los webhooks no llegan (pero el test manual anda) | Falta WEBHOOK_URL o quedó con localhost |
Definirla con el dominio público y recrear el contenedor |
| "Credentials could not be decrypted" tras actualizar o migrar | Cambió la N8N_ENCRYPTION_KEY |
Restaurar la clave original del backup; si se perdió, hay que recargar credenciales a mano |
| El disco se llena a los pocos meses | Historial de ejecuciones sin límite | EXECUTIONS_DATA_PRUNE=true + EXECUTIONS_DATA_MAX_AGE |
| La interfaz carga pero se desconecta seguido | Reverse proxy sin WebSocket | Habilitar cabeceras Upgrade/Connection en nginx |
| Workflows lentos o caídos con volumen | VPS de 1-2 GB al límite | Subir a 4 GB; revisar workflows que cargan miles de ítems en memoria |
| Tareas programadas corren a cualquier hora | Timezone por defecto (UTC) | GENERIC_TIMEZONE y TZ con tu zona |
Para actualizar versión: backup primero, después docker compose pull && docker compose up -d. Evitá saltar de una versión muy vieja a la última de un tirón; n8n migra el esquema de la base al arrancar y conviene pasar por versiones intermedias y leer las release notes.
Cuándo NO conviene self-hostearlo
Esta guía te da una instancia sólida, pero el self-hosting es una responsabilidad continua, no un trámite de una vez:
- Si nadie en tu equipo va a dedicarle 2-4 horas mensuales (actualizaciones, logs, verificar backups), n8n Cloud a USD 24/mes es más barato que el primer incidente sin atender. Comparamos el costo total de las dos modalidades en cuánto cuesta n8n en 2026 y en n8n cloud vs self-hosted.
- Si tus workflows van a manejar datos críticos del negocio (cobranzas, facturación), el costo de una instancia mal asegurada no es el servidor: es el incidente.
- Si todavía no validaste que la automatización te sirve, probá primero en Cloud y migrá después; los workflows se exportan en JSON.
Instancia lista, ¿y ahora qué?
La instalación es el cimiento; el valor está en lo que construís arriba: conectar tu CRM, automatizar WhatsApp, orquestar agentes de IA y enchufar tus APIs propias. Ahí es donde las horas invertidas se convierten en horas ahorradas.
Y si llegaste hasta acá pensando "esto es exactamente lo que no quiero hacer yo": en Deepyze instalamos n8n self-hosted llave en mano —servidor endurecido, HTTPS, backups verificados, monitoreo— y construimos los workflows de tu operación como parte de nuestro servicio de automatización con IA. Contanos tu proyecto y en 24 horas tenés una propuesta con precio fijo, de un equipo en tu huso horario que después no desaparece: el mantenimiento también es nuestro.
Preguntas frecuentes
¿Qué necesito para instalar n8n self-hosted?+
Tres cosas: un VPS con 2 GB de RAM o más (desde USD 6-12/mes), un dominio o subdominio apuntando a ese servidor, y Docker con Docker Compose instalados. Con eso, una instalación básica con HTTPS funciona en 1-2 horas siguiendo los pasos correctos.
¿Por qué no me llegan los webhooks a n8n?+
Es el error número uno: falta definir la variable WEBHOOK_URL con tu dominio público (https://n8n.tudominio.com/). Sin ella, n8n genera URLs de webhook con localhost y los servicios externos no pueden alcanzarlas. También verificá que el reverse proxy pase las cabeceras y que el firewall permita el puerto 443.
¿Por qué n8n perdió mis credenciales después de actualizar?+
Porque la N8N_ENCRYPTION_KEY cambió o no estaba fijada. n8n cifra las credenciales guardadas con esa clave: si el contenedor se recrea y genera una clave nueva, las credenciales existentes quedan ilegibles para siempre. Definila explícitamente en el .env desde el día uno y guardala fuera del servidor.
¿n8n self-hosted necesita PostgreSQL?+
Por defecto usa SQLite, que alcanza para probar. Para producción conviene PostgreSQL: tolera más volumen, es más robusto ante cortes y simplifica los backups. Agregarlo son 15 líneas más en el docker-compose y la variable DB_TYPE=postgresdb.
¿Cómo actualizo n8n sin romper nada?+
Backup primero (base de datos y .env con la encryption key), después docker compose pull y docker compose up -d. Evitá saltar muchas versiones de golpe: n8n migra el esquema de datos al arrancar, y conviene leer las notas de la versión por cambios incompatibles en nodos que uses.
¿Buscás automatizar flujos empresariales sin pagar licencias abusivas por tarea?
Diseñamos y desplegamos infraestructuras de automatización con n8n y microservicios a medida que eliminan el 80% de las tareas manuales de tu equipo.
Contacto directo con ingenieros de software · Sin compromiso · Acuerdo de confidencialidad