Risolvere i problemi dei webhook n8n: guida completa per istanze sulla propria infrastruttura
Gestire n8n sulla propria infrastruttura offre grandi possibilità e risparmi, ma le integrazioni webhook possono talvolta fallire in modi che non si verificano nelle soluzioni ospitate nel cloud. Se vedi errori «Execution cancelled» o webhook che semplicemente non si attivano, non sei il solo. Vedremo come diagnosticare e risolvere i problemi più comuni dei webhook nelle installazioni n8n gestite sulla propria infrastruttura.
Il problema: quando i webhook smettono di rispondere
Hai configurato correttamente l’istanza n8n seguendo il nostro tutorial completo, tutto sembra perfetto, ma all’improvviso i bot Telegram smettono di rispondere, i webhook delle API scadono per timeout e le esecuzioni vengono annullate con messaggi di errore criptici. La causa tipica è una configurazione mancante ma essenziale, che n8n nel cloud gestisce automaticamente.
Che cosa risolverai
Al termine di questa guida avrai:
- ✅ URL dei webhook configurati correttamente per tutti i servizi esterni
- ✅ Integrazioni con i bot Telegram funzionanti con gestione affidabile dei messaggi
- ✅ Webhook API funzionanti dai servizi di terze parti
- ✅ Meno errori «execution cancelled» causati da configurazioni errate dei webhook
- ✅ Una configurazione dei webhook pronta per la produzione che rimane valida dopo i riavvii del server
- ✅ Competenze avanzate di diagnosi per futuri problemi dei webhook
Prerequisiti
- Installazione n8n funzionante, preferibilmente basata sulla nostra guida alla configurazione su Hetzner
- n8n in esecuzione dietro un reverse proxy, come Traefik o Nginx
- HTTPS abilitato con certificati SSL validi
- Accesso SSH al server
- Conoscenze di base di Docker e della riga di comando
Comprendere la causa di fondo
Perché i webhook di n8n sulla propria infrastruttura non funzionano
Quando esegui n8n dietro un reverse proxy, come è opportuno fare per sicurezza e SSL, n8n deve conoscere il proprio URL pubblico per generare endpoint webhook corretti. Senza questa configurazione, n8n crea URL come:
❌ Wrong: https://yourdomain.com:5678/webhook/abc123
❌ Wrong: http://localhost:5678/webhook/abc123
Anziché nel formato corretto:
✅ Correct: https://yourdomain.com/webhook/abc123
La variabile d’ambiente mancante
La soluzione è la variabile d’ambiente WEBHOOK_URL, che indica a n8n esattamente dove è accessibile pubblicamente. Nelle soluzioni cloud viene impostata automaticamente, mentre nelle installazioni sulla propria infrastruttura va configurata manualmente. A ottobre 2026, n8n 2.35.0 e versioni successive la documentano come N8N_WEBHOOK_URL; WEBHOOK_URL funziona ancora come alias deprecato che genera un avviso nei log all’avvio.
Passo 1: diagnosticare la configurazione attuale
Controlla la configurazione del container
Per prima cosa, controlla la configurazione attuale di n8n:
# Navigate to your n8n directory
cd /opt/n8n
# Check current environment variables
cat docker-compose.yml | grep -A 20 "environment:"
Verifica la generazione degli URL dei webhook
Crea un semplice flusso di lavoro con un webhook per vedere quali URL genera n8n:
- Apri l’interfaccia di n8n
- Crea un nuovo flusso di lavoro
- Aggiungi un nodo di attivazione «Webhook»
- Prendi nota dell’URL generato
Se l’URL include :5678 o usa localhost, hai il problema che stiamo risolvendo.
Controlla i log del container
Cerca errori relativi ai webhook:
# Check n8n logs for webhook issues
docker logs n8n-n8n-1 | grep -i webhook
# Look for execution errors
docker logs n8n-n8n-1 | grep -i "cancelled\|timeout\|failed"
Passo 2: risolvere il problema principale — aggiungere WEBHOOK_URL
Per una singola istanza n8n
Se hai seguito la nostra guida originale alla configurazione, modifica il file Docker Compose:
cd /opt/n8n
# Create backup first
cp docker-compose.yml docker-compose.yml.backup
# Edit the configuration
nano docker-compose.yml
Aggiungi la variabile d’ambiente WEBHOOK_URL alla configurazione esistente. L’esempio imposta anche N8N_PROXY_HOPS=1, che la guida di n8n al reverse proxy raccomanda dietro un singolo proxy come Traefik:
version: '3'
services:
n8n:
image: n8nio/n8n:1.95.2
restart: always
environment:
- N8N_HOST=n8n.yourdomain.com
- NODE_ENV=production
- N8N_PROTOCOL=https
- N8N_PORT=5678
- N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com
- N8N_EMAIL_MODE=smtp
- N8N_SMTP_HOST=mailserver
- N8N_SMTP_PORT=25
- N8N_SMTP_SSL=false
- N8N_SMTP_USER=
- N8N_SMTP_PASS=
- [email protected]
- N8N_PROXY_HOPS=1
- N8N_RUNNERS_ENABLED=true
# 🔧 ADD THIS LINE - Critical for webhook functionality
- WEBHOOK_URL=https://n8n.yourdomain.com
volumes:
- ./data:/home/node/.n8n
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"
- "traefik.http.routers.n8n.entrypoints=https"
- "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n.loadbalancer.server.port=5678"
networks:
proxy:
external: true
Per più istanze n8n
Se esegui più istanze n8n, ad esempio per team diversi, ciascuna deve avere il proprio WEBHOOK_URL:
# First instance (/opt/n8n/docker-compose.yml)
environment:
- WEBHOOK_URL=https://n8n.yourdomain.com
# Second instance (/opt/n8n-team2/docker-compose.yml)
environment:
- WEBHOOK_URL=https://team2.yourdomain.com
Riavvia il container
Applica le modifiche:
# Stop the container
docker compose down
# Start with new configuration
docker compose up -d
# Verify it's running
docker ps | grep n8n
Passo 3: verificare la correzione
Controlla i log del container
Il log di avvio mostra l’URL dell’editor. Conferma che n8n conosce il proprio indirizzo pubblico, ma non che i webhook siano registrati: verifica quindi anche l’URL in un nodo Webhook (passaggio successivo):
docker logs n8n-n8n-1 --tail 10
Cerca questa riga:
Editor is now accessible via:
https://n8n.yourdomain.com # ✅ Should NOT include :5678
Verifica la generazione dei webhook
- Torna al flusso di lavoro del webhook di prova
- Elimina il vecchio nodo webhook
- Aggiungi un nuovo nodo webhook
- Verifica che l’URL generato sia corretto:
https://yourdomain.com/webhook/..., senza numero di porta
Verifica un webhook esterno
Crea un semplice flusso di prova con un nodo Webhook impostato su POST e con il percorso test, poi attivalo (pubblicalo) per registrarne l’URL di produzione e richiamalo:
# Test with curl
curl -X POST https://n8n.yourdomain.com/webhook/test \
-H "Content-Type: application/json" \
-d '{"test": "webhook working"}'
Passo 4: configurare l’integrazione con un bot Telegram
La particolarità di Telegram
Telegram richiede webhook HTTPS e impone requisiti rigorosi per gli URL. Ecco come configurare un bot Telegram funzionante:
Crea il flusso di lavoro del bot Telegram
- Crea un nuovo flusso di lavoro in n8n
- Aggiungi un nodo «Telegram Trigger»
- Configura il token del bot
- L’URL del webhook dovrebbe ora avere il formato corretto
Registra il webhook su Telegram
# Replace YOUR_BOT_TOKEN with your actual token
# Replace the webhook URL with your actual webhook URL from n8n
curl -F "url=https://n8n.yourdomain.com/webhook/abc123" \
https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook
Verifica il webhook Telegram
Controlla se Telegram riesce a raggiungere il webhook:
curl https://api.telegram.org/botYOUR_BOT_TOKEN/getWebhookInfo
Dovresti vedere:
{
"ok": true,
"result": {
"url": "https://n8n.yourdomain.com/webhook/abc123",
"has_custom_certificate": false,
"pending_update_count": 0
}
}
Passo 5: configurazione avanzata dei webhook
Abilita il supporto WebSocket in Traefik
Le normali richieste webhook usano HTTP e non richiedono il supporto WebSocket. La connessione push dell’editor di n8n usa WebSocket, supportato nativamente da Traefik, quindi le etichette standard sono normalmente sufficienti. Non aggiungere un middleware che forzi gli header Connection: Upgrade su ogni richiesta: a Traefik bastano queste etichette:
# Standard labels in your n8n docker-compose.yml (no extra middleware needed)
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"
- "traefik.http.routers.n8n.entrypoints=https"
- "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n.loadbalancer.server.port=5678"
Configura le impostazioni di payload e dati di esecuzione
Queste impostazioni non modificano i timeout: memorizzano i dati binari su disco, impostano la dimensione massima del payload e conservano i dati di esecuzione per il debug. N8N_PAYLOAD_SIZE_MAX accetta un numero in MiB (16 per impostazione predefinita), quindi scrivi 16 invece di 16MB. Per i timeout di esecuzione, consulta EXECUTIONS_TIMEOUT nella sezione sulla gestione delle code dei webhook più avanti:
environment:
# Add these for webhook reliability
- N8N_DEFAULT_BINARY_DATA_MODE=filesystem
- N8N_PAYLOAD_SIZE_MAX=16
- EXECUTIONS_DATA_SAVE_ON_ERROR=all
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
- EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
Risoluzione dei problemi comuni
Problema: gli URL contengono ancora numeri di porta
Sintomi:
- Gli URL dei webhook mostrano ancora
:5678 - I servizi esterni non riescono a raggiungere i webhook
Soluzione:
# Check if environment variable is properly set
docker exec n8n-n8n-1 env | grep WEBHOOK_URL
# If missing, recreate container:
docker compose down
docker compose up -d --force-recreate
Problema: «Bad webhook: HTTPS URL must be provided»
Sintomi:
- La configurazione del bot Telegram non riesce
- L’errore indica che è richiesto HTTPS
Causa: L’URL del webhook non usa HTTPS oppure ci sono problemi con il certificato SSL.
Soluzione:
# Test SSL certificate
curl -I https://n8n.yourdomain.com
# Check Traefik logs for SSL issues
docker logs traefik | grep -i certificate
# Verify domain DNS points to your server
nslookup n8n.yourdomain.com
Problema: i webhook funzionano in modalità di test ma non in produzione
Sintomi:
- Le esecuzioni dei webhook di prova funzionano correttamente
- I webhook di produzione scadono per timeout o non funzionano
Soluzione:
# Check for webhook URL conflicts
docker logs n8n-n8n-1 | grep "webhook.*test"
# Ensure production workflows use production URLs
# Deactivate test workflows before activating production ones
Problema: «Connection reset by peer» o 502 Bad Gateway
Sintomi:
- Errori intermittenti dei webhook
- Errori del gateway nei log
Soluzione:
# Check if container is running out of memory
docker stats n8n-n8n-1
# Increase container resources if needed:
# Add to docker-compose.yml under the n8n service:
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 1G
Considerazioni sulla sicurezza
Elenco degli IP autorizzati per i webhook
Per i webhook sensibili, valuta restrizioni sugli indirizzi IP:
# In your webhook node configuration
"ipWhitelist": ["192.168.1.0/24", "10.0.0.0/8"]
Autenticazione dei webhook
Usa sempre l’autenticazione dei webhook quando possibile:
# In your webhook configuration
"authenticationMethod": "headerAuth"
"authenticationData": {
"name": "X-API-Key",
"value": "your-secret-key"
}
Limiti di frequenza delle richieste
Proteggi i webhook dagli abusi. Un router accetta una sola etichetta middlewares e una seconda etichetta con la stessa chiave sostituisce la prima; se il router usa già altri middleware, elencali tutti in un’unica etichetta separati da virgole:
# Add to Traefik labels
- "traefik.http.middlewares.rate-limit.ratelimit.average=10"
- "traefik.http.middlewares.rate-limit.ratelimit.burst=20"
- "traefik.http.routers.n8n.middlewares=rate-limit"
Monitoraggio e manutenzione
Monitora lo stato dei webhook
Crea un flusso di monitoraggio:
- Aggiungi un nodo di attivazione «Cron», ogni 5 minuti
- Aggiungi un nodo «HTTP Request» per verificare il webhook
- Aggiungi una logica di notifica in caso di errore
Registra l’attività dei webhook
Abilita la registrazione dettagliata dei webhook:
environment:
- N8N_LOG_LEVEL=debug
- N8N_LOG_OUTPUT=console,file
- N8N_LOG_FILE_COUNT_MAX=100
- N8N_LOG_FILE_SIZE_MAX=16
Esegui il backup delle configurazioni dei webhook
Lo script esporta con --all tutti i flussi e tutte le credenziali, ciascuno in un unico file. Le credenziali esportate restano crittografate: conserva quindi la chiave di crittografia dell’istanza insieme ai backup.
#!/bin/bash
# Create webhook backup script
mkdir -p /opt/backups/webhook-configs
cd /opt/n8n
# Backup workflow definitions
docker exec n8n-n8n-1 n8n export:workflow --all --output=/tmp/workflows-backup.json
docker cp n8n-n8n-1:/tmp/workflows-backup.json /opt/backups/webhook-configs/workflows-$(date +%Y%m%d).json
# Backup credentials
docker exec n8n-n8n-1 n8n export:credentials --all --output=/tmp/credentials-backup.json
docker cp n8n-n8n-1:/tmp/credentials-backup.json /opt/backups/webhook-configs/credentials-$(date +%Y%m%d).json
Ottimizzazione delle prestazioni
Ottimizzazione delle risposte dei webhook
Configura risposte efficienti per i webhook. Alcune guide meno recenti impostano anche N8N_BINARY_DATA_TTL e N8N_PERSISTED_BINARY_DATA_TTL; n8n non le usa più e chiede di rimuoverle:
environment:
# Optimize for webhook performance
- N8N_DISABLE_UI=false
- GENERIC_TIMEZONE=UTC
Pulizia del database per i webhook
I webhook con volumi elevati possono riempire il database. n8n elimina automaticamente i vecchi dati di esecuzione (EXECUTIONS_DATA_PRUNE=true, conservando fino a 336 ore e 10.000 esecuzioni); riduci EXECUTIONS_DATA_MAX_AGE (ore) e EXECUTIONS_DATA_PRUNE_MAX_COUNT per conservarne meno. La CLI di n8n non ha un comando di pulizia delle esecuzioni, quindi imposta i limiti nell’ambiente del servizio n8n invece che in un cron job, per esempio 30 giorni e al massimo 1.000 esecuzioni:
environment:
# Prune executions older than 30 days (720 hours), keep at most 1,000
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=720
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=1000
Test delle integrazioni webhook
Suite di test per i tipi di webhook comuni
Crea flussi di prova per diversi tipi di webhook:
Webhook REST API semplice:
{
"method": "POST",
"url": "https://n8n.yourdomain.com/webhook/test-api",
"headers": {
"Content-Type": "application/json"
},
"body": {
"test": true,
"timestamp": "{{new Date().toISOString()}}"
}
}
Test del bot Telegram: Invia un messaggio al bot e verifica che il flusso di lavoro si attivi correttamente.
Test di invio di un modulo:
<form action="https://n8n.yourdomain.com/webhook/form-test" method="POST">
<input type="text" name="name" value="Test User">
<input type="email" name="email" value="[email protected]">
<button type="submit">Test Webhook</button>
</form>
Scalare l’infrastruttura dei webhook
Più istanze n8n con bilanciamento del carico
Per elaborare volumi elevati di webhook, esegui processori webhook dedicati (n8n webhook) in modalità coda. Richiedono lo stesso database PostgreSQL, Redis e la stessa chiave di crittografia dell’istanza principale e dei worker. Traefik aggiunge un server per ogni container di un servizio, quindi le due repliche condividono un’unica etichetta di porta e la regola più lunga invia le richieste /webhook/ ai processori, mentre l’editor resta sull’istanza principale:
# docker-compose.yml sketch: two webhook processors in queue mode
# (main instance, workers, PostgreSQL and Redis configured as in the queue section below)
services:
n8n-webhook:
image: n8nio/n8n:1.95.2
command: webhook
restart: always
deploy:
replicas: 2
environment:
- EXECUTIONS_MODE=queue
- WEBHOOK_URL=https://n8n.yourdomain.com
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
# ... same database and Redis settings as the main instance
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.n8n-webhook.rule=Host(`n8n.yourdomain.com`) && PathPrefix(`/webhook/`)"
- "traefik.http.routers.n8n-webhook.entrypoints=https"
- "traefik.http.routers.n8n-webhook.tls.certresolver=letsencrypt"
- "traefik.http.services.n8n-webhook.loadbalancer.server.port=5678"
networks:
proxy:
external: true
Gestione delle code dei webhook
Per gestire picchi di webhook, la modalità coda richiede anche PostgreSQL (SQLite non è supportato), processi worker separati e la stessa chiave di crittografia sull’istanza principale e su tutti i worker. EXECUTIONS_TIMEOUT e EXECUTIONS_TIMEOUT_MAX sono espressi in secondi:
environment:
- QUEUE_BULL_REDIS_HOST=redis
- QUEUE_BULL_REDIS_PORT=6379
- EXECUTIONS_MODE=queue
- EXECUTIONS_TIMEOUT=3600
- EXECUTIONS_TIMEOUT_MAX=7200
Impatto su costi e prestazioni
Costi di elaborazione dei webhook
Se configurata correttamente, l’elaborazione dei webhook è estremamente efficiente:
- Risorse del server: impatto minimo su CPU e memoria per la maggior parte dei webhook
- Archiviazione: i dati delle esecuzioni aumentano con il volume dei webhook
- Rete: la larghezza di banda necessaria aumenta con le dimensioni dei payload
Confronto dei costi
Elaborazione dei webhook sulla propria infrastruttura rispetto alle alternative cloud:
- n8n Cloud Starter: €20/mese con fatturazione annuale (2.500 esecuzioni, a ottobre 2026)
- Sulla propria infrastruttura (Hetzner CX23): €5,99/mese IVA esclusa, incluso un indirizzo IPv4 primario, a ottobre 2026 (nessun costo per esecuzione; capacità limitata dalle risorse del server)
- Risparmio: circa €168 all’anno, senza quote di esecuzione
Esempi avanzati di integrazione
Pipeline dai webhook al database
Esempio completo di integrazione tra webhook e database:
# Workflow: API Webhook → Data Validation → Database Insert
# 1. Webhook Trigger (receives data)
# 2. Function Node (validates/transforms data)
# 3. Database Node (inserts processed data)
# 4. HTTP Response (confirms receipt)
Router webhook per più servizi
Instrada i diversi tipi di webhook ai gestori appropriati:
# Workflow: Webhook Router
# 1. Webhook Trigger (catches all webhooks)
# 2. Switch Node (routes by webhook source)
# 3. Multiple branches for different services
# 4. Appropriate response formatting
Conclusione
Webhook configurati correttamente sono essenziali per un’installazione n8n pronta per la produzione. La variabile d’ambiente WEBHOOK_URL è l’impostazione più importante per l’affidabilità dei webhook nelle installazioni sulla propria infrastruttura. Con una corretta configurazione SSL e il monitoraggio, la tua istanza n8n può gestire carichi di lavoro webhook che altrimenti richiederebbero un piano cloud di fascia superiore.
Vantaggi principali di questa configurazione
- Conveniente: nessun costo per esecuzione su un server da circa €6/mese (a ottobre 2026)
- Affidabile: la configurazione testata in produzione gestisce scenari con volumi elevati
- Sicura: HTTPS, autenticazione e limiti di frequenza delle richieste proteggono l’infrastruttura
- Scalabile: l’architettura supporta la crescita dai progetti personali ai flussi di lavoro aziendali
- Riservata: i payload dei webhook vengono elaborati sul tuo server; i dati escono solo quando i tuoi flussi li inviano a servizi esterni come Telegram
Questa guida completa il nostro tutorial originale sulla configurazione di n8n per creare una piattaforma di automazione completa e pronta per i webhook. Che tu elabori messaggi Telegram, callback API o invii di moduli, la tua istanza n8n ora li gestisce tutti in modo affidabile e conveniente.
Per scenari webhook complessi o implementazioni di livello aziendale, valuta una consulenza professionale per ottimizzare il tuo caso d’uso specifico.
Chi è tva
tva assicura una gestione completa dell’infrastruttura di sistemi di database, ambienti cloud e supply chain globali. Il nostro approccio metodico combina rigorosi protocolli di sicurezza con l’ottimizzazione delle prestazioni, mentre i servizi di consulenza strategica consentono un coordinamento preciso delle risorse digitali e fisiche, mantenendo i più alti standard di eccellenza operativa e conformità in tutti gli incarichi.
Visita tva.sg per maggiori informazioni sui nostri servizi e altri tutorial sull’automazione.
Per approfondire
Guida completa al self-hosting di n8n 2025: risolvere gli errori di dimensione dei dati di esecuzione e i problemi dei webhook con Traefik
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