Salta el contingut

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:

CPU:    2 cores
RAM:    2 GB (4 GB recomanat)
Disk:   10 GB lliure (més per a dades)

Hardware recomanat per producció:

CPU:    4+ cores
RAM:    8 GB
Disk:   50+ GB SSD
Network: 100 Mbps

Software necessari:

  1. Docker
  2. Versió mínima: 20.10
  3. Versió recomanada: 24.0+

  4. Docker Compose (opcional però recomanat)

  5. Versió mínima: 2.0
  6. Versió recomanada: 2.23+

  7. Sistema operatiu suportat:

  8. Linux: Ubuntu 20.04+, Debian 11+, CentOS 8+
  9. macOS: 11+ (Big Sur o superior)
  10. 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:

5678  - N8N Web UI (HTTP)
5679  - N8N Web UI (HTTPS, opcional)

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

docker pull n8nio/n8n:latest

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)

docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  n8nio/n8n

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:

http://localhost:5678

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:

mkdir -p ~/n8n-setup
cd ~/n8n-setup

# Crear estructura
mkdir -p n8n_data postgres_data redis_data

Resultat:

~/n8n-setup/
├── docker-compose.yml
├── .env
├── n8n_data/
├── postgres_data/
└── redis_data/

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)

# docker-compose.yml
services:
  n8n:
    volumes:
      - ./n8n_data:/home/node/.n8n

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:

http://localhost:5678

Pantalla inicial:

La primera vegada que accedeixis, veuràs:

  1. Setup Wizard (si és la primera vegada)
  2. Benvinguda a N8N
  3. Opció de crear compte

  4. Formulari de registre:

    Email: admin@company.com
    First name: Admin
    Last name: User
    Password: ************
    

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:

  1. Contrasenya forta:

    Mínim 12 caràcters
    Majúscules i minúscules
    Números
    Símbols especials
    
    Exemple: Adm!n2024$N8n#Secure
    

  2. Email real i accessible:

  3. S'utilitza per a notificacions
  4. Necessari per a recovery (si està configurat)

  5. Documentar credencials:

    Lloc: Password manager de l'empresa
    Label: N8N Production Admin
    URL: https://n8n.company.com
    Username: admin@company.com
    Password: [guardat de manera segura]
    Notes: Usuari administrador principal
    

Usuaris addicionals:

Després de crear l'admin, pots crear més usuaris:

  1. Anar a Settings > Users
  2. Click Invite user
  3. Introduir email
  4. Assignar rol:
  5. Owner: Control total (equivalent a admin)
  6. Member: Pot crear/editar workflows
  7. 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:

Settings (⚙️) > Credentials

Tipus de credencials:

  1. API Key
  2. Més simple
  3. Una clau estàtica
  4. Exemple: OpenAI API Key

  5. OAuth2

  6. Més segur
  7. Autenticació delegada
  8. Exemple: Google, GitHub

  9. Basic Auth

  10. Username + Password
  11. Exemple: PostgreSQL

  12. Header Auth

  13. Custom headers
  14. Exemple: APIs propietàries

Crear una credencial (exemple: PostgreSQL):

  1. Click Create New
  2. Buscar "Postgres"
  3. Seleccionar Postgres account
  4. Emplenar dades:
    Name: Production PostgreSQL
    Host: db.company.com
    Database: analytics
    User: n8n_user
    Password: ************
    Port: 5432
    SSL: Enabled
    
  5. Click Save
  6. Test per verificar connexió

Crear credencial OAuth2 (exemple: Google Sheets):

  1. Crear OAuth2 credentials a Google Cloud Console
  2. A N8N:
  3. Credential Type: Google OAuth2 API
  4. Client ID: [del Google Cloud Console]
  5. Client Secret: [del Google Cloud Console]
  6. Scope: Automàtic per a Google Sheets
  7. Click Connect
  8. 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:

  1. Noms descriptius:

    ✅ Production PostgreSQL - Analytics DB
    ✅ Staging Slack - #alerts channel
    ❌ postgres1
    ❌ api_key
    

  2. Rotació de credencials:

    # Programa rotacions regulars
    API Keys: cada 90 dies
    Passwords: cada 180 dies
    OAuth tokens: refresh automàtic
    

  3. Principi de mínim privilegi:

    -- Crear usuari només amb permisos necessaris
    CREATE USER n8n_reader WITH PASSWORD 'password';
    GRANT SELECT ON analytics.* TO n8n_reader;
    -- NO donsis permisos de DROP, DELETE si no són necessaris
    

  4. Separar per entorn:

    Development:
    - Dev PostgreSQL
    - Dev API Keys
    
    Staging:
    - Staging PostgreSQL
    - Staging API Keys
    
    Production:
    - Prod PostgreSQL
    - Prod API Keys
    

Configuració de timezone i locale

Per què és important:

  • Workflows amb Schedule Trigger usen timezone
  • Dates a logs i executions history
  • Funcions de data ($now, $today)

Configurar timezone:

Opció 1: Variable d'entorn (recomanat)

# .env o docker-compose.yml
GENERIC_TIMEZONE=Europe/Madrid
TZ=Europe/Madrid

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:

Schedule: 0 9 * * *
Timezone: Europe/Madrid

Verificar timezone:

# Dins del contenidor
docker exec -it n8n date

# Hauria de mostrar data/hora correcta

Configuració de locale:

Afecta formats de data, nombres, etc.

# Variables d'entorn
LANG=ca_ES.UTF-8
LC_ALL=ca_ES.UTF-8

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:

N8N_HOST=n8n.company.com
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.company.com/

Rendiment:

EXECUTIONS_MODE=queue          # Per producció
N8N_CONCURRENCY_PRODUCTION=10  # Segons capacitat

Neteja:

EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168    # 7 dies


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:

Header Name: X-API-Key
API Key: sk_live_abc123...

o

Query Parameter:
Name: api_key
Value: abc123...

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.

Credencial (plain text)
Encriptar amb N8N_ENCRYPTION_KEY (AES-256-GCM)
Guardar a DB

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:

  1. DRY (Don't Repeat Yourself):

    1 credencial → usada en 50 workflows
    
    Si canvia API key: canvies 1 cop, funciona a tot arreu
    

  2. Seguretat:

  3. Menys còpies de credencials = menys risc
  4. Auditoria centralitzada

  5. Manteniment:

  6. 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.