Backup n8n в S3 через Docker Compose: PostgreSQL, workflows и restore-test ¶
Обновлено: 2026-05-30
Перед запуском замените SSH host, S3 endpoint, bucket, retention и имена Docker Compose services.
- Проблема: backup n8n бесполезен без restore-test
- Архитектура backup workflow для Docker Compose
- Контракт параметров backup job
- Команды: pg_dump, workflows export и upload в S3
- Готовый workflow JSON: скачать и импортировать
- Пошаговая настройка backup n8n в S3
- Тесты restore, retention и integrity check
- Production-риски резервного копирования
- Полезные ссылки и документация
- Критерии готовности
Проблема: self-hosted n8n в Docker Compose часто живёт годами без проверенного восстановления. Файл “backup.tar.gz” вроде есть, но никто не знает, содержит ли он PostgreSQL, workflows, бинарные данные, настройки encryption key и можно ли поднять из него рабочую копию.
Решение: настроить backup n8n в S3-совместимое хранилище как production-процесс: pg_dump PostgreSQL, export workflows, archive, upload, retention, integrity check и регулярный restore-test. Только тогда резервная копия помогает при ошибке обновления, падении VPS или повреждении volume.
Проблема: backup n8n бесполезен без restore-test ¶
Самая частая ошибка — копировать только Docker volume или только JSON workflows. Для n8n этого мало: основная рабочая история, credentials metadata и executions обычно лежат в PostgreSQL, а возможность расшифровать credentials зависит от N8N_ENCRYPTION_KEY. Если ключ потерян, backup базы не спасёт credentials.
Поэтому workflow должен не просто загрузить архив в S3, а зафиксировать состав backup, размер, checksum, retention policy и результат восстановления на отдельной тестовой среде.
Архитектура backup workflow для Docker Compose ¶
| Нода | Роль | Что проверить |
|---|---|---|
| Schedule nightly | Запускает backup по расписанию | Часовой пояс, окно низкой нагрузки |
| Prepare backup id | Собирает имена файлов и retention | Уникальный timestamp, environment label |
| Run pg_dump | Снимает PostgreSQL dump | Права пользователя, формат -Fc, ненулевой размер |
| Export workflows | Экспортирует workflow JSON | Все workflows, не полагаться только на UI export |
| Upload to S3 | Кладёт архив в S3-compatible storage | Endpoint, bucket policy, шифрование |
| Notify result | Отправляет статус в Telegram/Slack | Размер, checksum, restore-test |
Контракт параметров backup job ¶
Параметры backup лучше хранить явно: так новая команда поймёт, какой контейнер дампится, где лежит bucket и сколько дней держать копии.
{
"backup_name": "n8n-prod-nightly",
"postgres_container": "n8n-postgres-1",
"n8n_container": "n8n-app-1",
"database": "n8n",
"s3_bucket": "s3://company-backups/n8n/prod",
"retention_days": 30,
"restore_test": true
}
Команды: pg_dump, workflows export и upload в S3 ¶
Code Node готовит безопасные имена файлов, а реальные команды выполняются через SSH на Docker host или отдельный runner. Не запускайте dump из браузерного окружения.
const src = $json.body ?? $json;
const now = new Date();
const stamp = now.toISOString().replace(/[:.]/g, '-');
const name = String(src.backup_name ?? 'n8n-prod').replace(/[^a-z0-9_-]/gi, '-').toLowerCase();
const retentionDays = Number(src.retention_days ?? 30);
if (retentionDays < 7) throw new Error('Retention must be at least 7 days for production n8n');
return [{
json: {
backup_id: `${name}-${stamp}`,
pg_file: `/tmp/${name}-${stamp}.pgdump`,
workflows_file: `/tmp/${name}-${stamp}-workflows.json`,
archive_file: `/tmp/${name}-${stamp}.tar.gz`,
s3_prefix: String(src.s3_bucket ?? '').replace(/\/$/, ''),
retention_days: retentionDays,
restore_test_required: src.restore_test !== false,
labels: { app: 'n8n', type: 'backup', environment: 'production' }
}
}];Bash-команды для runner или SSH-ноды ¶
# PostgreSQL dump from Docker Compose
mkdir -p /tmp/n8n-backup
PGFILE="/tmp/n8n-backup/n8n-$(date -u +%Y%m%dT%H%M%SZ).pgdump"
docker compose exec -T postgres pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc > "$PGFILE"
# Export workflows and credentials metadata from n8n container
WF="/tmp/n8n-backup/workflows-$(date -u +%Y%m%dT%H%M%SZ).json"
docker compose exec -T n8n n8n export:workflow --all --pretty > "$WF"
# Archive and upload to S3-compatible storage
ARCHIVE="${PGFILE%.pgdump}.tar.gz"
tar -czf "$ARCHIVE" -C /tmp/n8n-backup "$(basename "$PGFILE")" "$(basename "$WF")"
aws s3 cp "$ARCHIVE" "s3://company-backups/n8n/prod/$(basename "$ARCHIVE")" --only-show-errors
Что положить рядом с архивом
N8N_ENCRYPTION_KEY— хранить отдельно в секретном хранилище, не в архиве.- Версию n8n и PostgreSQL.
- Checksum архива.
- Инструкцию restore для дежурного инженера.
Готовый workflow JSON: скачать и импортировать ¶
Готовый workflow JSON включает расписание, подготовку backup id, placeholder SSH-команды, upload в S3 и уведомление. После импорта замените endpoint и credentials.
{
"name": "Nodbot - n8n Docker Compose backup to S3",
"nodes": [
{ "name": "Schedule nightly", "type": "n8n-nodes-base.scheduleTrigger", "purpose": "Запустить backup по расписанию" },
{ "name": "Prepare backup id", "type": "n8n-nodes-base.code", "purpose": "Собрать имена файлов и retention" },
{ "name": "Run pg_dump", "type": "n8n-nodes-base.ssh", "purpose": "Снять PostgreSQL dump с Docker host" },
{ "name": "Export workflows", "type": "n8n-nodes-base.ssh", "purpose": "Экспортировать workflows" },
{ "name": "Upload to S3", "type": "n8n-nodes-base.httpRequest", "purpose": "Загрузить архив в S3-compatible storage" },
{ "name": "Notify result", "type": "n8n-nodes-base.telegram", "purpose": "Сообщить статус backup и restore-test" }
],
"connections": "Schedule → Prepare → pg_dump/export → S3 upload → Notify"
}
Пошаговая настройка backup n8n в S3 ¶
- Проверьте, что n8n работает на PostgreSQL, а не на SQLite.
- Сохраните
N8N_ENCRYPTION_KEYв отдельном secret vault. - Создайте S3 bucket с версионированием или lifecycle policy.
- Настройте SSH-доступ runner-а к Docker host с минимальными правами.
- Запустите workflow вручную и проверьте размер dump, checksum и upload.
- Поднимите тестовый restore на отдельной машине.
Тесты restore, retention и integrity check ¶
curl -X POST "https://YOUR-N8N-DOMAIN/webhook/docker-compose-backup-to-s3" -H "Content-Type: application/json" --data @docker-compose-backup-to-s3-payload.jsonМинимальный restore-test: создать чистую PostgreSQL, восстановить dump, запустить n8n с тем же encryption key, открыть UI, проверить credentials и выполнить один безопасный workflow.
Production-риски резервного копирования ¶
- Нет encryption key. Credentials не расшифруются после восстановления.
- Backup лежит на том же VPS. При потере диска исчезает и сайт, и копия.
- Не проверяется размер архива. Можно месяцами загружать пустой dump.
- Retention бесконечный. Bucket растёт и хранит лишние персональные данные.
- Restore не тестировался. Ошибка обнаружится только в аварии.
Полезные ссылки и документация ¶
Смотрите также: Backup self-hosted n8n, PostgreSQL backup/restore, ENV-переменные n8n, Telegram-алерт об ошибках. Документация: Docker Compose, Docker volumes backup/restore, S3 PutObject.
Критерии готовности ¶
- PostgreSQL dump создаётся в формате, пригодном для restore.
- Workflow JSON экспортируется отдельно от базы.
N8N_ENCRYPTION_KEYсохранён вне VPS.- Архив уходит в S3-compatible storage с retention.
- Restore-test выполняется регулярно и имеет владельца.
Nodbot настроит backup и restore-test для self-hosted n8n: PostgreSQL, workflows, S3, алерты и runbook восстановления.
Настроить backup