Бэкапы• Гайды по выбору

Автоматические бэкапы сервера в S3: скрипт на Bash + cron

Пишем скрипт бэкапа PostgreSQL, файлов и конфигов в S3-совместимое хранилище. Ротация, шифрование и проверка целостности.

Обновлено: 2026-11-04T06:00:05.429Z
Время чтения: ~9 мин
Автор: Артём Савельев (DevOps-инженер)
Быстрый ответ & Краткая суть

Автоматический бэкап: pg_dump → gzip → (опционально GPG) → s3cmd put в S3-хранилище по cron ежедневно в 3:00. Ротация через find -mtime для удаления старых копий. Стоимость: ~1–2 ₽/ГБ в месяц за S3-хранилище. Проверяйте восстановление раз в месяц.

Инструментs3cmd или rclone
РасписаниеCron, ежедневно в 3:00
Ротация7 дней + 4 недели + 3 месяца
Стоимость~1–2 ₽/ГБ/мес (S3)
Ключевые выводы и краткая суть
  • Бэкап = pg_dump/mysqldump + tar файлов → gzip → загрузка в S3 через s3cmd/rclone.
  • Ротация: храним 7 ежедневных + 4 еженедельных + 3 ежемесячных копии.
  • Шифрование: GPG симметричное шифрование перед загрузкой в облако.
  • Cron: ежедневно в 3:00 (минимальная нагрузка на сервер).

Скрипт бэкапа: PostgreSQL + файлы → S3

Универсальный скрипт, который дампит PostgreSQL, архивирует важные файлы и заливает в S3:

backup.sh
#!/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:

cron-setup.sh
# Сделать скрипт исполняемым
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

Если восстановление прошло без ошибок — бэкапы работают. Если нет — чините скрипт, пока не произошло реального инцидента.

Тестируйте восстановление!Статистика: 40% бэкапов невозможно восстановить из-за повреждений, неполных дампов или забытых паролей. Проверяйте restore каждый месяц.
Рекомендованные конфигурации по теме статьи

Проверенные серверы от надежных провайдеров

Весь каталог
Timeweb Cloud
Перейти
Хит цены
Timeweb Cloud

Timeweb Cloud

Москва★ 4.8

Cloud Start

CPU

1 ядер • 3.3 ГГц

RAM

1 ГБ

Диск

15 ГБ NVMe

Канал

200 Мбит/с

299 ₽/мес

Timeweb Cloud

Timeweb Cloud

Москва★ 4.8

Cloud Basic

CPU

2 ядер • 3.3 ГГц

RAM

2 ГБ

Диск

40 ГБ NVMe

Канал

200 Мбит/с

499 ₽/мес

152-ФЗ
Selectel

Selectel

Москва★ 4.9

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.