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
- Diagnosi rapida: quale problema hai?
- Comprendere i due problemi principali
- Soluzione #1: errore di dati di esecuzione troppo grandi
- Soluzione #2: problemi con gli URL dei webhook
- Configurazione completa per la produzione con Traefik
- Requisito 2025: Task Runner
- Riferimento variabili d'ambiente
- Esempi di Docker Compose
- Test della configurazione
- 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 server | N8N_PAYLOAD_SIZE_MAX | Valore in byte | Percentuale di RAM |
|---|---|---|---|
| 2GB o meno | 64MB | 67108864 | ~3% |
| 4GB | 128MB | 134217728 | ~3% |
| 8GB | 256MB | 268435456 | ~3% |
| 16GB+ | 512MB | 536870912 | ~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:
| Configurazione | Utilizzo memoria | Differenza |
|---|---|---|
| Predefinita (nessuna correzione) | 315 MB | Base di riferimento |
| Con correzione payload + modalità filesystem | 211 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:
- Numero di porta incluso (
:5678) – i servizi esterni tipicamente non riescono a raggiungere porte non standard - Protocollo errato (http vs https) – molti servizi richiedono HTTPS
- 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_URLnella 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
httpsper la produzione (con SSL/TLS) - Impostare su
httpsolo 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.comnonhttps://n8n.yourdomain.com:443
N8N_TRUST_PROXY_HEADER
- Deve essere
truequando 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
1quando si è dietro un reverse proxy - Impostare su
2se 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
- Accedi a n8n
- Crea un nuovo workflow
- Aggiungi un nodo Webhook
- 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):
| Configurazione | Memoria | CPU | Processi |
|---|---|---|---|
| Senza task runner | 214 MB | 0.14% | 3 |
| Con task runner | 289 MB | 0.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
| Variabile | Tipo | Predefinito | Scopo | Priorità |
|---|---|---|---|---|
| Variabili critiche | ||||
WEBHOOK_URL | String | – | URL webhook pubblico | OBBLIGATORIO con reverse proxy |
N8N_PAYLOAD_SIZE_MAX | Number | 16777216(16MB) | Dimensione max dati di esecuzione | OBBLIGATORIO per dati di grandi dimensioni |
N8N_RUNNERS_ENABLED | Boolean | false | Abilita task runner | OBBLIGATORIO per il 2025 |
N8N_TRUST_PROXY_HEADER | Boolean | false | Considera attendibili gli header del reverse proxy | OBBLIGATORIO con proxy |
| Configurazione webhook | ||||
N8N_EDITOR_BASE_URL | String | – | URL dell'interfaccia editor | Raccomandato |
N8N_PROTOCOL | String | http | Protocollo (http/https) | Produzione |
N8N_HOST | String | localhost | Hostname pubblico | Produzione |
N8N_PORT | Number | 5678 | Porta interna | Opzionale |
N8N_PROXY_HOPS | Number | 0 | Numero di reverse proxy | Impostare su 1 con proxy |
| Prestazioni | ||||
N8N_DEFAULT_BINARY_DATA_MODE | String | default | Modalità archiviazione binaria | Raccomandato |
N8N_BINARY_DATA_TTL | Number | 60 | Pulizia dati binari (minuti) | Raccomandato |
| Task Runner | ||||
N8N_RUNNERS_MODE | String | internal | Modalità task runner | Se runner abilitati |
N8N_RUNNERS_MAX_CONCURRENCY | Number | 5 | Max task runner concorrenti | Opzionale |
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)
| Scenario | Memoria | CPU | Processi | Descrizione |
|---|---|---|---|---|
| Predefinito | 315 MB | 0.00% | 3 | Nessuna correzione, base di riferimento |
| Correzione payload | 211 MB | 0.00% | 3 | Payload + modalità filesystem |
| Correzione webhook | 215 MB | 0.14% | 3 | Solo configurazione webhook |
| Produzione | 289 MB | 0.29% | 4 | Tutte 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
- Accedi all'interfaccia web di n8n
- Crea un nuovo workflow
- Aggiungi un nodo Webhook
- 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:
- 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 - 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 - Email non valida nella configurazione Traefik: Modifica
traefik/traefik.yml, aggiornacertificatesResolvers.letsencrypt.acme.emailcon 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:
- 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"
- 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 - 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:
- 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 - Serve un limite più alto per il tuo workflow: Per server con 16GB+ di RAM, aumenta a 512MB:
N8N_PAYLOAD_SIZE_MAX=536870912 - 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:
- Non si usa la modalità filesystem: Aggiungi all'ambiente:
N8N_DEFAULT_BINARY_DATA_MODE=filesystemeN8N_BINARY_DATA_TTL=1440. Impatto: Risparmio di ~100MB di RAM secondo i nostri test - Vecchie esecuzioni che si accumulano: Riduci il periodo di conservazione:
EXECUTIONS_DATA_MAX_AGE=168(7 giorni anziché 14) eEXECUTIONS_DATA_PRUNE_MAX_COUNT=1000 - 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:
- ✅ Errore dati di esecuzione troppo grandi – Risolto con
N8N_PAYLOAD_SIZE_MAXe modalità binaria su filesystem - ✅ Problemi con gli URL dei webhook – Risolto con
WEBHOOK_URLe corretta configurazione del reverse proxy
Oltre a queste aggiunte fondamentali:
- ✅ Configurazione completa di Traefik – Configurazione production-ready con supporto WebSocket
- ✅ Configurazione dei Task Runner – Requisito 2025 per la compatibilità futura
- ✅ Best practice per la produzione – Limiti di risorse, healthcheck, header di sicurezza, monitoraggio
- ✅ 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=268435456per problemi con i dati di esecuzione (256MB per 8GB+ di RAM) - Imposta
WEBHOOK_URL=https://your-domain.comper problemi con i webhook - Imposta
N8N_RUNNERS_ENABLED=trueper eliminare gli avvisi di deprecazione - Usa
N8N_DEFAULT_BINARY_DATA_MODE=filesystemper 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 2025 | Questa 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
- Scegli il tuo scenario:
- Sviluppo: configurazione minima
- Dietro reverse proxy: correzione webhook + task runner
- Produzione: configurazione completa con Traefik (raccomandata)
- 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
- 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
- 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
- Osserva l'utilizzo delle risorse con
Risorse correlate
Da giugno 2025:
- Risolvere l'errore n8n “Existing execution data is too large” – Guida approfondita alla risoluzione dei problemi
- Risolvere i problemi dei webhook n8n – Guida completa al debug dei webhook
Documentazione ufficiale di n8n:
- Configurazione URL webhook
- Riferimento variabili d'ambiente
- Task Runner
- Gestione dati binari
- Scalabilità dati di esecuzione
Domande o problemi?
Se incontri problemi non coperti da questa guida:
- Consulta i nostri post dettagliati di risoluzione problemi di giugno 2025 per ulteriori indicazioni
- Consulta la documentazione ufficiale di n8n per le ultime funzionalità
- Cerca nei forum della community n8n problemi simili
- Controlla la sezione Risoluzione dei problemi qui sopra per i problemi comuni
- 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