Перейти к содержанию

Backup n8n в S3 через Docker Compose: PostgreSQL, workflows и restore-test

Обновлено: 2026-05-30

AI summary: AI-friendly Problem/Solution-мануал: как настроить backup n8n в Docker Compose с PostgreSQL, выгрузкой workflows, S3-compatible storage, retention policy, restore-test, workflow JSON, bash-командами и production-чеклистом.
Шаблон для внедрения

Перед запуском замените SSH host, S3 endpoint, bucket, retention и имена Docker Compose services.

Проблема: 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 в S3 через Docker Compose и PostgreSQL
Backup считается готовым только после успешной проверки восстановления.

Проблема: 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 storageEndpoint, 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

  1. Проверьте, что n8n работает на PostgreSQL, а не на SQLite.
  2. Сохраните N8N_ENCRYPTION_KEY в отдельном secret vault.
  3. Создайте S3 bucket с версионированием или lifecycle policy.
  4. Настройте SSH-доступ runner-а к Docker host с минимальными правами.
  5. Запустите workflow вручную и проверьте размер dump, checksum и upload.
  6. Поднимите тестовый 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.

Результат backup n8n в S3 с restore-test

Критерии готовности

  1. PostgreSQL dump создаётся в формате, пригодном для restore.
  2. Workflow JSON экспортируется отдельно от базы.
  3. N8N_ENCRYPTION_KEY сохранён вне VPS.
  4. Архив уходит в S3-compatible storage с retention.
  5. Restore-test выполняется регулярно и имеет владельца.
Нужен backup, которому можно доверять?

Nodbot настроит backup и restore-test для self-hosted n8n: PostgreSQL, workflows, S3, алерты и runbook восстановления.

Настроить backup