Com desplegar n8n + PostgreSQL amb Docker i Nginx Proxy Manager

En aquest article veurem com desplegar n8n (plataforma d’automatització de fluxos de treball) juntament amb una base de dades PostgreSQL utilitzant Docker i exposant el servei de forma segura mitjançant Nginx Proxy Manager.

L’objectiu és tenir n8n accessible a través del domini:

https://n8n.elmeudomini.com

amb totes les dades guardades en una base de dades PostgreSQL i amb persistència en disc.

1. Requisits previs

Abans de començar, assumirem que ja tens:

  • Un servidor (VPS o dedicat) amb Linux (per exemple Debian).
  • Docker i Docker Compose instal·lats.
  • Un domini apuntant al servidor (ex.: n8n.elmeudomini.com).
  • Nginx Proxy Manager (NPM) ja instal·lat i funcionant.
  • Has decidit que el port intern que utilitzarà n8n a l’host serà el 8089, que és el que utilitzarà NPM per fer de proxy.
En aquest article no entrarem en el detall de la configuració de DNS ni de la instal·lació de NPM; ens centrarem en n8n + PostgreSQL + Docker.

2. Arquitectura de la solució

El desplegament es basa en tres peces principals:

  • PostgreSQL (contenidor Docker)
    Emmagatzema la base de dades de n8n (workflows, execucions, credencials xifrades, etc.).
  • n8n (contenidor Docker)
    L’aplicació d’automatització pròpiament dita, que es connecta a PostgreSQL.
  • Nginx Proxy Manager
    Gestiona el certificat SSL (Let’s Encrypt) i exposa https://n8n.elmeudomini.com cap al port 8089 de l’host, que a la vegada redirigeix al port intern de n8n (5678 dins el contenidor).

3. Preparar l’estructura de directoris

Escollim una ruta de treball, per exemple:

sudo mkdir -p /docker/n8n/{n8n_data,postgres_data}
cd /docker/n8n

En aquest directori tindrem:

  • compose.yaml → fitxer de Docker Compose.
  • .env → variables d’entorn i secrets.
  • n8n_data/ → dades i configuració interna de n8n.
  • postgres_data/ → dades de PostgreSQL (volum persistent).

4. Crear el fitxer .env

El fitxer .env ens permet separar credencials i paràmetres de configuració del codi. Crea’l amb:

nano /docker/n8n/.env

I afegeix-hi, per exemple:

# Zona horària
TZ=Europe/Madrid

# --- POSTGRES ---
POSTGRES_DB=n8n
POSTGRES_USER=n8n_user
POSTGRES_PASSWORD=posa_aqui_un_password_molt_fort

# --- CONFIG DB N8N (ha de coincidir amb la part de Postgres) ---
DB_TYPE=postgresdb
DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_USER=${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
DB_POSTGRESDB_SCHEMA=public

# --- DOMINI N8N ---
N8N_HOST=n8n.elmeudomini.com
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.elmeudomini.com/

# --- ALTRES ---
GENERIC_TIMEZONE=Europe/Madrid

# Clau d'encriptació de credencials (IMPORTANT: guarda-la bé i no la perdis)
# Pots generar-la, per exemple, amb:
#   openssl rand -hex 32
N8N_ENCRYPTION_KEY=posa_aqui_una_clau_llarga_i_random

Punts importants:

  • Canvia POSTGRES_PASSWORD per un password robust.
  • Canvia N8N_ENCRYPTION_KEY per una clau llarga, aleatòria i guardada en un lloc segur.
  • No la canviïs a la lleugera un cop n8n estigui en producció (afecta a la desxifrada de credencials).

5. Crear el compose.yaml

Ara crearem el fitxer de Docker Compose amb els serveis de PostgreSQL i n8n.

nano /docker/n8n/compose.yaml

Contingut recomanat:

services:
postgres:
image: postgres:16
container_name: n8n-postgres
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
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:latest
container_name: n8n-app
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
env_file:
- .env
environment:
# Configuració de domini
N8N_HOST: ${N8N_HOST}
N8N_PORT: ${N8N_PORT}
N8N_PROTOCOL: ${N8N_PROTOCOL}
WEBHOOK_URL: ${WEBHOOK_URL}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}

# Configuració de la base de dades
DB_TYPE: ${DB_TYPE}
DB_POSTGRESDB_DATABASE: ${DB_POSTGRESDB_DATABASE}
DB_POSTGRESDB_HOST: ${DB_POSTGRESDB_HOST}
DB_POSTGRESDB_PORT: ${DB_POSTGRESDB_PORT}
DB_POSTGRESDB_USER: ${DB_POSTGRESDB_USER}
DB_POSTGRESDB_PASSWORD: ${DB_POSTGRESDB_PASSWORD}
DB_POSTGRESDB_SCHEMA: ${DB_POSTGRESDB_SCHEMA}

# Encriptació de credencials
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}

# Port intern 5678 → port host 8089
ports:
- "8089:5678"
volumes:
- ./n8n_data:/home/node/.n8n

Comentaris:

PostgreSQL utilitza ./postgres_data com a volum per guardar les dades.

n8n
exposa el port 5678 dins el contenidor, que mapejem al port 8089 de l’host (tal com farà servir NPM).

Estem utilitzant la imatge :latest; en entorns crítics es recomana fixar una versió concreta (ex.: 1.XX.X) per tenir actualitzacions controlades.

6. Arrencar els contenidors

Un cop creats .env i compose.yaml, podem arrencar el stack:

cd /docker/n8n
docker compose pull
docker compose up -d

Comprova l’estat dels serveis:

docker compose ps

I revisa els logs de n8n per assegurar que arrenca correctament i es connecta a la base de dades:

docker compose logs -f n8n

Si tot és correcte, n8n estarà escoltant al port 8089 de l’host.


7. Configurar el Proxy Host a Nginx Proxy Manager

Ara cal dir-li a Nginx Proxy Manager que redirigeixi el domini cap al port 8089 del servidor.

  1. Entra al panell de Nginx Proxy Manager.
  2. Ves a Hosts → Proxy Hosts → Add Proxy Host.
  3. Omple els camps:
    • Domain Names: n8n.elmeudomini.com
    • Scheme: http
    • Forward Hostname / IP: la IP del servidor (per exemple 127.0.0.1 si és el mateix host).
    • Forward Port: 8089
  4. A la pestanya Options:
    • Activa Websockets Support.
    • Activa Block Common Exploits.
  5. A la pestanya SSL:
    • Tria Request a new SSL Certificate (Let’s Encrypt).
    • Marca Force SSL si vols forçar sempre HTTPS.
    • Accepta els termes i guarda.

Després d’això, el domini https://n8n.elmeudomini.com ja hauria de carregar la interfície de n8n.


8. Primera configuració de n8n

Amb el servei en marxa:

  1. Obre el navegador i ves a https://n8n.elmeudomini.com.
  2. Segueix l’assistent inicial per:
    • Crear el primer usuari administrador.
    • Configurar les preferències bàsiques.
  3. Prova de crear un workflow de prova:
    • Per exemple, un node Cron que executi cada minut i un node HTTP Request o Webhook.
    • Guarda el flux i comprova que funciona.

Si després de parar i tornar a arrencar els contenidors (amb docker compose down i docker compose up -d) els workflows segueixen estant allí, la persistència està funcionant correctament.

9. Backups i actualitzacions

Backups

Hi ha dos elements que val la pena copiar periòdicament:

  1. Base de dades PostgreSQL Exemple de backup manual:
mkdir -p /backups/n8n

docker exec -t n8n-postgres pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > /backups/n8n/n8n_$(date +%F).sql

Dades de n8n

Fes còpia de la carpeta:

/docker/n8n/n8n_data

Pots utilitzar rsync, snapshots del servidor, o qualsevol sistema de còpies de seguretat que facis servir habitualment.

Actualitzar n8n i PostgreSQL

  1. Fes abans una còpia de seguretat (BBDD + carpetes de dades).
  2. Actualitza les imatges i recrea els contenidors:
cd /docker/n8n
docker compose pull
docker compose up -d

Revisa els logs de n8n per comprovar que les migracions de base de dades s’han completat sense errors:

docker compose logs -f n8n

Si alguna cosa falla, pots tornar a una versió anterior de la imatge i restaurar el backup de la base de dades.


10. Conclusions

Amb aquesta configuració tens:

  • n8n funcionant en mode servidor, amb totes les dades guardades a PostgreSQL.
  • Un desplegament contenit amb Docker, fàcil de replicar i moure entre servidors.
  • Accés segur a través del domini https://n8n.elmeudomini.com gestionat per Nginx Proxy Manager.
  • Una base sòlida per començar a crear automatitzacions robustes i escalables.

Feu un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Desplaça cap amunt