Postgres restore для n8n: runbook восстановления базы ¶
Обновлено: 2026-05-29
Intent: runbook Postgres restore: восстановление базы n8n, encryption key, Docker Compose, smoke test, RTO/RPO и rollback
H1: Postgres restore для n8n: как восстановить базу и не потерять credentials
Schema: TechArticle, HowTo, FAQPage, BreadcrumbList
Old word count: 656
New word count: 698
Короткий ответ ¶
Восстановление Postgres для n8n — это не только pg_restore. Нужно сохранить совместимость версии n8n, базы и N8N_ENCRYPTION_KEY: без правильного encryption key credentials и OAuth tokens могут стать нечитаемыми. Безопасный порядок — остановить запись в n8n, восстановить backup в отдельную базу или временный контейнер, проверить workflows/credentials/executions, затем переключать production. Не путайте export workflows JSON с полноценным backup базы.
Когда применять этот runbook ¶
Runbook нужен, если:
- production Postgres повреждён или удалён;
- нужно откатиться после неудачного релиза;
- сервер потерян, но есть backup;
- проверяется restore drill;
- база переезжает на новый хост;
- нужно восстановить n8n после disk full или storage incident.
Цель — вернуть работоспособность без потери workflows, credentials, users, settings, execution history и связей с очередью.
1. Что должно быть в backup ¶
Для self-hosted n8n с Postgres критичны три группы данных:
| Данные | Почему важны |
|---|---|
| Postgres database | workflows, credentials records, users, executions, settings |
N8N_ENCRYPTION_KEY |
расшифровка credentials и sensitive data |
| Файлы/volumes n8n | config, binary data, custom files, если используются |
Если есть только JSON export workflows, это не полный recovery. Он может помочь восстановить логику workflow, но не заменит credentials, users, settings и execution history.
2. Перед restore: остановить запись ¶
Если старый production ещё жив, переведите систему в режим без записи:
- Отключить external webhooks или закрыть traffic на proxy.
- Остановить cron/schedule workflows, если возможно.
- Остановить workers, чтобы они не продолжали писать executions.
- Зафиксировать время freeze.
- Сохранить текущие логи и failed/running executions.
Для queue mode важно учитывать main instance, workers и webhook processors. Если часть процессов продолжит писать в базу во время restore, вы получите несогласованное состояние.
3. Восстановить в отдельную базу ¶
Лучший подход — сначала восстановить backup не поверх production, а в отдельную базу/контейнер. Это даёт шанс проверить целостность.
Примерная схема для Docker Compose:
# пример, адаптируйте имена контейнеров и файлов
cat backup.sql | docker compose exec -T postgres psql -U n8n -d n8n_restore
# или для custom dump
docker compose exec -T postgres pg_restore -U n8n -d n8n_restore --clean --if-exists < backup.dump
Не копируйте команды вслепую. Формат backup (plain SQL, custom dump, managed backup) определяет команду восстановления.
4. Проверить encryption key ¶
Перед запуском n8n на восстановленной базе проверьте, что используется тот же instance encryption key, который был у backup.
N8N_ENCRYPTION_KEY=...
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_DATABASE=n8n_restore
Если key потерян, база может открыться, но credentials станут непригодны. Это критичный пункт для disaster recovery: encryption key должен храниться отдельно от базы, но достаточно безопасно, чтобы его можно было восстановить.
5. Smoke test на восстановленной базе ¶
До переключения production проверьте:
- UI открывается;
- пользователи/owner доступны;
- workflows отображаются;
- credentials читаются и проходят test connection;
- OAuth credentials не требуют неожиданной reauth;
- Webhook node показывает правильный production URL после env;
- несколько безопасных workflows запускаются;
- execution history открывается;
- binary data доступна, если использовалась.
Не запускайте сразу все active workflows. Сначала проверьте на безопасном subset и staging-домене.
6. Переключение production ¶
Когда восстановленная база проверена:
- Сделать финальный backup текущего состояния, если оно ещё существует.
- Остановить n8n main/workers/webhook processors.
- Переключить DB target или заменить production DB восстановленной.
- Запустить main instance.
- Запустить workers после проверки UI и credentials.
- Вернуть webhooks/cron traffic.
- Проверить ключевые бизнес-сценарии.
После восстановления могут быть события, которые пришли во время простоя. Их нужно сверить с внешними системами: платежи, CRM, заказы, очереди сообщений, почта.
7. Что записать в restore report ¶
- backup timestamp;
- restore start/end;
- RTO/RPO фактические;
- какая база восстановлена;
- какой n8n version использовался;
- был ли тот же
N8N_ENCRYPTION_KEY; - какие workflows проверены;
- какие события требовали replay;
- какие gaps обнаружены в backup-процессе.
Restore без отчёта не улучшает надёжность. Через месяц команда должна понимать, что именно было проверено.
FAQ ¶
Достаточно ли экспортировать workflows JSON?
Нет. Это не полный backup n8n. Для disaster recovery нужен backup базы, encryption key и связанные файлы/binary data.
Что будет, если потерян N8N_ENCRYPTION_KEY?
Credentials и другие sensitive data могут стать нечитаемыми. Поэтому key должен храниться отдельно и безопасно.
Можно ли восстановить backup поверх production?
Можно, но рискованно. Лучше сначала restore в отдельную базу и smoke test.
Нужно ли останавливать workers?
Да, при queue mode workers могут продолжать выполнять executions и писать в базу. На время restore запись нужно остановить.
Как применять playbook в команде ¶
Playbook «Postgres restore для n8n» должен быть понятен человеку, который не писал workflow. Поэтому в нём нужны входной сигнал, частота запуска, критерий тревоги, ответственный и ожидаемое действие после срабатывания.
Используйте этот материал как операционную инструкцию: что проверить, где посмотреть логи, как понять масштаб проблемы и когда эскалировать.
| Слой | Что зафиксировать | Зачем |
|---|---|---|
| Вход | запись из базы или SQL-операция с уникальным ключом, timestamp и результатом транзакции | позволяет повторить проблему без доступа к production-секретам |
| Контроль | query_duration, conflict_count, transaction_failures, row_count_delta, lock_wait | показывает деградацию раньше, чем пользователи начинают писать в поддержку |
| Безопасность | сделать неидемпотентную запись, поймать lock/timeout или незаметно нарушить схему данных | снижает риск скрытых дублей, утечки данных и неконтролируемых write-действий |
| Готовность | есть тест на happy path, пустой вход, повтор и сбой внешнего сервиса для «Postgres restore для n8n» | делает статью пригодной для runbook, а не только для чтения |
Пример безопасного входного контракта ¶
{
"operation": "upsert",
"dedupe_key": "source_system:external_id",
"expected_rows": 1,
"on_conflict": "update_changed_fields_only",
"audit": {"workflow_id": "...", "execution_id": "..."}
}
Критерий готовности ¶
- есть понятный вход, выход и владелец процесса
- проверены пустой input, повтор события и ошибка внешнего сервиса
- результат логируется без секретов и персональных данных
- страница связана с соседними рецептами, ошибками или playbook по теме