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 exposahttps://n8n.elmeudomini.comcap 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_PASSWORDper un password robust. - Canvia
N8N_ENCRYPTION_KEYper 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.
- Entra al panell de Nginx Proxy Manager.
- Ves a Hosts → Proxy Hosts → Add Proxy Host.
- Omple els camps:
- Domain Names:
n8n.elmeudomini.com - Scheme:
http - Forward Hostname / IP: la IP del servidor (per exemple
127.0.0.1si és el mateix host). - Forward Port:
8089
- Domain Names:
- A la pestanya Options:
- Activa Websockets Support.
- Activa Block Common Exploits.
- 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:
- Obre el navegador i ves a
https://n8n.elmeudomini.com. - Segueix l’assistent inicial per:
- Crear el primer usuari administrador.
- Configurar les preferències bàsiques.
- 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:
- 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
- Fes abans una còpia de seguretat (BBDD + carpetes de dades).
- 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.comgestionat per Nginx Proxy Manager. - Una base sòlida per començar a crear automatitzacions robustes i escalables.