Instalación de n8n con Docker y PostgreSQL
n8n es una plataforma de automatización de flujos de trabajo que puedes ejecutar en tu propio servidor. Una instancia autoalojada mantiene tus flujos de trabajo, credenciales y datos de ejecución bajo tu control y no tiene límites en el número de flujos de trabajo o ejecuciones más allá de lo que el servidor pueda manejar.
Esta guía configura n8n en un servidor dedicado con PostgreSQL, HTTPS y copias de seguridad. Utiliza tres contenedores administrados por Docker Compose:
- n8n, la propia plataforma de automatización;
- PostgreSQL, la base de datos para flujos de trabajo, credenciales e historial de ejecución;
- Caddy, un proxy inverso que obtiene y renueva un certificado HTTPS automáticamente.
Por defecto, n8n almacena sus datos en SQLite. Esta guía utiliza PostgreSQL en su lugar: se puede hacer una copia de seguridad mientras n8n está en ejecución y es la base de datos que n8n recomienda para el autoalojamiento.
Los pasos se probaron en Ubuntu 24.04 LTS con n8n 2.46.7, PostgreSQL 17, Docker 29 y Docker Compose v5.
Antes de comenzar
Necesitarás:
- un servidor con Ubuntu 24.04 LTS con acceso root a través de SSH;
- un dominio o subdominio para n8n, por ejemplo
n8n.example.com; - un registro A para ese nombre que apunte a la dirección IPv4 del servidor.
Si el dominio también tiene un registro AAAA, el servidor debe ser accesible a través de IPv6 en esa dirección. De lo contrario, Let's Encrypt puede intentar usar IPv6 primero y fallar al emitir el certificado.
Comprueba que el registro se resuelve en tu servidor antes de continuar:
dig +short n8n.example.com
El comando debería devolver la dirección IP del servidor. La emisión del certificado en Caddy depende de esto, así que espera hasta que el DNS se haya propagado.
Todos los comandos siguientes se ejecutan como root. Si trabajas como un usuario normal con derechos sudo, añade sudo antes de cada comando.
Instalar Docker
Instala Docker Engine y el plugin Compose desde el repositorio oficial de Docker. El paquete docker.io del repositorio de Ubuntu es más antiguo y no incluye Compose v2.
apt update && apt install -y ca-certificates curl 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
Añade el repositorio:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list
Instala los paquetes:
apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Comprueba que ambas herramientas están disponibles:
docker --version docker compose version
Crear el directorio del proyecto y los secretos
Todos los archivos de n8n estarán en /opt/n8n:
mkdir -p /opt/n8n && cd /opt/n8n
Crea el archivo .env con tu dominio, zona horaria y secretos generados. Reemplaza n8n.example.com y la zona horaria con tus propios valores:
cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env
GENERIC_TIMEZONE establece la zona horaria utilizada por el nodo Schedule Trigger y otros nodos basados en el tiempo. Sin él, n8n utiliza America/New_York.
N8N_ENCRYPTION_KEY es la clave que n8n utiliza para cifrar las credenciales que guardas en él: tokens de API, contraseñas, secretos de OAuth. Si se pierde esta clave, las credenciales en una base de datos restaurada no se pueden descifrar y cada una de ellas tendrá que ser introducida de nuevo.
Copia el archivo .env a un lugar seguro fuera del servidor de inmediato, por ejemplo, un gestor de contraseñas. Una copia de seguridad de la base de datos sin N8N_ENCRYPTION_KEY restaurará tus flujos de trabajo, pero no tus credenciales.
Crear el archivo Docker Compose
Crea /opt/n8n/compose.yaml:
services: postgres: image: postgres:17 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 n8n: image: docker.n8n.io/n8nio/n8n restart: unless-stopped depends_on: postgres: condition: service_healthy 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_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:
Algunos detalles en este archivo son importantes para la seguridad y la estabilidad.
PostgreSQL no tiene una sección de puertos. La base de datos solo es accesible por los otros contenedores del proyecto, nunca desde internet.
El puerto de n8n se publica como 127.0.0.1:5678. Los usuarios llegan a n8n solo a través de Caddy por HTTPS, mientras que tú aún puedes comprobar n8n localmente en el servidor.
No acortes la línea del puerto de n8n a 5678:5678. Docker añade sus propias reglas de firewall para los puertos publicados, y estas omiten UFW. Sin el prefijo 127.0.0.1, n8n se vuelve accesible a través de HTTP simple desde cualquier lugar, incluso si UFW bloquea el puerto 5678.
La condición depends_on con un healthcheck hace que n8n espere hasta que PostgreSQL esté listo para aceptar conexiones. Sin ella, n8n puede iniciarse primero en un arranque en frío y fallar al conectarse a la base de datos.
N8N_PROXY_HOPS le indica a n8n que se ejecuta detrás de un proxy inverso, por lo que lee la dirección real del cliente desde las cabeceras del proxy. N8N_WEBHOOK_URL establece la dirección pública que n8n muestra para las URL de los webhooks. En las versiones de n8n anteriores a la 2.30, esta variable se llama WEBHOOK_URL.
Configurar HTTPS con Caddy
Crea /opt/n8n/Caddyfile con tu dominio:
n8n.example.com { reverse_proxy n8n:5678 }
Esa es toda la configuración. En el primer inicio, Caddy solicita un certificado de Let's Encrypt para el dominio, redirige HTTP a HTTPS y renueva el certificado antes de que caduque. Los puertos 80 y 443 deben estar abiertos para que esto funcione.
Configurar el firewall
Permite SSH primero, luego HTTP y HTTPS, y habilita UFW:
ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status
Si UFW ya estaba habilitado con tus propias reglas, ejecuta ufw status antes de hacer cambios y mantén las reglas que necesites. Permitir OpenSSH antes de habilitar UFW evita que tu sesión SSH actual se corte.
Iniciar n8n
Inicia los contenedores en segundo plano:
cd /opt/n8n docker compose up -d
El primer inicio descarga las imágenes y tarda uno o dos minutos. Comprueba que los tres contenedores estén en ejecución y que PostgreSQL esté saludable (healthy):
docker compose ps
Mira el registro de n8n:
docker compose logs n8n --tail 50
El registro debería terminar con una línea como:
Editor is now accessible via: https://n8n.example.com
Comprueba que n8n responda localmente y a través de Caddy:
curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz
Ambos comandos deberían devolver {"status":"ok"}.
Si el segundo comando falla, comprueba el registro de Caddy con docker compose logs caddy. La causa más común es un registro DNS que aún no apunta a este servidor, o los puertos 80 y 443 están cerrados.
Crear la cuenta de propietario
Abre https://n8n.example.com en tu navegador. En la primera visita, n8n te pide que crees la cuenta de propietario. Esta cuenta tiene derechos completos sobre la instancia y gestiona a todos los demás usuarios.

Introduce tu correo electrónico, nombre y apellidos, y una contraseña, luego haz clic en Siguiente (Next). La contraseña debe tener al menos 8 caracteres y contener al menos un número y una letra mayúscula. Usa una segura: el editor de n8n está abierto a internet, y cualquiera que entre en él puede ejecutar comandos en el servidor a través de tus flujos de trabajo.
Después del primer inicio de sesión, n8n muestra una breve encuesta: Customize n8n to you. Las preguntas son opcionales. Haz clic en Empezar (Get started) para cerrarla, con o sin responder.

A continuación, n8n ofrece una clave de licencia gratuita para varias funciones de la Community Edition: depuración avanzada, búsqueda y etiquetado de ejecuciones, y carpetas para flujos de trabajo. La clave se envía al correo electrónico que introduzcas. Haz clic en Send me a free license key para obtenerla, o en Omitir (Skip) si no necesitas estas funciones.

Se abre la página de descripción general. La instalación está completa y puedes crear tu primer flujo de trabajo.

Hacer una copia de seguridad de n8n
Una copia de seguridad de n8n consta de dos partes: un volcado (dump) de PostgreSQL con tus flujos de trabajo, credenciales, usuarios e historial de ejecución, y el archivo .env con N8N_ENCRYPTION_KEY. Ninguna de las dos partes es útil sin la otra.
En esta configuración, n8n mantiene todo su estado en PostgreSQL. El volumen n8n_data no necesita ser respaldado: una restauración completa funciona solo con el volcado de la base de datos y el archivo .env.
Crea un directorio de copia de seguridad y vuelca la base de datos:
mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/
El volcado se realiza mientras n8n está en ejecución, por lo que no se necesita tiempo de inactividad.
Una copia de seguridad que permanece en el mismo servidor no ayudará si el disco del servidor falla. Copia /opt/n8n-backup a un almacenamiento externo de forma regular. Puedes usar INTROSERV Cloud Storage para esto, como se describe en la guía Conexión de INTROSERV Cloud Storage al servidor .
Restaurar desde una copia de seguridad
Para restaurar n8n en un nuevo servidor, instala Docker como se describió anteriormente y copia el directorio de copia de seguridad a /opt/n8n-backup en ese servidor. Luego, coloca los archivos de configuración en su lugar:
mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env
Si el nuevo servidor tiene una dirección IP diferente, actualiza primero el registro A del dominio.
Inicia solo la base de datos:
cd /opt/n8n docker compose up -d postgres
Espera hasta que docker compose ps muestre PostgreSQL como saludable (healthy), luego restaura el volcado:
docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump
Inicia el resto de la pila:
docker compose up -d
Inicia sesión con la misma cuenta de propietario y comprueba que tus flujos de trabajo y credenciales estén en su lugar. Las credenciales guardadas se descifran con N8N_ENCRYPTION_KEY del archivo .env restaurado, por lo que funcionan sin tener que introducirlas de nuevo.
Actualizar n8n
n8n lanza actualizaciones a menudo. Para actualizar a la última versión, extrae las nuevas imágenes y recrea los contenedores:
cd /opt/n8n docker compose pull docker compose up -d docker image prune -f
El último comando elimina las imágenes antiguas que ya no se utilizan.
Comprueba la nueva versión:
docker compose exec n8n n8n --version
Haz una copia de seguridad antes de cada actualización. Al iniciarse, una nueva versión de n8n puede migrar el esquema de la base de datos, por lo que la forma fiable de volver a la versión anterior es restaurar un volcado hecho antes de la actualización.
La imagen de PostgreSQL está fijada en la versión principal 17, por lo que docker compose pull solo instala actualizaciones menores de PostgreSQL. Pasar a una nueva versión principal requiere un volcado y una restauración y no se hace automáticamente.
¿Qué sigue?
Tu instancia de n8n está lista para trabajar. Desde aquí puedes:
- invitar a otros usuarios a la instancia;
- configurar SMTP para que n8n pueda enviar invitaciones y correos electrónicos de restablecimiento de contraseña;
- conectar tus servicios y construir tus primeros flujos de trabajo.
Si planeas ejecutar flujos de trabajo de IA con modelos de lenguaje locales, consulta la guía Instalación de n8n AI Starter Kit con Ollama.