Temari N8N - Unitat 2
Instal·lació i Configuració
Unitat 2: Instal·lació i Configuració
2.1. Instal·lació amb Docker
Requisits previs
Abans d'instal·lar N8N, cal assegurar-nos que el sistema compleix els requisits mínims:
Hardware mínim:
Hardware recomanat per producció:
Software necessari:
- Docker
- Versió mínima: 20.10
-
Versió recomanada: 24.0+
-
Docker Compose (opcional però recomanat)
- Versió mínima: 2.0
-
Versió recomanada: 2.23+
-
Sistema operatiu suportat:
- Linux: Ubuntu 20.04+, Debian 11+, CentOS 8+
- macOS: 11+ (Big Sur o superior)
- Windows: 10/11 amb WSL2
Verificar instal·lació de Docker:
# Verificar versió de Docker
docker --version
# Output esperat: Docker version 24.0.7, build afdd53b
# Verificar que Docker està executant-se
docker ps
# Output: Hauria de mostrar columnes però sense errors
# Verificar Docker Compose
docker compose version
# Output esperat: Docker Compose version v2.23.0
# Test bàsic de Docker
docker run hello-world
# Hauria de descarregar i executar el contenidor hello-world
Ports necessaris:
Verificar que els ports estan lliures:
# Linux/macOS
sudo lsof -i :5678
# No hauria de retornar res si el port està lliure
# Alternativa
netstat -tuln | grep 5678
Instal·lació bàsica amb Docker
La manera més ràpida de començar amb N8N és utilitzar Docker directament.
Pas 1: Descarregar la imatge de N8N
Això descarrega l'última versió estable de N8N. També pots especificar una versió concreta:
# Versió específica (recomanat per producció)
docker pull n8nio/n8n:1.22.0
# Latest (sempre l'última)
docker pull n8nio/n8n:latest
Pas 2: Executar N8N
Opció A: Execució simple (per a proves ràpides)
Paràmetres explicats:
- -it: Mode interactiu (veus els logs)
- --rm: Elimina el contenidor en aturar-lo
- --name n8n: Nom del contenidor
- -p 5678:5678: Mapeja port 5678 del host al contenidor
Avantatges: - ✅ Molt ràpid per provar - ✅ Neteja automàtica en aturar
Desavantatges: - ❌ Les dades es perden en aturar - ❌ No és persistent
Opció B: Execució persistent (recomanat)
docker run -d \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
--restart unless-stopped \
n8nio/n8n
Paràmetres addicionals:
- -d: Mode detached (executa en background)
- -v n8n_data:/home/node/.n8n: Volume persistent per a dades
- --restart unless-stopped: Reinicia automàticament si es cau
Verificar que funciona:
# Comprovar que el contenidor està executant-se
docker ps
# Output esperat:
# CONTAINER ID IMAGE STATUS PORTS NAMES
# abc123def456 n8nio/n8n Up 2 minutes 0.0.0.0:5678->5678/tcp n8n
# Veure els logs
docker logs n8n
# Veure logs en temps real
docker logs -f n8n
Pas 3: Accedir a N8N
Obre el navegador i ves a:
La primera vegada et demanarà crear un compte d'administrador.
Gestió bàsica del contenidor:
# Aturar N8N
docker stop n8n
# Iniciar N8N
docker start n8n
# Reiniciar N8N
docker restart n8n
# Veure logs
docker logs n8n
# Entrar al contenidor (debugging)
docker exec -it n8n /bin/sh
# Eliminar contenidor (PRECAUCIÓ: pots perdre dades si no tens volum)
docker rm n8n
# Eliminar contenidor i volum
docker rm n8n
docker volume rm n8n_data
Instal·lació amb Docker Compose
Docker Compose és la manera recomanada per a instal·lacions serioses, ja que permet gestionar múltiples contenidors i la configuració de manera declarativa.
Avantatges de Docker Compose: - ✅ Configuració en un sol fitxer - ✅ Fàcil de versionar amb Git - ✅ Gestió de múltiples serveis (N8N + PostgreSQL + Redis) - ✅ Reproducible en diferents entorns
Estructura de directoris recomanada:
Resultat:
Pas 1: Crear fitxer .env (variables d'entorn)
cat > .env << 'EOF'
# N8N Configuration
N8N_VERSION=latest
N8N_PORT=5678
# Security
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=CanviaAquestaContrasenya123!
# Encryption (IMPORTANT: Genera una clau única!)
N8N_ENCRYPTION_KEY=una_clau_molt_llarga_i_segura_de_32_caracters
# Database
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=ContraseanyaSeguraPostgres456!
# Timezone
GENERIC_TIMEZONE=Europe/Madrid
TZ=Europe/Madrid
# Webhooks
WEBHOOK_URL=http://localhost:5678/
N8N_HOST=localhost
N8N_PROTOCOL=http
EOF
IMPORTANT: Genera una clau d'encriptació única:
# Linux/macOS
openssl rand -hex 32
# Alternativa
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1
Copia el resultat i substitueix N8N_ENCRYPTION_KEY al fitxer .env.
Pas 2: Crear docker-compose.yml (configuració bàsica)
version: '3.8'
services:
n8n:
image: n8nio/n8n:${N8N_VERSION:-latest}
container_name: n8n
restart: unless-stopped
ports:
- "${N8N_PORT:-5678}:5678"
environment:
# Basic Auth
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
# Encryption
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
# Host & Webhooks
- N8N_HOST=${N8N_HOST}
- N8N_PORT=${N8N_PORT}
- N8N_PROTOCOL=${N8N_PROTOCOL}
- WEBHOOK_URL=${WEBHOOK_URL}
# Timezone
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${TZ}
# Database (per defecte usa SQLite intern)
- DB_TYPE=sqlite
volumes:
- ./n8n_data:/home/node/.n8n
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Pas 3: Crear docker-compose.yml (configuració amb PostgreSQL)
Per a producció, és millor utilitzar PostgreSQL en lloc de SQLite:
version: '3.8'
services:
postgres:
image: postgres:15-alpine
container_name: n8n-postgres
restart: unless-stopped
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 -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 5s
timeout: 5s
retries: 10
networks:
- n8n-network
n8n:
image: n8nio/n8n:${N8N_VERSION:-latest}
container_name: n8n
restart: unless-stopped
ports:
- "${N8N_PORT:-5678}:5678"
environment:
# Database
- 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}
# Basic Auth
- N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
# Encryption
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
# Host & Webhooks
- N8N_HOST=${N8N_HOST}
- N8N_PORT=${N8N_PORT}
- N8N_PROTOCOL=${N8N_PROTOCOL}
- WEBHOOK_URL=${WEBHOOK_URL}
# Timezone
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${TZ}
# Performance
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168 # 7 dies
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
networks:
- n8n-network
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
n8n-network:
driver: bridge
volumes:
postgres_data:
n8n_data:
Pas 4: Iniciar N8N
# Iniciar els serveis
docker compose up -d
# Veure els logs
docker compose logs -f
# Verificar que tot funciona
docker compose ps
# Output esperat:
# NAME IMAGE STATUS PORTS
# n8n n8nio/n8n:latest Up (healthy) 0.0.0.0:5678->5678/tcp
# n8n-postgres postgres:15-alpine Up (healthy)
Gestió amb Docker Compose:
# Aturar serveis
docker compose stop
# Iniciar serveis
docker compose start
# Reiniciar serveis
docker compose restart
# Aturar i eliminar contenidors (dades es mantenen als volums)
docker compose down
# Aturar, eliminar contenidors I volums (PRECAUCIÓ: perdràs dades)
docker compose down -v
# Actualitzar a nova versió
docker compose pull
docker compose up -d
# Veure logs d'un servei específic
docker compose logs -f n8n
docker compose logs -f postgres
# Executar comandes dins del contenidor
docker compose exec n8n /bin/sh
Configuració de variables d'entorn
N8N es configura principalment mitjançant variables d'entorn. Aquí tens les més importants:
Variables d'autenticació:
# Basic Auth (recomanat per a desenvolupament)
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=contrasenya_segura
# Desactivar autenticació (NO recomanat)
N8N_BASIC_AUTH_ACTIVE=false
Variables de base de dades:
# SQLite (per defecte, bo per a desenvolupament)
DB_TYPE=sqlite
# PostgreSQL (recomanat per producció)
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=password
DB_POSTGRESDB_SCHEMA=public # Opcional
# MySQL
DB_TYPE=mysqldb
DB_MYSQLDB_HOST=mysql
DB_MYSQLDB_PORT=3306
DB_MYSQLDB_DATABASE=n8n
DB_MYSQLDB_USER=n8n
DB_MYSQLDB_PASSWORD=password
Variables de seguretat:
# Clau d'encriptació (MOLT IMPORTANT)
N8N_ENCRYPTION_KEY=una_clau_unica_de_32_caracters_minim
# CORS (si accedeix des d'altres dominis)
N8N_CORS_ORIGIN=https://app.example.com
# JWT Secret (per a autenticació amb tokens)
N8N_JWT_SECRET=altra_clau_secreta_unica
Variables de xarxa i webhooks:
# Host i port
N8N_HOST=localhost # o el teu domini
N8N_PORT=5678
N8N_PROTOCOL=http # o https
# URL pública per a webhooks
WEBHOOK_URL=https://n8n.example.com/
# Path personalitzat
N8N_PATH=/n8n/ # Opcional, si està darrere d'un proxy
Variables de rendiment:
# Mode d'execució
EXECUTIONS_MODE=regular # o 'queue' per a producció
# Processos de workers (mode queue)
EXECUTIONS_PROCESS=main
N8N_CONCURRENCY_PRODUCTION=10 # Execucions concurrents
# Timeout d'execució (segons)
EXECUTIONS_TIMEOUT=3600 # 1 hora
EXECUTIONS_TIMEOUT_MAX=-1 # Il·limitat
Variables d'emmagatzematge d'execucions:
# Desar execucions
EXECUTIONS_DATA_SAVE_ON_ERROR=all
EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
# Neteja automàtica d'execucions antigues
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168 # Hores (7 dies)
EXECUTIONS_DATA_PRUNE_TIMEOUT=3600 # Timeout de neteja
Variables de timezone:
GENERIC_TIMEZONE=Europe/Madrid
TZ=Europe/Madrid
# Altres exemples:
# America/New_York
# Europe/London
# Asia/Tokyo
# UTC
Variables de logging:
# Nivell de log
N8N_LOG_LEVEL=info # error, warn, info, verbose, debug
# Output de logs
N8N_LOG_OUTPUT=console,file
# Fitxer de logs
N8N_LOG_FILE_LOCATION=/var/log/n8n/
N8N_LOG_FILE_SIZE_MAX=16 # MB
N8N_LOG_FILES_COUNT_MAX=100
Variables avançades:
# Desactivar telemetria
N8N_DIAGNOSTICS_ENABLED=false
# Personalitzar editor
N8N_EDITOR_BASE_URL=https://n8n.example.com
# Límits de payload
N8N_PAYLOAD_SIZE_MAX=16 # MB
# Configuració de Redis (mode queue)
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
QUEUE_BULL_REDIS_DB=0
QUEUE_BULL_REDIS_PASSWORD=redis_password
# Email (per notificacions)
N8N_EMAIL_MODE=smtp
N8N_EMAIL_SMTP_HOST=smtp.gmail.com
N8N_EMAIL_SMTP_PORT=465
N8N_EMAIL_SMTP_USER=your@email.com
N8N_EMAIL_SMTP_PASSWORD=your_password
N8N_EMAIL_SMTP_SENDER=n8n@example.com
Exemple complet de .env per producció:
# .env per a producció
# === GENERAL ===
N8N_VERSION=1.22.0 # Versió específica
N8N_PORT=5678
NODE_ENV=production
# === SEGURETAT ===
N8N_BASIC_AUTH_ACTIVE=false # Desactivat perquè usem LDAP
N8N_ENCRYPTION_KEY=a8f5f167f44f4964e6c998dee827110c5b1feeefc2a0482af43fa5c33e4e7a3d
N8N_JWT_SECRET=b9g6g278g55g5075f7d009eff938221d6c2gffffd3b1593bg54gb6d44f5f8b4e
# === AUTENTICACIÓ LDAP ===
N8N_AUTH_TYPE=ldap
N8N_AUTH_LDAP_URI=ldap://ldap.company.com
N8N_AUTH_LDAP_BASE_DN=dc=company,dc=com
N8N_AUTH_LDAP_BIND_DN=cn=admin,dc=company,dc=com
N8N_AUTH_LDAP_BIND_PASSWORD=ldap_admin_password
# === BASE DE DADES ===
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres-ha.internal
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n_prod
DB_POSTGRESDB_USER=n8n_app
DB_POSTGRESDB_PASSWORD=super_secure_db_password_123
DB_POSTGRESDB_SCHEMA=public
# === XARXA ===
N8N_HOST=n8n.company.com
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.company.com/
N8N_CORS_ORIGIN=https://app.company.com
# === TIMEZONE ===
GENERIC_TIMEZONE=Europe/Madrid
TZ=Europe/Madrid
# === EXECUCIONS ===
EXECUTIONS_MODE=queue
EXECUTIONS_PROCESS=main
N8N_CONCURRENCY_PRODUCTION=20
# Timeout
EXECUTIONS_TIMEOUT=7200 # 2 hores
EXECUTIONS_TIMEOUT_MAX=10800 # 3 hores màx
# Desar execucions
EXECUTIONS_DATA_SAVE_ON_ERROR=all
EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
# Neteja (mantenir 30 dies)
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=720 # 30 dies
# === REDIS (per mode queue) ===
QUEUE_BULL_REDIS_HOST=redis-ha.internal
QUEUE_BULL_REDIS_PORT=6379
QUEUE_BULL_REDIS_DB=0
QUEUE_BULL_REDIS_PASSWORD=redis_secure_password
# === LOGGING ===
N8N_LOG_LEVEL=info
N8N_LOG_OUTPUT=console,file
N8N_LOG_FILE_LOCATION=/var/log/n8n/
N8N_LOG_FILE_SIZE_MAX=32
N8N_LOG_FILES_COUNT_MAX=50
# === TELEMETRIA ===
N8N_DIAGNOSTICS_ENABLED=false
# === LÍMITS ===
N8N_PAYLOAD_SIZE_MAX=64 # MB
# === EMAIL ===
N8N_EMAIL_MODE=smtp
N8N_EMAIL_SMTP_HOST=smtp.company.com
N8N_EMAIL_SMTP_PORT=587
N8N_EMAIL_SMTP_USER=n8n@company.com
N8N_EMAIL_SMTP_PASSWORD=smtp_password
N8N_EMAIL_SMTP_SENDER=N8N Automation <n8n@company.com>
N8N_EMAIL_SMTP_SSL=false
Persistència de dades
És crucial entendre com N8N emmagatzema les dades per evitar pèrdues:
Què s'emmagatzema on:
/home/node/.n8n/
├── .cache/ # Cache temporal
├── custom/ # Custom nodes
│ └── nodes/
├── database.sqlite # Database (si uses SQLite)
├── nodes/ # Node modules addicionals
└── .n8n/
├── config # Configuració
└── encryption.key # Clau d'encriptació (si no està a ENV)
Opcions de persistència:
1. Named Volume (recomanat per a Docker simple)
docker run -d \
-v n8n_data:/home/node/.n8n \
n8nio/n8n
# Llistar volums
docker volume ls
# Inspeccionar volum
docker volume inspect n8n_data
# Backup de volum
docker run --rm \
-v n8n_data:/data \
-v $(pwd):/backup \
alpine tar czf /backup/n8n_backup.tar.gz /data
# Restore de volum
docker run --rm \
-v n8n_data:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/n8n_backup.tar.gz -C /
2. Bind Mount (millor per a desenvolupament)
Avantatges: - ✅ Accés directe als fitxers des del host - ✅ Fàcil de fer backup (copiar directori) - ✅ Bo per a desenvolupament de custom nodes
3. PostgreSQL extern (producció)
services:
n8n:
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=external-postgres.company.com
- DB_POSTGRESDB_DATABASE=n8n
Avantatges: - ✅ Base de dades gestionada (RDS, Cloud SQL) - ✅ Backups automàtics - ✅ Alta disponibilitat - ✅ Millor rendiment
Estratègia de backup completa:
#!/bin/bash
# backup_n8n.sh
BACKUP_DIR="/backups/n8n"
DATE=$(date +%Y%m%d_%H%M%S)
# 1. Backup de la base de dades
if [ "$DB_TYPE" = "postgresdb" ]; then
docker exec n8n-postgres pg_dump -U n8n n8n > "$BACKUP_DIR/db_$DATE.sql"
fi
# 2. Backup de fitxers N8N
docker run --rm \
-v n8n_data:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/files_$DATE.tar.gz /data
# 3. Backup de configuració
cp docker-compose.yml "$BACKUP_DIR/docker-compose_$DATE.yml"
cp .env "$BACKUP_DIR/env_$DATE.txt"
# 4. Encriptar backup (opcional)
gpg --encrypt --recipient admin@company.com "$BACKUP_DIR/db_$DATE.sql"
gpg --encrypt --recipient admin@company.com "$BACKUP_DIR/files_$DATE.tar.gz"
# 5. Pujar a S3 (opcional)
aws s3 cp "$BACKUP_DIR/db_$DATE.sql.gpg" s3://company-backups/n8n/
aws s3 cp "$BACKUP_DIR/files_$DATE.tar.gz.gpg" s3://company-backups/n8n/
# 6. Neteja de backups antics (mantenir 30 dies)
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
echo "Backup completat: $DATE"
Automatitzar amb cron:
# Editar crontab
crontab -e
# Afegir línia per backup diari a les 2 AM
0 2 * * * /path/to/backup_n8n.sh >> /var/log/n8n_backup.log 2>&1
2.2. Configuració inicial
Primer accés a la interfície web
Després d'iniciar N8N, accedeix a:
Pantalla inicial:
La primera vegada que accedeixis, veuràs:
- Setup Wizard (si és la primera vegada)
- Benvinguda a N8N
-
Opció de crear compte
-
Formulari de registre:
IMPORTANT: - Aquest és l'usuari administrador principal - Desa les credencials de manera segura (password manager) - No es pot recuperar fàcilment si es perd
Creació d'usuari administrador
Millors pràctiques per a l'usuari admin:
-
Contrasenya forta:
-
Email real i accessible:
- S'utilitza per a notificacions
-
Necessari per a recovery (si està configurat)
-
Documentar credencials:
Usuaris addicionals:
Després de crear l'admin, pots crear més usuaris:
- Anar a Settings > Users
- Click Invite user
- Introduir email
- Assignar rol:
- Owner: Control total (equivalent a admin)
- Member: Pot crear/editar workflows
- Viewer: Només pot veure
Gestió d'usuaris via CLI:
# Crear usuari des de la línia de comandes
docker exec -it n8n n8n user-management:add \
--email="user@company.com" \
--firstName="Joan" \
--lastName="Garcia" \
--password="TemporaryPass123!"
# Llistar usuaris
docker exec -it n8n n8n user-management:list
# Reset password
docker exec -it n8n n8n user-management:reset-password \
--email="user@company.com" \
--newPassword="NewSecurePass456!"
Configuració de credencials
Les credencials permeten a N8N connectar-se a serveis externs de manera segura.
Accedir a Credentials:
Tipus de credencials:
- API Key
- Més simple
- Una clau estàtica
-
Exemple: OpenAI API Key
-
OAuth2
- Més segur
- Autenticació delegada
-
Exemple: Google, GitHub
-
Basic Auth
- Username + Password
-
Exemple: PostgreSQL
-
Header Auth
- Custom headers
- Exemple: APIs propietàries
Crear una credencial (exemple: PostgreSQL):
- Click Create New
- Buscar "Postgres"
- Seleccionar Postgres account
- Emplenar dades:
- Click Save
- Test per verificar connexió
Crear credencial OAuth2 (exemple: Google Sheets):
- Crear OAuth2 credentials a Google Cloud Console
- A N8N:
- Credential Type: Google OAuth2 API
- Client ID: [del Google Cloud Console]
- Client Secret: [del Google Cloud Console]
- Scope: Automàtic per a Google Sheets
- Click Connect
- Autoritzar a Google
Reutilitzar credencials:
Workflow 1:
[HTTP Request] → usa "API Production Credentials"
Workflow 2:
[HTTP Request] → usa "API Production Credentials"
Avantatge: Canvies la credencial en un lloc i s'actualitza a tot arreu
Seguretat de credencials:
- ✅ Encriptades a la base de dades amb
N8N_ENCRYPTION_KEY - ✅ Mai s'exposen als logs
- ✅ Només accessibles per usuaris autoritzats
- ✅ Poden tenir permisos específics
Millors pràctiques:
-
Noms descriptius:
-
Rotació de credencials:
-
Principi de mínim privilegi:
-
Separar per entorn:
Configuració de timezone i locale
Per què és important:
- Workflows amb
Schedule Triggerusen timezone - Dates a logs i executions history
- Funcions de data (
$now,$today)
Configurar timezone:
Opció 1: Variable d'entorn (recomanat)
Timezones comunes:
Europe/Madrid
Europe/London
Europe/Paris
America/New_York
America/Los_Angeles
America/Mexico_City
Asia/Tokyo
Asia/Shanghai
Australia/Sydney
UTC # Universal Time
Opció 2: Per workflow (override)
A cada Schedule Trigger pots especificar timezone:
Verificar timezone:
Configuració de locale:
Afecta formats de data, nombres, etc.
Locales comuns:
ca_ES.UTF-8 # Català
es_ES.UTF-8 # Espanyol
en_US.UTF-8 # Anglès US
en_GB.UTF-8 # Anglès UK
fr_FR.UTF-8 # Francès
Exemple complet docker-compose.yml:
services:
n8n:
image: n8nio/n8n
environment:
# Timezone
- GENERIC_TIMEZONE=Europe/Madrid
- TZ=Europe/Madrid
# Locale
- LANG=ca_ES.UTF-8
- LC_ALL=ca_ES.UTF-8
Variables d'entorn importants
Resum de les variables més crítiques:
Seguretat (OBLIGATÒRIES per producció):
N8N_ENCRYPTION_KEY=... # Genera amb openssl rand -hex 32
N8N_JWT_SECRET=... # Genera amb openssl rand -hex 32
N8N_BASIC_AUTH_PASSWORD=... # Contrasenya forta
Base de dades (recomanat PostgreSQL):
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=...
Xarxa i webhooks:
Rendiment:
Neteja:
2.3. Gestió de credencials
Tipus d'autenticació
1. Predefined Credentials (Més de 400 serveis)
N8N té suport natiu per a centenars de serveis. Cada un amb el seu tipus de credencial optimitzat.
Exemples:
- Slack OAuth2
- Google OAuth2 API
- GitHub OAuth2
- AWS Credentials
- PostgreSQL
- MySQL
- MongoDB
- Mailchimp OAuth2
- ...i molts més
2. Generic Auth Types
Per a APIs personalitzades o serveis no predefinits:
API Key Auth:
Basic Auth:
Username: api_user
Password: api_password
(S'envia com: Authorization: Basic base64(username:password))
OAuth2:
Authorization URL: https://api.service.com/oauth/authorize
Access Token URL: https://api.service.com/oauth/token
Client ID: your_client_id
Client Secret: your_client_secret
Scope: read write
Header Auth:
Name: Authorization
Value: Bearer {{token}}
o múltiples headers:
Name: X-Custom-Auth
Value: custom_value
3. Custom Credentials
Pots crear tipus de credencials totalment personalitzats per a les teves APIs internes.
Exemple:
// custom-credential.ts
import { ICredentialType, NodePropertyTypes } from 'n8n-workflow';
export class MyCompanyApi implements ICredentialType {
name = 'myCompanyApi';
displayName = 'My Company API';
properties = [
{
displayName: 'API Endpoint',
name: 'apiEndpoint',
type: 'string' as NodePropertyTypes,
default: 'https://api.mycompany.com',
},
{
displayName: 'API Key',
name: 'apiKey',
type: 'string' as NodePropertyTypes,
default: '',
},
{
displayName: 'Secret',
name: 'secret',
type: 'string' as NodePropertyTypes,
typeOptions: {
password: true, // Amaga el valor
},
default: '',
},
];
}
Almacenamiento seguro de credenciales
Encriptació:
Totes les credencials s'encripten abans de desar-se a la base de dades.
MOLT IMPORTANT:
- La N8N_ENCRYPTION_KEY MAI ha de canviar
- Si la perds, les credencials són irrecuperables
- Fes backup de la clau de manera segura
Guardar la clau de manera segura:
# Opció 1: Secrets manager (AWS Secrets Manager, HashiCorp Vault)
docker run \
-e N8N_ENCRYPTION_KEY=$(aws secretsmanager get-secret-value --secret-id n8n-encryption-key --query SecretString --output text) \
n8nio/n8n
# Opció 2: Fitxer de secrets (Kubernetes)
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: n8n-secrets
type: Opaque
data:
encryption-key: YThmNWYxNjdmNDRmNDk2NGU2Yzk5OGRlZTgyNzExMGM= # base64
# Opció 3: Fitxer .env amb permisos restrictius
chmod 600 .env
chown root:root .env
Rotació de clau d'encriptació:
⚠️ Aquesta és una operació delicada:
# 1. Backup complet
./backup_n8n.sh
# 2. Script de re-encriptació (proporcionat per N8N)
docker exec -it n8n n8n rotate-encryption-key \
--oldKey="old_encryption_key" \
--newKey="new_encryption_key"
# 3. Actualitzar .env amb nova clau
# 4. Reiniciar N8N
docker compose restart
Reutilització de credencials entre workflows
Beneficis:
-
DRY (Don't Repeat Yourself):
-
Seguretat:
- Menys còpies de credencials = menys risc
-
Auditoria centralitzada
-
Manteniment:
- Més fàcil gestionar
Com reutilitzar:
Workflow: "Daily Sales Report"
↓
[PostgreSQL Node] → selecciona credencial "Production DB"
Workflow: "Customer Sync"
↓
[PostgreSQL Node] → selecciona credencial "Production DB"
Ambdós workflows usen la mateixa credencial!
Compartir credencials entre usuaris:
Per defecte, credencials són privades (només el creador les veu).
Fer una credencial compartida: 1. Editar credencial 2. A Sharing, seleccionar: - Owned by me: Només tu - Shared with specific users: Seleccionar usuaris - Shared with everyone: Tots els usuaris
Millors pràctiques:
✅ Credencials de serveis compartits → Shared
(DB producció, Slack company, etc.)
✅ Credencials personals → Private
(El teu Gmail, el teu GitHub personal)
✅ Credencials temporals de test → Private + eliminar després
Millors pràctiques de seguretat
1. Principi de mínim privilegi:
-- ❌ MAL: Donar tots els permisos
GRANT ALL PRIVILEGES ON database.* TO 'n8n'@'%';
-- ✅ BÉ: Només el necessari
GRANT SELECT, INSERT ON analytics.orders TO 'n8n_reader'@'%';
GRANT SELECT ON analytics.customers TO 'n8n_reader'@'%';
2. Rotació regular:
Calendari de rotació:
- API Keys: cada 90 dies
- Database passwords: cada 180 dies
- OAuth tokens: refresh automàtic
- Service accounts: cada any
3. Auditoria:
-- Query per veure qui usa cada credencial
SELECT
c.name as credential_name,
u.email as created_by,
COUNT(DISTINCT w.id) as workflows_using,
c.createdAt,
c.updatedAt
FROM credentials c
LEFT JOIN users u ON c.userId = u.id
LEFT JOIN workflow_entity w ON w.id IN (
SELECT workflowId FROM credentials_entity WHERE credentialsId = c.id
)
GROUP BY c.id;
4. Separació per entorn:
Development:
├── Dev PostgreSQL (localhost)
├── Dev API Keys (test mode)
└── Mock services
Staging:
├── Staging PostgreSQL (staging.db)
├── Staging API Keys
└── Mirror de producció
Production:
├── Prod PostgreSQL (prod.db)
├── Prod API Keys
└── Real services
5. Secrets mai al codi:
// ❌ MAL
const apiKey = "sk_live_abc123...";
// ✅ BÉ
// Usar credencial de N8N
const credentials = this.getCredentials('myApi');
const apiKey = credentials.apiKey;
6. Monitoratge:
Alertes a configurar:
- Credencial fallida (auth error) → Slack
- Credencial usada des d'IP inusual → PagerDuty
- Credencial modificada → Email a admin
- Intent d'accés a credencial sense permisos → Security log
7. Backup de credencials:
⚠️ Les credencials al backup estan encriptades amb N8N_ENCRYPTION_KEY
# Backup segur
pg_dump n8n | gpg --encrypt --recipient admin@company.com > backup.sql.gpg
# Guardar també la encryption key (SEPARAT!)
echo "N8N_ENCRYPTION_KEY=..." | gpg --encrypt --recipient admin@company.com > encryption_key.txt.gpg
# Guardar en llocs diferents
aws s3 cp backup.sql.gpg s3://backups/n8n/
aws s3 cp encryption_key.txt.gpg s3://backups-keys/n8n/ # Diferent bucket!
Resum Unitat 2:
Hem cobert: 1. Instal·lació de N8N amb Docker (simple i amb Docker Compose) 2. Configuració de variables d'entorn essencials 3. Gestió de persistència i backups 4. Configuració inicial de l'aplicació 5. Gestió segura de credencials
Conceptes clau:
- Docker Compose és la manera recomanada per a instal·lacions serioses
- PostgreSQL és millor que SQLite per a producció
- N8N_ENCRYPTION_KEY és crític - mai el perdis!
- Les credencials es poden reutilitzar entre workflows
- Segueix sempre el principi de mínim privilegi
Pròxims passos: A la Unitat 3 aprendrem els conceptes fonamentals: nodes, workflows, i com flueixen les dades dins de N8N.