Instalación de n8n con PostgreSQL usando Docker Compose
Resumen
Instala y configura n8n con un PostgreSQL externo usando Docker Compose de forma clara y segura. Aquí verás cómo definir variables de entorno, crear los services de docker-compose.yml, ajustar puertos y volúmenes para persistencia, y validar que los datos se guardan en la base de datos con la contraseña encriptada.
¿Cómo preparar el entorno con Docker Compose?
Empieza con un directorio (por ejemplo, n8n-docker-compose). Crea un archivo .env para centralizar credenciales y luego un docker-compose.yml con dos services: uno para postgres y otro para n8n. La idea es que n8n dependa de postgres y almacene todo en esa base de datos.
¿Qué variables de entorno usar en .env?
Define credenciales simples para la prueba y el nombre de la base de datos. Se usan luego con env_file y en environment.
Claves y conceptos: - env_file: referencia al archivo .env para no exponer credenciales en el manifiesto. - environment: mapea variables a la imagen en tiempo de ejecución.
¿Cómo definir los servicios postgres y n8n?
Configura dos services en el docker-compose.yml.
Postgres. - Imagen: postgres 16. - container_name: postgres. - restart: recomendado para que se reinicie si falla. - env_file: .env con las credenciales. - environment: POSTGRES_USER, POSTGRES_PASSWORD y POSTGRES_DB desde .env. - Puertos: mapeo host: 5432 → container: 5432. - Volumen: db_data para persistir datos.
n8n. - Imagen: latest, o fija una versión concreta (por ejemplo, 1.106.1). - container_name: n8n. - restart: igual que postgres. - depends: espera a que postgres esté arriba antes de iniciar. - Variables de entorno clave: - timezone general y de la app: Europa/Berlín. - nodeenv: production. - Tipo de base de datos: Postgres DB. - Host: postgres. - Puerto: 5432. - Database, user y password: tomado de .env. - Puertos: expón 5678 para acceder a n8n. - Volumen: n8n_data para la configuración de n8n.
Ideas esenciales. - Mapeo de puertos: primero el puerto del host, luego el del container (ej.: 5678:5678 en n8n y 5432:5432 en postgres). - Volúmenes: db_data y n8n_data aseguran persistencia de datos más allá del ciclo de vida del container.
¿Cómo arrancar y acceder a n8n?
Lanza los servicios y valida que todo arranca bien.
docker compose up
Verás logs de postgres y n8n ejecutándose.
Copia la URL que muestre la consola. El puerto es 5678.
Aparecerá la pantalla para crear un usuario inicial.
¿Cómo verificar PostgreSQL y n8n están conectados?
Abre tu interfaz gráfica de Postgres en el IDE. Conecta al puerto 5432 con usuario admin, contraseña admin y la base de datos n8n_db. En el esquema public verás tablas que n8n necesita. Al inicio la tabla de usuarios está vacía.
Crea un usuario en n8n desde la pantalla inicial: correo, nombre, apellido y una contraseña segura.
Vuelve a la base de datos y refresca la tabla de usuarios: ahora verás el registro creado y la contraseña encriptada [1:18].
Habilidades y conceptos reforzados. - Variables de entorno: separa configuración sensible (.env) y consume con env_file y environment. - Política de restart: resiliencia ante fallos del container. - depends: orden de arranque; n8n espera a postgres. - Mapeo de puertos: 5432 para PostgreSQL y 5678 para n8n. - Volúmenes: persistencia con db_data y n8n_data. - Producción con nodeenv y timezone consistente.
¿Te quedó alguna duda o quieres compartir tu variante de docker-compose? Comenta y cuéntame cómo lo configuraste.
Automatización con n8n auto-hospedado usando Docker Compose y PostgreSQL (pgvector).
Incluye scripts de inicialización de base de datos y una estructura mínima para levantar el stack rápidamente en entornos locales o servidores.
me parece muy importante poner las variables importantes, como por ejemplo en la clase puede hacer falta:
N8N_HOST
WEBHOOK_URL
N8N_EDITOR_BASE_URL
Super importante esto si usan selfhosted como render, a mi me toco ponerlos para usar los wehbooks de esta manera
Comparto este repo con postgres, reedis, n8n y ngrok para que puedan tener redis con docker y un tunel para poder usarlo en internet a pesar de estar en local:
La configuración de los volúmenes no es correcta. Al usar el ''./' en los servicios se crea un directorio en la misma ubicación que el compose.yml. Si lo que se busca es eso, no es necesario declarar los volúmenes debajo. Pero si se quieren usar volúmenes de docker en su lugar el './' no va. Ejemplo: - n8n-data/home/node/.n8n
Parece trival pero entender esto evita problemas de permisos en servidores Linux bien configurados.
Me pasó que el servicio de n8n no se estaba comunicando con el servicio de Postgres. Me salía ECONNREFUSED ::1:5432. Después de un tiempo, fue que me di cuenta de que tenía un typo en las variables de entorno de Postgres en el servicio de n8n. Por si alguien tiene el mismo problema
Me paso exactamente igual, 3 horas dando vueltas... resiliencia 😂