Guida completa al self-hosting di n8n 2025: risolvere gli errori di dimensione dei dati di esecuzione e i problemi dei webhook con Traefik
Ultimo aggiornamento: 15 ottobre 2025
Il self-hosting di n8n offre esecuzioni illimitate dei flussi di lavoro, controllo completo dei dati e risparmi significativi rispetto ai piani cloud. Ma in realtà, le istanze gestite sulla propria infrastruttura affrontano problemi di cui gli utenti di n8n Cloud solitamente non devono occuparsi – 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 le installazioni in produzione di n8n con il reverse proxy Traefik che affrontasse insieme entrambi i problemi comuni.
Questa guida combina entrambe le soluzioni originali, fornisce la configurazione completa di Traefik con supporto WebSocket, include i nuovi requisiti dei task runner introdotti nel 2025 e offre file docker-compose pronti per la produzione che puoi implementare immediatamente.
Indice
- Diagnosi rapida: quale problema hai?
- Comprendere i due problemi principali
- Soluzione #1: errore per dati di esecuzione di dimensioni eccessive
- Soluzione #2: problemi con gli URL dei webhook
- Configurazione completa per la produzione con Traefik
- Requisito del 2025: task runner
- Guida alle 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:
- Fai clic su “Execute Node” durante lo sviluppo del flusso di lavoro
- Testi flussi di lavoro con dataset di grandi dimensioni o molti elementi
- Usi la modalità di esecuzione parziale (test dei singoli nodi)
- Elabori trasformazioni complesse con più rami
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 pronta per la produzione
Ti serve:
- Entrambe le soluzioni applicate correttamente
- Reverse proxy Traefik con HTTPS automatico
- Buone pratiche e sicurezza per la produzione
- Limiti di risorse e monitoraggio appropriato
Vai a: Configurazione completa per la produzione
Comprendere i due problemi principali
Perché gli utenti di n8n Cloud affrontano raramente questi problemi
Su n8n Cloud, n8n gestisce per te la configurazione del server, ad esempio gli URL dei webhook, l’archiviazione dei dati binari e gli aggiornamenti. Con il self-hosting, sei responsabile di queste configurazioni.
Le cause di fondo
Problema #1: limite di dimensione dei dati di esecuzione
Il limite predefinito di 16 MiB per il corpo delle richieste inviate al backend, inclusi i dati di esecuzione parziale genera errori quando si lavora con dataset di grandi dimensioni, molti rami dei flussi di lavoro o trasformazioni complesse. Il problema è che lo sviluppo dei flussi di lavoro 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 senza segnalazioni. La soluzione: la variabile d'ambiente WEBHOOK_URL.
Soluzione #1: errore per dati di esecuzione di dimensioni eccessive
Il problema nel dettaglio
Quando esegui solo una parte di un flusso di lavoro (facendo clic su “Execute Node” nell'editor), n8n deve caricare i dati di esecuzione precedenti per fornire contesto a quel nodo. Per impostazione predefinita, n8n limita questa richiesta a 16 MiB (N8N_PAYLOAD_SIZE_MAX=16; il valore è espresso in MiB) per prevenire problemi di memoria su server più piccoli. Se la richiesta è più grande, n8n (o un reverse proxy con un limite inferiore per il corpo della richiesta) risponde con HTTP 413 e l’editor mostra questo errore.
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 API in formato JSON di grandi dimensioni, si trasformano dataset di grandi dimensioni con nodi Code o si utilizzano flussi di lavoro con molti rami paralleli.
La soluzione: N8N_PAYLOAD_SIZE_MAX
La soluzione è semplice, ma occorre conoscere le risorse disponibili sul tuo server.
Impostazioni raccomandate in base alla RAM del server
| RAM del server | N8N_PAYLOAD_SIZE_MAX | Valore da impostare (MiB) | Percentuale di RAM |
|---|---|---|---|
| 2GB o meno | 64MB | 64 | ~3% |
| 4GB | 128MB | 128 | ~3% |
| 8GB | 256MB | 256 | ~3% |
| 16GB+ | 512MB | 512 | ~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; value in MiB)
- N8N_PAYLOAD_SIZE_MAX=256
# 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à dei 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 ai carichi di lavoro in produzione, limita il numero di file che puoi elaborare.
Dai nostri test: la modalità predefinita usava ~315 MB di RAM a riposo contro 211 MB con la modalità filesystem, ovvero ~100 MB di memoria in meno a riposo.
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, adatta alla produzione e raccomandata da n8n. Nota che N8N_BINARY_DATA_TTL non ha effetto da n8n 1.9.0: n8n elimina i dati binari quando rimuove le esecuzioni obsolete, quindi sono le impostazioni di pulizia delle esecuzioni a controllare l’uso del disco.
Importante: Se usi la modalità coda (esecuzione distribuita basata su Redis), tieni presente che n8n non supporta la modalità filesystem in questo caso. A ottobre 2026, la documentazione di n8n raccomanda la modalità database per la modalità coda.
Impatto concreto
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à su filesystem | 211 MB | -104 MB |
Risultato chiave: Nelle nostre misurazioni a riposo, la configurazione con il limite del payload corretto e la modalità binaria filesystem usava meno memoria rispetto a quella predefinita. Non abbiamo misurato la memoria sotto carico con payload di grandi dimensioni, dove l’uso dipende dai flussi di lavoro.
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 completamente.
Cosa vedrai (gli URL sbagliati)
http://n8n.yourdomain.com:5678/webhook/abc123
Problemi con questo URL:
- Numero di porta incluso (
:5678) – i servizi esterni in genere non riescono a raggiungere porte non standard - Protocollo errato (http anziché 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 senza segnalazioni. 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:
«La variabile d’ambiente WEBHOOK_URL consente di impostare manualmente l’URL del webhook, affinché n8n possa visualizzarlo nell’interfaccia dell’editor e registrare gli URL corretti dei webhook presso i servizi esterni. Quando n8n viene eseguito dietro un reverse proxy, è importante impostare questa variabile.»
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
- Non è una variabile documentata di n8n: non compare nel riferimento delle variabili d’ambiente di n8n, quindi impostarla non ha alcun effetto documentato
- La fiducia negli header del proxy (per gli indirizzi IP reali dei client) è controllata da
N8N_PROXY_HOPS - Puoi ometterla dagli esempi di questa guida
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 alle installazioni Docker – HTTPS automatico tramite Let's Encrypt senza gestione manuale dei certificati, rilevamento automatico dei servizi, che individua i container tramite le etichette Docker, supporto WebSocket nativo per la connessione in tempo reale dell’editor di n8n, configurazione semplice con le sole etichette Docker anziché file di configurazione complessi e una dashboard integrata per monitorare instradamento e certificati in tempo reale.
Panoramica dell'architettura
Internet
↓
[Traefik Reverse Proxy]
↓ HTTPS (Let's Encrypt)
↓ WebSocket Support
[Container n8n]
↓ Rete interna
[Database PostgreSQL]
Supporto WebSocket
Traefik inoltra nativamente le connessioni WebSocket, inclusa la connessione in tempo reale usata dall’editor di n8n, quindi non serve middleware aggiuntivo. I webhook sono normali richieste HTTPS e non dipendono dai WebSocket. L’esempio di produzione qui sotto include etichette opzionali per gli header WebSocket; puoi ometterle.
Docker Compose completo per la produzione
Questa configurazione combina entrambe le correzioni, include Traefik con supporto WebSocket appropriato e segue le buone pratiche 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 in bytes (256MB, matches N8N_PAYLOAD_SIZE_MAX)
- "traefik.http.middlewares.n8n-buffering.buffering.maxRequestBodyBytes=268435456"
# Middleware: WebSocket headers (optional; Traefik proxies WebSockets natively)
- "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=256 # 256 MiB
# 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: [email protected] # 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 delle variabili d’ambiente
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. Funziona solo se imposti anche api.insecure: true in traefik.yml (solo per i test); altrimenti, configura un router per la dashboard (api@internal) su un dominio dedicato.
Dovresti vedere:
- ✅ Router n8n attivo con stato verde
- ✅ Certificato ottenuto da Let’s Encrypt
- ✅ Servizio con stato di integrità positivo
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 flusso di lavoro
- 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 del 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 isolati, una maggiore stabilità, perché gli errori nel codice non arrestano il processo principale e compatibilità futura poiché saranno richiesti nelle prossime versioni di n8n.
Perché è importante adesso
Dalla documentazione ufficiale di n8n:
«L’esecuzione di n8n senza task runner è deprecata. I task runner saranno abilitati per impostazione predefinita in una versione futura. Si consiglia agli utenti di impostare subito N8N_RUNNERS_ENABLED=true per evitare possibili problemi in futuro.»
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 delle installazioni gestite sulla propria infrastruttura, con un impatto minimo sulle prestazioni. A ottobre 2026, la documentazione di n8n descrive la modalità interna come insicura per progettazione e la depreca a partire da n8n 3.0.
Modalità esterna (per configurazioni distribuite)
environment:
- N8N_RUNNERS_ENABLED=true
- N8N_RUNNERS_MODE=external
- N8N_RUNNERS_AUTH_TOKEN=your_secure_token
Container separati per i task runner forniscono un migliore isolamento delle risorse per flussi di lavoro ad alto volume, consentono la scalabilità orizzontale su più server, e vengono eseguiti come container sidecar dall’immagine n8nio/runners, la cui versione deve corrispondere a quella dell’immagine n8n. Basta una configurazione Docker Compose; Docker Swarm o Kubernetes non sono necessari.
Verifica dei task runner
Controlla l’elenco 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 |
Impatto minimo sulle risorse. I vantaggi – sicurezza, stabilità, preparazione al futuro – superano ampiamente il piccolo costo in termini di risorse.
Guida alle variabili d’ambiente
Elenco completo delle variabili
| Variabile | Tipo | Predefinito | Scopo | Priorità |
|---|---|---|---|---|
| Variabili critiche | ||||
WEBHOOK_URL | Stringa | – | URL webhook pubblico | OBBLIGATORIO con reverse proxy |
N8N_PAYLOAD_SIZE_MAX | Numero | 16 (MiB) | Dimensione massima del corpo della richiesta in MiB, inclusi i dati di esecuzione parziale | OBBLIGATORIO per dati di grandi dimensioni |
N8N_RUNNERS_ENABLED | Booleano | false | Abilita task runner | Raccomandato su 1.x (non necessario da n8n 2.0) |
N8N_TRUST_PROXY_HEADER | – | – | Non presente tra le variabili documentate di n8n | Non necessario; usa N8N_PROXY_HOPS |
| Configurazione webhook | ||||
N8N_EDITOR_BASE_URL | Stringa | – | URL dell'interfaccia editor | Raccomandato |
N8N_PROTOCOL | Stringa | http | Protocollo (http/https) | Produzione |
N8N_HOST | Stringa | localhost | Hostname pubblico | Produzione |
N8N_PORT | Numero | 5678 | Porta interna | Opzionale |
N8N_PROXY_HOPS | Numero | 0 | Numero di reverse proxy | Impostare su 1 con proxy |
| Prestazioni | ||||
N8N_DEFAULT_BINARY_DATA_MODE | Stringa | default | Modalità archiviazione binaria | Raccomandato |
N8N_BINARY_DATA_TTL | – | – | Nessun effetto da n8n 1.9.0 (i dati binari vengono rimossi insieme alle esecuzioni) | Si può rimuovere |
| Task runner | ||||
N8N_RUNNERS_MODE | Stringa | internal | Modalità task runner | Se i runner sono abilitati |
N8N_RUNNERS_MAX_CONCURRENCY | Numero | 10 | Numero massimo di attività simultanee per runner | Opzionale |
Configurazioni predefinite 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, flussi di lavoro 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=256 # 256 MiB
- 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: Distribuzione in produzione con tutte le funzionalità, flussi di lavoro 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. Gli esempi usano il tag immagine latest; fissa n8nio/n8n:1.115.2 per riprodurre la versione testata.
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à su filesystem |
| Correzione webhook | 215 MB | 0.14% | 3 | Solo configurazione webhook |
| Produzione | 289 MB | 0.29% | 4 | Tutte le correzioni + task runner |
Risultato chiave: A riposo, la configurazione di produzione con tutte le correzioni usava meno memoria rispetto a quella predefinita nei nostri test. Sono misurazioni a riposo, non risultati sotto carico con payload di grandi dimensioni.
Test della configurazione
Lista di controllo prima della distribuzione
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
Passaggi per la distribuzione
# 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 dopo la distribuzione
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 flusso di lavoro
- 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=256
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 verifica 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:
- 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 flussi di lavoro di grandi dimensioni falliscono su “Execute Node”
Diagnosi:
# Verify variable is set
docker exec n8n env | grep PAYLOAD
# Should show N8N_PAYLOAD_SIZE_MAX=256
Soluzioni:
- Variabile non applicata (container non ricreato): Ricrea il container per applicare le modifiche:
docker compose up -d n8n(docker compose restartnon applica i valori d’ambiente modificati). Verifica dopo il riavvio:docker exec n8n env | grep PAYLOAD - Serve un limite più alto per il tuo flusso di lavoro: Per server con 16GB+ di RAM, aumenta a 512MB:
N8N_PAYLOAD_SIZE_MAX=512 - Dimensione richiesta Traefik troppo piccola: Aumenta anche il limite di Traefik (in byte) in modo corrispondente:
"traefik.http.middlewares.n8n-buffering.buffering.maxRequestBodyBytes=536870912"
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:
- Modalità filesystem non in uso: Aggiungi all’ambiente:
N8N_DEFAULT_BINARY_DATA_MODE=filesystem. Impatto: ~100 MB di memoria in meno a riposo nei 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 gestito sulla propria infrastruttura:
- ✅ Errore dati di esecuzione di dimensioni eccessive – 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 pronta per la produzione con supporto WebSocket
- ✅ Configurazione dei task runner – Requisito 2025 per la compatibilità futura
- ✅ Buone pratiche 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=256per 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=filesystem(circa 100 MB di memoria in meno a riposo nei nostri test)
Per la distribuzione in produzione:
- Usa il nostro docker-compose.yml completo con configurazione Traefik
- Non serve middleware WebSocket – Traefik inoltra nativamente i WebSocket e i webhook sono semplici richieste HTTPS
- Includi PostgreSQL per migliori prestazioni sotto carico
- Imposta limiti di risorse appropriati in base alla capacità del tuo server
- Implementa controlli di integrità affinché il monitoraggio e i servizi dipendenti possano rilevare i guasti (Docker da solo contrassegna un container come non integro, ma non lo riavvia)
Per gli utenti Traefik (FONDAMENTALE):
- Traefik gestisce i WebSocket senza middleware aggiuntivo; i webhook richiedono un router corretto e
WEBHOOK_URL - 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 | ✅ Pronto per la produzione |
| Misurazioni delle risorse | ❌ Teoriche | ✅ Dati di test reali |
| Variabili d'ambiente | ✅ Coperte | ✅ Guida completa |
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 del task runner confermato nell’elenco 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)
- Distribuisci:
- 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 dopo la distribuzione
- 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 degli URL dei webhook
- Guida alle variabili d’ambiente
- Task runner
- Gestione dei dati binari
- Scalabilità dei dati di esecuzione
Domande o problemi?
Se incontri problemi non coperti da questa guida:
- Consulta i nostri articoli dettagliati sulla risoluzione dei problemi di giugno 2025 per ulteriori indicazioni
- Consulta la documentazione ufficiale di n8n per le ultime funzionalità
- Cerca nei forum della community di n8n problemi simili
- Controlla la sezione Risoluzione dei problemi qui sopra per i problemi comuni
- Contatta tva per assistenza professionale all'implementazione
Test riproducibili
Tutte le configurazioni in questa guida possono essere riprodotte nel tuo ambiente – i file Docker Compose sono pronti per la produzione, 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 la tua installazione 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 pronta per la produzione.
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 buone pratiche della community
Per approfondire
Risolvere i problemi dei webhook n8n: guida completa per istanze sulla propria infrastruttura
Risolvere l’errore n8n "Existing execution data is too large": guida completa per istanze sulla propria infrastruttura
n8n 2.x sulla propria infrastruttura: diagnosticare i limiti dei dati di esecuzione e aumentare il payload in sicurezza