Ежедневный backup баз данных PostgreSQL с автоматической отправкой в Beget S3 (bucket your name, папка backup-db/). Поддерживает несколько баз данных, ротация 60 копий на каждую БД отдельно.
Можете переписать на любое другое S3 хранилище, Beget я использую не потому что он лучший (вообще не так), а потому что мне удобно.
db1db2db3
pg_dump→zip -P(сжатие с паролем) → загрузка в Beget S3- Multi-DB: все базы бэкапятся за один запуск
- Ротация: максимум 60 копий на каждую БД, удаление старейших
- Структура:
backup-db/<dbname>/<dbname>_<timestamp>.zip - CLI для управления backup'ами
Зависимости: python3, minio, pg_dump, zip/unzip.
python3 -m venv venv
./venv/bin/pip install miniocd /home/yourname/pg-backup
# Создать backup всех БД прямо сейчас
./venv/bin/python3 backup.py backup
# Список всех backup'ов (все БД)
./venv/bin/python3 backup.py list
# Список backup'ов для конкретной БД
./venv/bin/python3 backup.py list --db1
# Статус: кол-во копий, старейшая, новейшая (все БД)
./venv/bin/python3 backup.py status
# Статус для конкретной БД
./venv/bin/python3 backup.py status --db starwithme
# Скачать backup локально
./venv/bin/python3 backup.py download db1-07-27_030000.zip --db blissmeflash -o /tmp
# Восстановить БД из backup'а
./venv/bin/python3 backup.py restore db1-07-27_030000.zip --db blissmeflash
# Удалить старые копии (если > 60) для всех БД
./venv/bin/python3 backup.py cleanup
# Удалить старые копии для конкретной БД
./venv/bin/python3 backup.py cleanup --db peaceandlove
# Установить cron (ежедневно в 03:00)
./venv/bin/python3 backup.py install-cron
# Установить cron на другое время (05:30)
./venv/bin/python3 backup.py install-cron --hour 5 --minute 30Все настройки в .env:
DATABASE_URL_1=postgresql://user:pass@host:port/dbname1
DATABASE_URL_2=postgresql://user:pass@host:port/dbname2
DATABASE_URL_3=postgresql://user:pass@host:port/dbname3
BEGET_S3_ACCESS_KEY_ID=...
BEGET_S3_SECRET_ACCESS_KEY=...
BEGET_S3_BUCKET_NAME=...
BEGET_S3_REGION=ru-1
BEGET_S3_ENDPOINT=https://s3.ru1.storage.beget.cloud
BACKUP_PASSWORD=....
MAX_BACKUPS=60
S3_BACKUP_PREFIX=backup-db/
Cron задача запускается каждый день в 03:00:
0 3 * * * /home/yourname/pg-backup/venv/bin/python3 /home/yourname/pg-backup/backup.py backup >> /home/yourname/pg-backup/backup.log 2>&1
Логи: /home/yourname/pg-backup/backup.log
3a82fdd31df5-vega-s3/
└── backup-db/
├── blissmeflash/
│ ├── db1-07-27_030000.zip
│ ├── db1-07-28_030000.zip
│ └── ... (макс. 60 файлов)
├── starwithme/
│ ├── starwithme_2025-07-27_030000.zip
│ └── ... (макс. 60 файлов)
└── peaceandlove/
├── peaceandlove_2025-07-27_030000.zip
└── ... (макс. 60 файлов)
# Скачать и восстановить
./venv/bin/python3 backup.py restore db1-07-27_030000.zip --db blissmeflash
# Или вручную: скачать, разархивировать, загрузить
./venv/bin/python3 backup.py download db1-07-27_030000.zip --db blissmeflash -o /tmp
unzip -P renovatio /tmp/db1-07-27_030000.zip -d /tmp
psql -h localhost -U yourname -d blissmeflash -f /tmp/db1-07-27_030000.sql