PostgreSQL

Автоматический бэкап PostgreSQL в S3

Оставьте pg_dump — он надёжен и знаком. dbsend берёт на себя всё, что вокруг: хранение дампов в российском облаке, версии с метками, сравнение двух дампов, алерты, если ночной бэкап не пришёл, и выдачу нужной версии для восстановления.

Что не так с «pg_dump в cron + aws s3 cp»

Классическая схема выглядит просто: скрипт делает pg_dump, сжимает его и копирует в бакет. На практике к ней быстро добавляются ротация старых файлов, хранение ключей от бакета на сервере, логирование и проверка, что дамп не пустой. Всё это — код, который никто не тестирует.

Самое опасное — тихие сбои. Сменился пароль базы, закончилось место в /tmp, обновился образ Docker без клиента postgresql — и cron годами пишет ошибку в лог, который никто не читает. Узнают об этом в день, когда бэкап понадобился.

И даже рабочие дампы мало что говорят сами по себе. Чтобы понять, в каком из десяти файлов ещё есть удалённые вчера строки, приходится разворачивать их по очереди во временную базу.

Как dbsend помогает с бэкапами PostgreSQL

Дампы как версии

Каждый загруженный дамп — версия vN с меткой, размером и SHA-256. CLI сжимает файл потоково и загружает большие дампы частями с повторами при сбоях сети.

Инспекция plain SQL

Для дампов в формате --format=plain dbsend разбирает CREATE/ALTER, COPY и INSERT: видно список таблиц, число строк и хэш схемы (тарифы от «Старт»).

Diff между дампами

Сравните вчерашний и сегодняшний дамп: в каких таблицах изменилось число строк, поменялась ли схема. Помогает найти момент, когда данные пропали. Доступно на тарифах от «Старт».

Алерты о пропусках

Задайте ожидаемый интервал — например, раз в сутки. Если дамп не пришёл, придёт уведомление в Telegram или на email.

Настройка: pg_dump + dbsend по расписанию

Создайте в панели базу с типом postgresql_dump и API-ключ. Сервер с PostgreSQL ключ от S3 не получает — только API-ключ dbsend, который можно ограничить одной базой.

1. Скрипт бэкапа

#!/usr/bin/env bash
# /usr/local/bin/pg-backup.sh
set -euo pipefail
DUMP=/var/backups/app.sql
pg_dump --format=plain --no-owner "$DATABASE_URL" > "$DUMP"
dbsend backup "$DUMP" -d <id базы> -e postgresql_dump -l "nightly-$(date +%F)"
rm -f "$DUMP"

Используйте --format=plain: custom, tar и directory-форматы тоже можно хранить, но без инспекции и diff по таблицам.

2. Запуск по cron

# crontab -e — каждый день в 03:15
15 3 * * * DATABASE_URL=postgres://backup@localhost/app /usr/local/bin/pg-backup.sh >> /var/log/pg-backup.log 2>&1

Ключ dbsend сохраняется один раз командой dbsend login для пользователя, от имени которого работает cron. Ненулевой код выхода (3 — ключ, 4 — лимит тарифа, 5 — сеть) удобно ловить в мониторинге.

3. Если PostgreSQL в Docker

docker exec -t postgres pg_dump -U app --format=plain app > /var/backups/app.sql
dbsend backup /var/backups/app.sql -d <id базы> -e postgresql_dump

4. Восстановление

dbsend log <id базы>
dbsend restore <id версии> ./restore.sql --yes
psql "$DATABASE_URL_STAGING" -f ./restore.sql

Восстанавливайте сначала в отдельную базу, проверяйте данные и только потом переключайте приложение.

Когда этого достаточно, а когда нужен PITR

Логический бэкап через pg_dump подходит для баз до десятков гигабайт, где допустимо потерять изменения с момента последнего дампа: SaaS на старте, внутренние сервисы, CMS, базы ботов и pet-проектов. Он переносим между версиями PostgreSQL и восстанавливается одной командой psql.

Если вам нужна точка восстановления с точностью до секунды или база весит сотни гигабайт, используйте физические бэкапы и архив WAL (pgBackRest, WAL-G) или управляемую базу в облаке. dbsend при этом можно оставить как второй, независимый слой — ежедневные логические дампы вне основной инфраструктуры.

dbsend или свой скрипт pg_dump + S3

pg_dump + cron + S3dbsend
Ключи от бакета на сервере базынужныне нужны — только API-ключ
Таблицы и число строк в каждом дампеот «Старт»
Время на настройкускрипт, бакет, ключи, ротация — часы3 команды — несколько минут
История версий с меткамиимена файлов по датеv1…vN, метки, закрепление
Не плодит одинаковые копии
Diff между версиями (таблицы, строки, схема)на платных тарифах
Проверка SHA-256 при восстановленииесли написали сами
Алерт, если бэкап не пришёлTelegram и email
Шифрование и хранение в РФзависит от бакетаAES-256-GCM, РФ
Доступ из Claude Code и Cursor (MCP)
Стоимостьхранилище + ваше времяот 0 ₽

Тарифы и лимиты — на странице «Тарифы». Документация: CLI, форматы файлов, REST API.

Частые вопросы

Какие форматы pg_dump поддерживаются?

Для инспекции и diff нужен plain SQL (--format=plain). Дампы в форматах custom, tar и directory можно загрузить как generic-файл: они хранятся версиями с контрольной суммой, но без разбора таблиц.

Можно ли бэкапить управляемую базу (Яндекс Облако, Selectel, Timeweb)?

Да, если у вас есть сетевой доступ к базе и права на pg_dump. Запускайте скрипт на любом сервере или в CI, откуда база доступна, — dbsend нужен только исходящий HTTPS до api.dbsend.ru.

Как восстановить базу из дампа?

Скачайте версию командой dbsend restore <id> ./restore.sql --yes — CLI проверит SHA-256. Затем примените дамп штатным psql -f restore.sql к пустой базе. Для custom-формата используйте pg_restore.

Сколько дампов хранится?

Зависит от тарифа: 3 версии на бесплатном, 30 на «Старт», 90 на «Про» и 365 на «Команде». Старые версии удаляются автоматически, закреплённые командой dbsend pin — сохраняются.

Есть ли ограничение на размер дампа?

До 100 МБ на бесплатном тарифе, 500 МБ на «Старт» и 2 ГБ на «Про» и «Команде» — это размер одного файла. Дампы больше 32 МБ CLI загружает частями автоматически.

Статьи по теме

Все статьи →

Другие сценарии

Отправьте первый дамп PostgreSQL сегодня

Бесплатный тариф: 1 база, 500 МБ и 3 версии навсегда. Подключение — одна строка в cron.

Начать бесплатно →