Conservazione. I valori predefiniti conservano quattordici giorni o 10 000 esecuzioni, a seconda di cosa arriva prima, con i dati completi di input e output per ogni nodo. Su un piccolo NVMe con un trigger schedulato molto attivo, è questo a riempire il disco. Aggiunga queste righe al blocco environment di n8n e riavvii:
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168 # hours — one week
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none # keep failures, drop the noise
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none è il singolo vantaggio più grande su un'istanza ad alta frequenza: smette di scrivere i payload delle esecuzioni riuscite, pur continuando a memorizzare per intero ogni esecuzione fallita così da poterla debuggare. Lo mantenga su «all» mentre sta ancora costruendo il workflow, poi lo cambi una volta che il workflow è diventato noioso.
Silenzio. Il file Compose disattiva già la diagnostica, le notifiche di versione e il sondaggio di personalizzazione. Il chiamante in uscita rimasto è la galleria dei template, che effettua richieste verso api.n8n.io; imposti N8N_TEMPLATES_ENABLED=false se non vuole alcuna chiamata verso terzi. Se disattiva le notifiche di versione, si metta un promemoria mensile in calendario per leggere le release notes — un'istanza self-hosted che nessuno aggiorna è un esito peggiore di una che verifica le versioni.
Il nodo Code. N8N_BLOCK_ENV_ACCESS_IN_NODE=true, già presente nel file, impedisce alle espressioni e ai nodi Code di leggere le variabili d'ambiente del processo — che su questa macchina significa la password di PostgreSQL e la chiave di cifratura. Se non usa la REST API pubblica, aggiunga N8N_PUBLIC_API_DISABLED=true e chiuda anche quella superficie.
Backup — tutte e tre le parti, o nessuna. Un backup del solo database è inutile senza la chiave di cifratura, e la sola chiave non ripristina nulla. Faccia il backup del dump di PostgreSQL, del volume dati di n8n e del .env insieme, e conservi almeno una copia fuori dal server:
cd /opt/n8n
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backup-db-$(date +%F).sql.gz
docker run --rm -v n8n_n8n_data:/data -v "$PWD":/backup alpine \
tar czf /backup/backup-vol-$(date +%F).tar.gz -C /data .
cp .env backup-env-$(date +%F)
Il nome del volume è il nome del progetto Compose più il nome del volume; se la sua directory non si chiama n8n, esegua docker volume ls e usi ciò che vede. Metta le tre righe in un cron job, spedisca gli archivi altrove, e testi un ripristino almeno una volta — un backup non testato è una convinzione, non un backup.
Aggiornamenti. docker compose pull seguito da docker compose up -d. Faccia prima uno snapshot: n8n esegue le migrazioni del database all'avvio, e le migrazioni non sono progettate per essere annullate. Attraverso una versione major — il salto da 1.x a 2.x, per esempio — legga le release notes prima di fare il pull piuttosto che dopo, e consideri di fissare un tag immagine esplicito invece di :latest così che un riavvio automatico non la aggiorni mai a sua insaputa.