Автоматические бэкапы сервера в S3: скрипт на Bash + cron
Пишем скрипт бэкапа PostgreSQL, файлов и конфигов в S3-совместимое хранилище. Ротация, шифрование и проверка целостности.
Автоматический бэкап: pg_dump → gzip → (опционально GPG) → s3cmd put в S3-хранилище по cron ежедневно в 3:00. Ротация через find -mtime для удаления старых копий. Стоимость: ~1–2 ₽/ГБ в месяц за S3-хранилище. Проверяйте восстановление раз в месяц.
- Бэкап = pg_dump/mysqldump + tar файлов → gzip → загрузка в S3 через s3cmd/rclone.
- Ротация: храним 7 ежедневных + 4 еженедельных + 3 ежемесячных копии.
- Шифрование: GPG симметричное шифрование перед загрузкой в облако.
- Cron: ежедневно в 3:00 (минимальная нагрузка на сервер).
Скрипт бэкапа: PostgreSQL + файлы → S3
Универсальный скрипт, который дампит PostgreSQL, архивирует важные файлы и заливает в S3:
#!/bin/bash
# backup.sh — автоматический бэкап в S3
set -euo pipefail
DATE=$(date +%Y-%m-%d_%H%M)
BACKUP_DIR="/tmp/backups"
S3_BUCKET="s3://my-backups/server1"
DB_NAME="myapp"
KEEP_DAYS=7
mkdir -p "$BACKUP_DIR"
# 1. Бэкап PostgreSQL
echo "[$(date)] Дамп PostgreSQL..."
pg_dump -U postgres -Fc "$DB_NAME" > "$BACKUP_DIR/db_${DATE}.dump"
# 2. Бэкап файлов (конфиги, uploads)
echo "[$(date)] Архивирование файлов..."
tar czf "$BACKUP_DIR/files_${DATE}.tar.gz" \
/etc/nginx /etc/letsencrypt /var/www/uploads 2>/dev/null || true
# 3. Загрузка в S3
echo "[$(date)] Загрузка в S3..."
s3cmd put "$BACKUP_DIR/db_${DATE}.dump" "$S3_BUCKET/db/"
s3cmd put "$BACKUP_DIR/files_${DATE}.tar.gz" "$S3_BUCKET/files/"
# 4. Очистка локальных копий
rm -f "$BACKUP_DIR"/*
# 5. Ротация в S3 (удаляем старше KEEP_DAYS дней)
s3cmd ls "$S3_BUCKET/db/" | awk '{print $4}' | while read -r file; do
file_date=$(echo "$file" | grep -oP '\d{4}-\d{2}-\d{2}')
if [[ -n "$file_date" ]]; then
age=$(( ($(date +%s) - $(date -d "$file_date" +%s)) / 86400 ))
if (( age > KEEP_DAYS )); then
s3cmd del "$file"
echo "[$(date)] Удалён старый бэкап: $file"
fi
fi
done
echo "[$(date)] Бэкап завершён успешно!"Настройка cron
Добавляем скрипт в cron — выполнение каждый день в 3:00:
# Сделать скрипт исполняемым
chmod +x /opt/scripts/backup.sh
# Добавить в crontab
crontab -e
# Добавить строку:
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1Проверка и восстановление
Бэкап, который не проверяется — не бэкап. Раз в месяц проверяйте восстановление на тестовом сервере:
s3cmd get s3://my-backups/server1/db/db_2026-09-01.dump /tmp/
pg_restore -U postgres -d test_restore /tmp/db_2026-09-01.dump
Если восстановление прошло без ошибок — бэкапы работают. Если нет — чините скрипт, пока не произошло реального инцидента.
Проверенные серверы от надежных провайдеров
Timeweb Cloud
Cloud Start
CPU
1 ядер • 3.3 ГГц
RAM
1 ГБ
Диск
15 ГБ NVMe
Канал
200 Мбит/с
299 ₽/мес
Selectel
Cloud Lite 1
CPU
1 ядер • 2.6 ГГц
RAM
1 ГБ
Диск
10 ГБ SSD
Канал
200 Мбит/с
550 ₽/мес
Часто задаваемые вопросы (FAQ)
Какое S3-хранилище использовать в России?
Selectel Object Storage (~1.2 ₽/ГБ), Timeweb Cloud S3 (~1.5 ₽/ГБ), Yandex Object Storage (~1.1 ₽/ГБ). Все поддерживают S3-совместимый API (s3cmd, rclone, boto3).
Нужно ли шифровать бэкапы?
Если в бэкапе есть персональные данные (152-ФЗ) — обязательно. Используйте GPG: pg_dump ... | gzip | gpg -c --batch --passphrase "YOUR_PASS" > backup.dump.gz.gpg.