tva
← Insights

Guida completa alla risoluzione dei problemi di n8n self-hosted 2025: risolvere errori di dimensione dati di esecuzione e problemi webhook con Traefik

Ultimo aggiornamento: 15 ottobre 2025

Il self-hosting di n8n offre esecuzioni di workflow illimitate, controllo completo dei dati e risparmi significativi rispetto ai piani cloud. Ma in realtà, le istanze self-hosted affrontano sfide uniche che gli utenti cloud non incontrano mai – in particolare riguardo alla gestione di grandi volumi di dati e alla configurazione dei webhook con i reverse proxy.

A giugno 2025, abbiamo pubblicato due guide alla risoluzione dei problemi che affrontavano queste questioni separatamente. Il problema è che non esisteva una guida completa per i deployment in produzione di n8n con il reverse proxy Traefik che affrontasse entrambi i problemi comuni insieme.

Questa guida combina entrambe le soluzioni originali, fornisce la configurazione completa di Traefik con supporto WebSocket, include i nuovi requisiti dei task runner del 2025 e offre file docker-compose production-ready che puoi implementare immediatamente.


Indice

  1. Diagnosi rapida: quale problema hai?
  2. Comprendere i due problemi principali
  3. Soluzione #1: errore di dati di esecuzione troppo grandi
  4. Soluzione #2: problemi con gli URL dei webhook
  5. Configurazione completa per la produzione con Traefik
  6. Requisito 2025: Task Runner
  7. Riferimento variabili d'ambiente
  8. Esempi di Docker Compose
  9. Test della configurazione
  10. Risoluzione dei problemi comuni

Diagnosi rapida: quale problema hai?

Sintomo: “Existing execution data is too large”

Vedi questo errore quando:

  • Clicchi “Execute Node” durante lo sviluppo del workflow
  • Testi workflow con dataset di grandi dimensioni o molti elementi
  • Usi la modalità di esecuzione parziale (test dei singoli nodi)
  • Elabori trasformazioni complesse con rami multipli

Ti serve: Soluzione #1: dimensione dei dati di esecuzione


Sintomo: i webhook mostrano URL errati o non funzionano

Lo vedi quando:

  • Gli URL dei webhook vengono visualizzati con numeri di porta (es. :5678)
  • I servizi esterni (Slack, GitHub, Stripe) non riescono a raggiungere i tuoi webhook
  • I webhook funzionano in modalità test ma falliscono in produzione
  • Stai usando un reverse proxy (Nginx, Traefik, Caddy)

Ti serve: Soluzione #2: configurazione degli URL dei webhook


Sintomo: avvisi di deprecazione sui task runner

Vedi nei log:

Running n8n without task runners is deprecated. Task runners will be
turned on by default in a future version.

Ti serve: Configurazione dei Task Runner


Sintomo: vuoi una configurazione completa e production-ready

Ti serve:

  • Entrambe le soluzioni applicate correttamente
  • Reverse proxy Traefik con HTTPS automatico
  • Best practice e sicurezza per la produzione
  • Limiti di risorse e monitoraggio appropriato

Vai a: Configurazione completa per la produzione


Comprendere i due problemi principali

Perché n8n Cloud non ha questi problemi

n8n Cloud gestisce automaticamente limiti di memoria più elevati per l'esecuzione parziale, URL dei webhook corretti, archiviazione ottimizzata dei dati binari e aggiornamenti automatici che includono tutti i nuovi requisiti. Quando fai self-hosting, sei responsabile di queste configurazioni.

Le cause alla radice

Problema #1: limite di dimensione dei dati di esecuzione

Il limite predefinito di 16MB per i dati di esecuzione parziale inviati al backend genera errori quando si lavora con dataset di grandi dimensioni, molti rami di workflow o trasformazioni complesse. Il problema è che lo sviluppo dei workflow diventa frustrante – non puoi testare i singoli nodi durante lo sviluppo. La soluzione è semplice: la variabile d'ambiente N8N_PAYLOAD_SIZE_MAX.

Problema #2: generazione degli URL dei webhook

n8n tenta di rilevare automaticamente il tuo URL pubblico, ma questo rilevamento automatico fallisce quando si è dietro un reverse proxy. I servizi esterni ricevono URL webhook errati con porte o hostname interni – le integrazioni si interrompono silenziosamente. La soluzione: la variabile d'ambiente WEBHOOK_URL.


Soluzione #1: errore di dati di esecuzione troppo grandi

Il problema nel dettaglio

Quando esegui solo una parte di un workflow (cliccando “Execute Node” nell'editor), n8n deve caricare i dati di esecuzione precedenti per fornire contesto a quel nodo. Per impostazione predefinita, n8n limita questo trasferimento di dati a 16MB per prevenire problemi di memoria su server più piccoli.

Il messaggio di errore

Secondo la documentazione ufficiale di n8n:

Please execute the whole workflow, rather than just the node.
(Existing execution data is too large.)

Questo errore appare quando si elaborano migliaia di elementi in un singolo nodo, si lavora con risposte JSON API di grandi dimensioni, si trasformano dataset di grandi dimensioni con nodi Code o si utilizzano workflow con molti rami paralleli.

La soluzione: N8N_PAYLOAD_SIZE_MAX

La soluzione è semplice ma richiede la comprensione delle risorse disponibili del tuo server.

Impostazioni raccomandate per RAM del server

RAM del serverN8N_PAYLOAD_SIZE_MAXValore in bytePercentuale di RAM
2GB o meno64MB67108864~3%
4GB128MB134217728~3%
8GB256MB268435456~3%
16GB+512MB536870912~3%

Regola generale: Usa meno del 20% della RAM disponibile per mantenere il sistema stabile sotto carico.

Implementazione con Docker Compose

version: '3.8'

services:
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    ports:
      - "5678:5678"
    environment:
      - N8N_PORT=5678

      # Payload size fix (256MB for 8GB+ RAM servers)
      - N8N_PAYLOAD_SIZE_MAX=268435456

      # Binary data optimization (highly recommended)
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
      - N8N_BINARY_DATA_TTL=1440  # 24 hours

    volumes:
      - n8n_data:/home/node/.n8n

    # Resource limits (adjust based on your server)
    deploy:
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 1G

volumes:
  n8n_data:

Comprendere la modalità dati binari

Predefinita: archiviazione in memoria (non raccomandata)

# This is the default - DON'T use in production
N8N_DEFAULT_BINARY_DATA_MODE=default

Problemi: Archivia i file (immagini, PDF, ecc.) nella RAM, spreca memoria preziosa, non adatta per carichi di lavoro in produzione, limita il numero di file che puoi elaborare.

Dai nostri test: la modalità predefinita usa ~315MB di RAM contro 211MB con la modalità filesystem – ovvero ~100MB di RAM risparmiati.

Raccomandata: archiviazione su filesystem

N8N_DEFAULT_BINARY_DATA_MODE=filesystem
N8N_BINARY_DATA_TTL=1440  # Clean up after 24 hours (value in minutes)

Vantaggi: Archivia i file su disco anziché nella RAM, prestazioni significativamente migliori con file di grandi dimensioni, production-ready e raccomandato da n8n, pulizia automatica con TTL che previene l'accumulo su disco.

Importante: Se si utilizza la modalità a coda (esecuzione distribuita basata su Redis), è necessario mantenere la modalità dati binari predefinita poiché l'archiviazione su filesystem non è supportata con la modalità a coda.

Impatto nel mondo reale

Dai nostri test Docker di ottobre 2025 con n8n versione 1.115.2:

ConfigurazioneUtilizzo memoriaDifferenza
Predefinita (nessuna correzione)315 MBBase di riferimento
Con correzione payload + modalità filesystem211 MB-104 MB

Scoperta chiave: La combinazione di dimensione payload aumentata e modalità binaria su filesystem in realtà riduce l'utilizzo di memoria perché i dati vengono gestiti in modo più efficiente su disco anziché nella RAM.


Soluzione #2: problemi con gli URL dei webhook

Il problema nel dettaglio

Quando n8n genera gli URL dei webhook da visualizzare nell'editor e da registrare con i servizi esterni, tenta di rilevare automaticamente il tuo URL pubblico. Dietro un reverse proxy, questo rilevamento automatico fallisce in modo clamoroso.

Cosa vedrai (gli URL sbagliati)

http://n8n.yourdomain.com:5678/webhook/abc123

Problemi con questo URL:

  1. Numero di porta incluso (:5678) – i servizi esterni tipicamente non riescono a raggiungere porte non standard
  2. Protocollo errato (http vs https) – molti servizi richiedono HTTPS
  3. Hostname interno – potrebbe essere il nome del container Docker anziché il dominio pubblico

Perché i servizi esterni falliscono

Servizi come GitHub, Slack, Stripe, Zoom, Google Sheets e centinaia di altri tentano di inviare webhook a questi URL errati e falliscono silenziosamente. Configuri l'integrazione, sembra corretta nell'interfaccia, ma le notifiche non arrivano mai.

La soluzione: variabile d'ambiente WEBHOOK_URL

Secondo la documentazione ufficiale di n8n:

“The WEBHOOK_URL environment variable is used to manually set the webhook URL so that n8n can display it in the editor UI and register the correct webhook URLs with external services. When running n8n behind a reverse proxy, it’s important to set this variable.”

Configurazione di base

environment:
  - WEBHOOK_URL=https://n8n.yourdomain.com
  - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.yourdomain.com
  - N8N_TRUST_PROXY_HEADER=true
  - N8N_PROXY_HOPS=1

Cosa fa ciascuna variabile

WEBHOOK_URL (LA PIÙ IMPORTANTE)

  • L'URL pubblico per tutti gli endpoint webhook
  • Usato per registrare i webhook con i servizi esterni
  • Deve corrispondere esattamente alla tua configurazione Traefik/reverse proxy
  • Nota sulla versione: Rinominato da WEBHOOK_TUNNEL_URL nella v0.227.0, il vecchio nome è stato rimosso in n8n 1.0

N8N_EDITOR_BASE_URL

  • L'URL per accedere all'interfaccia web di n8n
  • Di solito identico a WEBHOOK_URL
  • Viene mostrato nella barra degli indirizzi del browser e negli inviti via email

N8N_PROTOCOL

  • Impostare su https per la produzione (con SSL/TLS)
  • Impostare su http solo per test locali
  • Deve corrispondere alla terminazione del tuo reverse proxy

N8N_HOST

  • Solo il nome del tuo dominio pubblico
  • Non includere il protocollo (https://) o la porta
  • Esempio: n8n.yourdomain.com non https://n8n.yourdomain.com:443

N8N_TRUST_PROXY_HEADER

  • Deve essere true quando si è dietro un reverse proxy
  • Permette a n8n di vedere gli indirizzi IP reali dei client dagli header del proxy
  • Necessario per la corretta gestione delle richieste e la sicurezza

N8N_PROXY_HOPS

  • Impostare su 1 quando si è dietro un reverse proxy
  • Impostare su 2 se si è dietro due proxy (raro)
  • Indica a n8n quanti livelli di proxy considerare attendibili

Test degli URL dei webhook

Prima della correzione

Nell'interfaccia di n8n, crea un nodo Webhook e controlla l'URL mostrato:

http://n8n.example.com:5678/webhook/abc123  ❌ Errato

Dopo la correzione

Lo stesso nodo webhook ora mostra:

https://n8n.example.com/webhook/abc123  ✅ Corretto

Differenza fondamentale: I servizi esterni ora possono raggiungere questo URL perché utilizza la porta HTTPS standard 443 (gestita dal tuo reverse proxy) anziché la porta interna 5678.


Configurazione completa per la produzione con Traefik

Perché Traefik?

Traefik è un reverse proxy moderno perfettamente adatto ai deployment Docker – HTTPS automatico tramite Let's Encrypt senza gestione manuale dei certificati, service discovery che rileva automaticamente i container tramite le label Docker, supporto WebSocket fondamentale per la funzionalità webhook di n8n, configurazione semplice con sole label Docker anziché file di configurazione complessi e una dashboard integrata per monitorare routing e certificati in tempo reale.

Panoramica dell'architettura

Internet
  ↓
[Traefik Reverse Proxy]
  ↓ HTTPS (Let's Encrypt)
  ↓ WebSocket Support

[n8n Container]

↓ Rete interna [Database PostgreSQL]

Configurazione fondamentale: supporto WebSocket

Questa è la configurazione più comunemente dimenticata e causa il fallimento dei webhook:

labels:
  # WebSocket middleware (ABSOLUTELY REQUIRED)
  - "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Upgrade=websocket"
  - "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Connection=Upgrade"

  # Apply middleware to router
  - "traefik.http.routers.n8n.middlewares=n8n-websocket"

Senza gli header WebSocket:

  • ❌ I webhook in tempo reale falliscono
  • ❌ I webhook in produzione vanno in timeout
  • ❌ I servizi esterni non riescono a mantenere connessioni persistenti
  • ❌ Gli errori di integrazione appaiono in modo intermittente e imprevedibile

Docker Compose completo per la produzione

Questa configurazione combina entrambe le correzioni, include Traefik con supporto WebSocket appropriato e segue le best practice per la produzione:

version: '3.8'

networks:
  traefik-net:
    external: true
  n8n-internal:
    internal: true

services:
  # PostgreSQL Database
  postgres:
    image: postgres:16-alpine
    container_name: n8n-postgres
    restart: unless-stopped
    networks:
      - n8n-internal
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=n8n
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n"]
      interval: 10s
      timeout: 5s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 512M

  # n8n Application
  n8n:
    image: n8nio/n8n:latest
    container_name: n8n
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - traefik-net
      - n8n-internal

    # Traefik Configuration Labels
    labels:
      # Enable Traefik for this container
      - "traefik.enable=true"
      - "traefik.docker.network=traefik-net"

      # Router configuration
      - "traefik.http.routers.n8n.rule=Host(`${N8N_DOMAIN}`)"
      - "traefik.http.routers.n8n.entrypoints=websecure"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"

      # Service configuration
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

      # Middleware: Request size limit (100MB)
      - "traefik.http.middlewares.n8n-buffering.buffering.maxRequestBodyBytes=104857600"

      # Middleware: WebSocket support (CRITICAL - DO NOT SKIP)
      - "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Upgrade=websocket"
      - "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Connection=Upgrade"

      # Middleware: Security headers
      - "traefik.http.middlewares.n8n-security.headers.customResponseHeaders.X-Robots-Tag=noindex,nofollow"
      - "traefik.http.middlewares.n8n-security.headers.sslProxyHeaders.X-Forwarded-Proto=https"

      # Apply ALL middlewares
      - "traefik.http.routers.n8n.middlewares=n8n-buffering,n8n-websocket,n8n-security"

    environment:
      # Database Configuration
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}

      # FIX #2: Webhook URL Configuration
      - WEBHOOK_URL=https://${N8N_DOMAIN}
      - N8N_EDITOR_BASE_URL=https://${N8N_DOMAIN}
      - N8N_PROTOCOL=https
      - N8N_HOST=${N8N_DOMAIN}
      - N8N_PORT=5678
      - N8N_TRUST_PROXY_HEADER=true
      - N8N_PROXY_HOPS=1

      # FIX #1: Payload Size Configuration
      - N8N_PAYLOAD_SIZE_MAX=268435456  # 256MB

      # Binary Data Management
      - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
      - N8N_BINARY_DATA_TTL=1440  # 24 hours

      # 2025 Requirement: Task Runners
      - N8N_RUNNERS_ENABLED=true
      - N8N_RUNNERS_MODE=internal
      - N8N_RUNNERS_MAX_CONCURRENCY=5

      # Production Optimizations
      - NODE_ENV=production
      - EXECUTIONS_DATA_MAX_AGE=168  # 7 days
      - EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
      - N8N_LOG_LEVEL=info
      - N8N_LOG_OUTPUT=console

      # Timezone (adjust to your location)
      - GENERIC_TIMEZONE=America/New_York
      - TZ=America/New_York

      # Security
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}

    volumes:
      - n8n_data:/home/node/.n8n

    # Resource Limits (8GB+ RAM server)
    deploy:
      resources:
        limits:
          memory: 2G
          cpus: '2.0'
        reservations:
          memory: 1G
          cpus: '1.0'

    # Health Check
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:5678/healthz"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

volumes:
  n8n_data:
  postgres_data:

Configurazione di Traefik

Se non hai ancora Traefik in esecuzione, ecco la configurazione completa:

Passo 1: creare la rete Traefik

docker network create traefik-net

Passo 2: creare la configurazione di Traefik

Crea traefik/traefik.yml:

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: traefik-net

certificatesResolvers:
  letsencrypt:
    acme:
      email: your-email@example.com  # CHANGE THIS
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

log:
  level: INFO

accessLog: {}

Passo 3: creare il Docker Compose di Traefik

Crea traefik/docker-compose.yml:

version: '3.8'

networks:
  traefik-net:
    external: true

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - traefik-net
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"  # Dashboard (secure this in production!)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/traefik.yml:ro
      - ./letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"

Passo 4: creare il file environment

Crea .env nella tua directory n8n:

# Domain Configuration
N8N_DOMAIN=n8n.yourdomain.com

# Database Password (generate secure password)
DB_PASSWORD=your_secure_db_password_here

# n8n Encryption Key (generate random string)
N8N_ENCRYPTION_KEY=your_encryption_key_here

Genera valori sicuri:

# For DB_PASSWORD
openssl rand -base64 32

# For N8N_ENCRYPTION_KEY
openssl rand -hex 32

Passo 5: avviare tutto

# Start Traefik first
cd traefik
docker compose up -d

# Wait a few seconds, then start n8n
cd ../n8n
docker compose up -d

# Watch logs to verify startup
docker compose logs -f n8n

Verifica della configurazione

Controlla la dashboard di Traefik

Visita http://your-server-ip:8080 (oppure configura il dominio per la dashboard)

Dovresti vedere:

  • ✅ Router n8n attivo con stato verde
  • ✅ Certificato ottenuto da Let’s Encrypt
  • ✅ Servizio contrassegnato come sano

Controlla l'accesso a n8n

Visita https://n8n.yourdomain.com

Dovresti vedere:

  • ✅ HTTPS funzionante con certificato Let’s Encrypt valido
  • ✅ Nessun avviso di sicurezza del browser
  • ✅ La pagina di login/configurazione di n8n appare correttamente

Controlla gli URL dei webhook

  1. Accedi a n8n
  2. Crea un nuovo workflow
  3. Aggiungi un nodo Webhook
  4. Controlla il “Production URL” mostrato

Atteso:

https://n8n.yourdomain.com/webhook/abc123

NON questo (significa che la configurazione è errata):

http://n8n.yourdomain.com:5678/webhook/abc123  ❌

Requisito 2025: Task Runner

Cosa sono i Task Runner?

I task runner eseguono il codice definito nei nodi Code all'interno di processi isolati anziché nel processo principale di n8n. Questo fornisce una migliore sicurezza attraverso ambienti sandboxed, una stabilità migliorata dove gli errori del codice non causano il crash del processo principale e compatibilità futura poiché saranno richiesti nelle prossime versioni di n8n.

Perché è importante adesso

Dalla documentazione ufficiale di n8n:

“Running n8n without task runners is deprecated. Task runners will be turned on by default in a future version. Users are advised to set N8N_RUNNERS_ENABLED=true now to avoid potential issues in the future.”

Dai nostri log di test (ottobre 2025):

There are deprecations related to your environment variables:
 - N8N_RUNNERS_ENABLED -> Running n8n without task runners is deprecated.

Configurazione

Modalità interna (raccomandata per server singolo)

environment:
  - N8N_RUNNERS_ENABLED=true
  - N8N_RUNNERS_MODE=internal
  - N8N_RUNNERS_MAX_CONCURRENCY=5

n8n avvia il task runner come processo figlio – la configurazione più semplice, senza necessità di infrastruttura aggiuntiva, adatta alla maggior parte dei deployment self-hosted, con un overhead di prestazioni minimo.

Modalità esterna (per configurazioni distribuite)

environment:
  - N8N_RUNNERS_ENABLED=true
  - N8N_RUNNERS_MODE=external
  - N8N_RUNNERS_AUTH_TOKEN=your_secure_token

Container task runner separati forniscono un migliore isolamento delle risorse per workflow ad alto volume, consentono lo scaling orizzontale su più server, ma richiedono orchestrazione (Docker Swarm, Kubernetes).

Verifica dei Task Runner

Controlla la lista dei processi

docker exec n8n ps aux

Senza task runner (3 processi):

PID   USER     TIME  COMMAND
    1 node      0:00 tini -- /docker-entrypoint.sh
    7 node      0:12 node /usr/local/bin/n8n

Con task runner (4 processi):

PID   USER     TIME  COMMAND
    1 node      0:00 tini -- /docker-entrypoint.sh
    7 node      0:16 node /usr/local/bin/n8n
   18 node      0:10 node [...]/task-runner/dist/start.js

Evidenza: processo task runner visibile con PID 18.

Controlla i log

docker logs n8n | grep -i runner

Dovresti vedere:

n8n Task Broker ready on 127.0.0.1, port 5679
Registered runner "JS Task Runner" (zCWpF0Eb_LJsqWYvLm5t1)

Impatto sull'utilizzo delle risorse

Dai nostri test Docker (ottobre 2025, n8n versione 1.115.2):

ConfigurazioneMemoriaCPUProcessi
Senza task runner214 MB0.14%3
Con task runner289 MB0.29%4
Differenza+75 MB+0.15%+1

Overhead minimo. I vantaggi – sicurezza, stabilità, preparazione al futuro – superano ampiamente il piccolo costo in termini di risorse.


Riferimento variabili d'ambiente

Lista completa delle variabili

VariabileTipoPredefinitoScopoPriorità
Variabili critiche
WEBHOOK_URLStringURL webhook pubblicoOBBLIGATORIO con reverse proxy
N8N_PAYLOAD_SIZE_MAXNumber16777216(16MB)Dimensione max dati di esecuzioneOBBLIGATORIO per dati di grandi dimensioni
N8N_RUNNERS_ENABLEDBooleanfalseAbilita task runnerOBBLIGATORIO per il 2025
N8N_TRUST_PROXY_HEADERBooleanfalseConsidera attendibili gli header del reverse proxyOBBLIGATORIO con proxy
Configurazione webhook
N8N_EDITOR_BASE_URLStringURL dell'interfaccia editorRaccomandato
N8N_PROTOCOLStringhttpProtocollo (http/https)Produzione
N8N_HOSTStringlocalhostHostname pubblicoProduzione
N8N_PORTNumber5678Porta internaOpzionale
N8N_PROXY_HOPSNumber0Numero di reverse proxyImpostare su 1 con proxy
Prestazioni
N8N_DEFAULT_BINARY_DATA_MODEStringdefaultModalità archiviazione binariaRaccomandato
N8N_BINARY_DATA_TTLNumber60Pulizia dati binari (minuti)Raccomandato
Task Runner
N8N_RUNNERS_MODEStringinternalModalità task runnerSe runner abilitati
N8N_RUNNERS_MAX_CONCURRENCYNumber5Max task runner concorrentiOpzionale

Preset di configurazione per scenario

Scenario A: sviluppo (macchina locale)

environment:
  - N8N_PORT=5678

Da usare quando: Test in locale, nessun reverse proxy, nessun requisito di produzione

Scenario B: dietro reverse proxy (senza dati di grandi dimensioni)

environment:
  - N8N_PORT=5678
  - WEBHOOK_URL=https://n8n.yourdomain.com
  - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.yourdomain.com
  - N8N_TRUST_PROXY_HEADER=true
  - N8N_PROXY_HOPS=1
  - N8N_RUNNERS_ENABLED=true

Da usare quando: Istanza n8n pubblica, webhook necessari, workflow di dimensioni ridotte

Scenario C: configurazione completa per la produzione

environment:
  # Database
  - DB_TYPE=postgresdb
  - DB_POSTGRESDB_HOST=postgres
  - DB_POSTGRESDB_PORT=5432
  - DB_POSTGRESDB_DATABASE=n8n
  - DB_POSTGRESDB_USER=n8n
  - DB_POSTGRESDB_PASSWORD=${DB_PASSWORD}

  # Webhooks
  - WEBHOOK_URL=https://n8n.yourdomain.com
  - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
  - N8N_PROTOCOL=https
  - N8N_HOST=n8n.yourdomain.com
  - N8N_PORT=5678
  - N8N_TRUST_PROXY_HEADER=true
  - N8N_PROXY_HOPS=1

  # Performance
  - N8N_PAYLOAD_SIZE_MAX=268435456  # 256MB
  - N8N_DEFAULT_BINARY_DATA_MODE=filesystem
  - N8N_BINARY_DATA_TTL=1440

  # Task Runners
  - N8N_RUNNERS_ENABLED=true
  - N8N_RUNNERS_MODE=internal
  - N8N_RUNNERS_MAX_CONCURRENCY=5

  # Production
  - NODE_ENV=production
  - EXECUTIONS_DATA_MAX_AGE=168  # 7 days
  - EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
  - N8N_LOG_LEVEL=info

  # Security
  - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}

Da usare quando: Deployment in produzione con tutte le funzionalità, workflow di grandi dimensioni, accesso pubblico


Esempi di Docker Compose

Tutti e quattro gli scenari dal nostro ambiente di test sono disponibili. Queste configurazioni sono state validate con n8n versione 1.115.2 a ottobre 2025.

Confronto dell'utilizzo delle risorse (dai nostri test)

ScenarioMemoriaCPUProcessiDescrizione
Predefinito315 MB0.00%3Nessuna correzione, base di riferimento
Correzione payload211 MB0.00%3Payload + modalità filesystem
Correzione webhook215 MB0.14%3Solo configurazione webhook
Produzione289 MB0.29%4Tutte le correzioni + task runner

Scoperta chiave: La configurazione di produzione con tutte le correzioni utilizza MENO memoria della configurazione predefinita grazie alla modalità binaria su filesystem.


Test della configurazione

Checklist pre-deployment

1. Configurazione DNS

# Verify DNS points to your server
nslookup n8n.yourdomain.com

# Should return your server's public IP

2. Disponibilità delle porte

# Check if required ports are free
sudo netstat -tlnp | grep -E '(80|443|5678)'

# Should show nothing or only Traefik on 80/443

3. Installazione di Docker

# Verify Docker
docker --version

# Verify Docker Compose
docker compose version

4. Variabili d'ambiente

# Verify .env file exists
cat .env

# Should show N8N_DOMAIN, DB_PASSWORD, N8N_ENCRYPTION_KEY

Passi per il deployment

# Step 1: Create Traefik network
docker network create traefik-net

# Step 2: Start Traefik
cd traefik
docker compose up -d

# Step 3: Wait for Traefik to be ready
sleep 10

# Step 4: Start n8n
cd ../n8n
docker compose up -d

# Step 5: Watch logs for any errors
docker compose logs -f n8n

Test post-deployment

Test 1: accesso HTTPS

curl -I https://n8n.yourdomain.com

Atteso: HTTP/2 200 (oppure HTTP/1.1 200)

Test 2: redirect da HTTP a HTTPS

curl -I http://n8n.yourdomain.com

Atteso: HTTP/1.1 308 Permanent Redirect con Location: https://n8n.yourdomain.com

Test 3: stato di salute dei container

docker ps

Atteso: Sia n8n che n8n-postgres mostrano lo stato (healthy)

Test 4: formato degli URL dei webhook

  1. Accedi all'interfaccia web di n8n
  2. Crea un nuovo workflow
  3. Aggiungi un nodo Webhook
  4. Controlla il Production URL mostrato

Formato atteso:

https://n8n.yourdomain.com/webhook/abc123

NON atteso (errore di configurazione):

http://n8n.yourdomain.com:5678/webhook/abc123  ❌

Test 5: Task Runner attivi

docker logs n8n | grep -i runner

Output atteso:

Registered runner "JS Task Runner"

Test 6: variabili d'ambiente applicate

docker exec n8n env | grep N8N_PAYLOAD_SIZE_MAX

Atteso: N8N_PAYLOAD_SIZE_MAX=268435456


Risoluzione dei problemi comuni

Problema: HTTPS non funziona

Sintomi: Il browser mostra l'avviso “Non sicuro”, messaggi di errore del certificato, impossibile accedere tramite HTTPS

Diagnosi:

# Check Traefik logs for errors
docker logs traefik | grep -i error

# Check certificate file exists
ls -la traefik/letsencrypt/acme.json

# Verify DNS resolution
nslookup n8n.yourdomain.com

Soluzioni:

  1. DNS non punta al server: Aggiorna il record A del DNS per puntare all'IP pubblico del server, attendi la propagazione DNS (fino a 24 ore, di solito molto più veloce), testa da una rete diversa: dig n8n.yourdomain.com +short
  2. Porta 80 bloccata: Let's Encrypt necessita della porta 80 per la sfida HTTP. Controlla il firewall: sudo ufw status. Consenti se bloccata: sudo ufw allow 80/tcp && sudo ufw allow 443/tcp
  3. Email non valida nella configurazione Traefik: Modifica traefik/traefik.yml, aggiorna certificatesResolvers.letsencrypt.acme.email con un indirizzo valido, riavvia Traefik: docker compose restart

Problema: i webhook restituiscono 404

Sintomi: I servizi esterni riportano fallimenti dei webhook, gli URL dei webhook sembrano corretti ma non funzionano, la modalità test funziona ma la modalità produzione fallisce

Diagnosi:

# Test webhook directly
curl -v https://n8n.yourdomain.com/webhook/test

# Check Traefik routing logs
docker logs traefik | grep webhook

# Verify n8n sees requests
docker logs n8n | grep webhook

Soluzioni:

  1. Middleware WebSocket mancante: Verifica queste label nel docker-compose.yml:
- "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Upgrade=websocket"
- "traefik.http.middlewares.n8n-websocket.headers.customrequestheaders.Connection=Upgrade"
- "traefik.http.routers.n8n.middlewares=n8n-websocket"
  1. WEBHOOK_URL non impostato correttamente: Controlla la variabile d'ambiente: docker exec n8n env | grep WEBHOOK_URL. Deve corrispondere esattamente al tuo dominio: WEBHOOK_URL=https://n8n.yourdomain.com
  2. Configurazione di rete errata: Verifica che n8n sia sulla rete traefik-net: docker inspect n8n | grep -A 5 Networks. Dovrebbe mostrare “traefik-net” nell'output

Problema: “Execution Data Too Large” appare ancora

Sintomi: L'errore si verifica ancora dopo aver impostato N8N_PAYLOAD_SIZE_MAX, i workflow di grandi dimensioni falliscono su “Execute Node”

Diagnosi:

# Verify variable is set
docker exec n8n env | grep PAYLOAD

# Should show N8N_PAYLOAD_SIZE_MAX=268435456

Soluzioni:

  1. Variabile non applicata (container non riavviato): Riavvia per applicare le modifiche: docker compose restart n8n. Verifica dopo il riavvio: docker exec n8n env | grep PAYLOAD
  2. Serve un limite più alto per il tuo workflow: Per server con 16GB+ di RAM, aumenta a 512MB: N8N_PAYLOAD_SIZE_MAX=536870912
  3. Dimensione richiesta Traefik troppo piccola: Aumenta anche il limite di Traefik in modo corrispondente: "traefik.http.middlewares.n8n-buffering.buffering.maxRequestBodyBytes=209715200"

Problema: utilizzo elevato della memoria

Sintomi: Il container usa >1.5GB di RAM a riposo, l'utilizzo di memoria cresce nel tempo, errori di memoria esaurita

Diagnosi:

# Monitor memory
docker stats n8n

# Check binary data mode
docker exec n8n env | grep BINARY_DATA_MODE

Soluzioni:

  1. Non si usa la modalità filesystem: Aggiungi all'ambiente: N8N_DEFAULT_BINARY_DATA_MODE=filesystem e N8N_BINARY_DATA_TTL=1440. Impatto: Risparmio di ~100MB di RAM secondo i nostri test
  2. Vecchie esecuzioni che si accumulano: Riduci il periodo di conservazione: EXECUTIONS_DATA_MAX_AGE=168 (7 giorni anziché 14) e EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
  3. Limite del container troppo basso: Aumenta se il server ha capacità. Cambia il limite di memoria da 2G a 4G nella sezione delle risorse di deploy

Conclusione

Cosa abbiamo risolto

Questa guida completa affronta i due problemi più comuni di n8n self-hosted:

  1. Errore dati di esecuzione troppo grandi – Risolto con N8N_PAYLOAD_SIZE_MAX e modalità binaria su filesystem
  2. Problemi con gli URL dei webhook – Risolto con WEBHOOK_URL e corretta configurazione del reverse proxy

Oltre a queste aggiunte fondamentali:

  1. Configurazione completa di Traefik – Configurazione production-ready con supporto WebSocket
  2. Configurazione dei Task Runner – Requisito 2025 per la compatibilità futura
  3. Best practice per la produzione – Limiti di risorse, healthcheck, header di sicurezza, monitoraggio
  4. Configurazioni validate – Tutti i file docker-compose testati con n8n 1.115.2 a ottobre 2025

Punti chiave

Per soluzioni rapide:

  • Imposta N8N_PAYLOAD_SIZE_MAX=268435456 per problemi con i dati di esecuzione (256MB per 8GB+ di RAM)
  • Imposta WEBHOOK_URL=https://your-domain.com per problemi con i webhook
  • Imposta N8N_RUNNERS_ENABLED=true per eliminare gli avvisi di deprecazione
  • Usa N8N_DEFAULT_BINARY_DATA_MODE=filesystem per risparmiare ~100MB di RAM

Per il deployment in produzione:

  • Usa il nostro docker-compose.yml completo con configurazione Traefik
  • Non saltare il middleware WebSocket – assolutamente necessario per i webhook
  • Includi PostgreSQL per migliori prestazioni sotto carico
  • Imposta limiti di risorse appropriati in base alla capacità del tuo server
  • Implementa gli healthcheck per il recupero automatico

Per gli utenti Traefik (FONDAMENTALE):

  • Il middleware WebSocket è non negoziabile per la funzionalità dei webhook
  • Imposta il limite di dimensione del corpo della richiesta in modo che corrisponda o superi la dimensione del payload
  • Configura gli header di sicurezza (X-Robots-Tag, X-Forwarded-Proto)
  • Assicurati che il DNS punti al tuo server prima di avviare Traefik (requisito di Let’s Encrypt)

Novità rispetto ai post di giugno 2025

FunzionalitàPost di giugno 2025Questa guida
Correzione dati di esecuzione✅ Dettagliata✅ Inclusa + misurazioni delle risorse
Correzione webhook✅ Dettagliata✅ Inclusa + integrazione Traefik
Configurazione Traefik❌ Non coperta✅ Configurazione completa
Supporto WebSocket❌ Non coperto✅ Evidenziato
Task runner❌ Non coperti✅ Requisito 2025
Docker-compose combinato❌ Separati✅ Production-ready
Misurazioni delle risorse❌ Teoriche✅ Dati di test reali
Variabili d'ambiente✅ Coperte✅ Riferimento completo

Test e validazione

Il nostro ambiente di test (ottobre 2025):

  • ✅ n8n versione 1.115.2
  • ✅ Container Docker in esecuzione da 2+ ore
  • ✅ Tutte le variabili d'ambiente verificate nei container in esecuzione
  • ✅ Utilizzo delle risorse misurato con docker stats
  • ✅ Processo task runner confermato nella lista dei processi
  • ✅ Endpoint HTTP testati e accessibili
  • ✅ Configurazioni validate come funzionanti

Prossimi passi

  1. Scegli il tuo scenario:
    • Sviluppo: configurazione minima
    • Dietro reverse proxy: correzione webhook + task runner
    • Produzione: configurazione completa con Traefik (raccomandata)
  2. Deploy:
    • Copia il docker-compose.yml appropriato
    • Crea il file .env con il tuo dominio e password sicure
    • Avvia prima Traefik, poi n8n
    • Esegui i test post-deployment
  3. Valida:
    • Verifica che HTTPS funzioni con un certificato valido
    • Controlla che gli URL dei webhook mostrino il formato corretto
    • Testa con un dataset di grandi dimensioni (se necessario)
    • Conferma che i task runner siano registrati
  4. Monitora:
    • Osserva l'utilizzo delle risorse con docker stats
    • Configura avvisi di healthcheck (monitoraggio esterno)
    • Implementa la rotazione dei log per prevenire il riempimento del disco
    • Pianifica backup regolari dei volumi dati

Risorse correlate

Da giugno 2025:

Documentazione ufficiale di n8n:

Domande o problemi?

Se incontri problemi non coperti da questa guida:

  1. Consulta i nostri post dettagliati di risoluzione problemi di giugno 2025 per ulteriori indicazioni
  2. Consulta la documentazione ufficiale di n8n per le ultime funzionalità
  3. Cerca nei forum della community n8n problemi simili
  4. Controlla la sezione Risoluzione dei problemi qui sopra per i problemi comuni
  5. Contatta tva per supporto professionale all'implementazione

Test riproducibili

Tutte le configurazioni in questa guida possono essere riprodotte nel tuo ambiente – i file Docker Compose sono production-ready, le variabili d'ambiente sono documentate e verificate, i comandi di test sono forniti per la validazione e gli output attesi sono chiaramente specificati. Puoi verificare ogni affermazione in questa guida implementando tu stesso le configurazioni ed eseguendo i test forniti.

Hai bisogno di aiuto con l'implementazione?

Se desideri che tva gestisca il tuo deployment di n8n o hai bisogno di assistenza con la configurazione in produzione, contattaci. Implementiamo queste configurazioni per le organizzazioni che cercano un'infrastruttura n8n affidabile e production-ready.


Pubblicato: 15 ottobre 2025
Testato con: n8n v1.115.2, Docker Compose v3.8, Traefik v2.10
Requisiti del server: 4GB+ di RAM, 2+ core CPU raccomandati per la produzione
Basato su: Documentazione ufficiale di n8n, test Docker validati e best practice della community