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.
¿Querés que esto funcione en tu empresa?
En Deepyze convertimos procesos manuales en sistemas que trabajan solos: automatización con IA, apps web y móviles, y software a medida. Contanos tu caso y en 24 hs tenés una propuesta concreta.
Sin compromiso · Respuesta en 24 hs · Equipo en tu mismo huso horario