Aufbewahrung. Die Standardeinstellungen behalten vierzehn Tage oder 10 000 Ausführungen, je nachdem, was zuerst eintritt, mit vollständigen Input- und Output-Daten für jeden Node. Auf einer kleinen NVMe mit einem stark beschäftigten Schedule-Trigger ist genau das der Grund, warum die Festplatte volläuft. Fügen Sie Folgendes zum n8n-Environment-Block hinzu und starten Sie neu:
- 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 ist der mit Abstand größte Gewinn bei einer hochfrequenten Instanz: Es stoppt das Schreiben der Payloads erfolgreicher Läufe, während jeder fehlgeschlagene Lauf weiterhin vollständig gespeichert wird, damit Sie ihn debuggen können. Lassen Sie es auf „all", solange Sie den Workflow noch bauen, und schalten Sie es um, sobald der Workflow langweilig geworden ist.
Stille. Die Compose-Datei schaltet bereits die Diagnose, die Versionsbenachrichtigungen und die Personalisierungs-Umfrage ab. Der verbleibende ausgehende Aufruf ist die Template-Galerie, die von api.n8n.io lädt; setzen Sie N8N_TEMPLATES_ENABLED=false, wenn Sie überhaupt keinen Drittanbieter-Aufruf wollen. Wenn Sie die Versionsbenachrichtigungen deaktivieren, tragen Sie sich eine monatliche Erinnerung in den Kalender ein, um die Release Notes zu lesen — eine selbst gehostete Instanz, die niemand aktualisiert, ist ein schlechteres Ergebnis als eine, die nach Versionen fragt.
Der Code-Node. N8N_BLOCK_ENV_ACCESS_IN_NODE=true, bereits in der Datei enthalten, verhindert, dass Expressions und Code-Nodes Prozessumgebungsvariablen lesen — was auf dieser Box das PostgreSQL-Passwort und den Verschlüsselungsschlüssel bedeutet. Wenn Sie die öffentliche REST-API nicht nutzen, fügen Sie N8N_PUBLIC_API_DISABLED=true hinzu und schließen Sie auch diese Angriffsfläche.
Backups — alle drei Teile oder keiner. Ein Backup allein der Datenbank ist ohne den Verschlüsselungsschlüssel wertlos, und der Schlüssel allein stellt nichts wieder her. Sichern Sie den PostgreSQL-Dump, das n8n-Datenvolume und die .env gemeinsam, und bewahren Sie mindestens eine Kopie außerhalb des Servers auf:
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)
Der Volume-Name setzt sich aus dem Compose-Projektnamen plus dem Volume-Namen zusammen; wenn Ihr Verzeichnis nicht n8n heißt, führen Sie docker volume ls aus und verwenden Sie, was Sie sehen. Packen Sie die drei Zeilen in einen Cronjob, verschicken Sie die Archive an einen anderen Ort, und testen Sie einmal eine Wiederherstellung — ein ungetestetes Backup ist ein Glaube, kein Backup.
Updates. docker compose pull, gefolgt von docker compose up -d. Erstellen Sie zuerst einen Snapshot: n8n führt beim Start Datenbankmigrationen aus, und Migrationen sind nicht dafür ausgelegt, zurückgerollt zu werden. Bei einem Major-Versionssprung — etwa dem Sprung von 1.x auf 2.x — lesen Sie die Release Notes vor dem Pull statt danach, und erwägen Sie, einen expliziten Image-Tag statt :latest zu pinnen, damit ein unbeaufsichtigter Neustart Sie nie überraschend upgradet.