Регулярное резервное копирование сайта
Бэкап — страховка, которая стоит дёшево, пока не нужна. Стоимость хранения 10 GB на S3 — около $0.23/мес. Стоимость потери данных без бэкапа — непредсказуема.
Правило 3-2-1
- 3 копии данных
- 2 разных носителя/хранилища
- 1 копия offsite (другая локация или облако)
Что нужно бэкапить
- База данных (обновляется чаще всего — критически важно)
- Загруженные пользователями файлы (uploads/, storage/)
- Конфигурационные файлы (.env, nginx.conf)
- Код сайта (обычно уже в Git — дополнительный бэкап не нужен)
Автоматический бэкап БД на S3
#!/bin/bash
# /opt/scripts/backup-db.sh
set -euo pipefail
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="mysite_prod"
BACKUP_DIR="/tmp/backups"
S3_BUCKET="s3://my-backups/database"
mkdir -p "$BACKUP_DIR"
# PostgreSQL
pg_dump -U postgres -d "$DB_NAME" -F custom \
| gzip > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz"
# Загрузка на S3
aws s3 cp "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz" \
"${S3_BUCKET}/${DB_NAME}_${DATE}.dump.gz" \
--storage-class STANDARD_IA
# Удаление локального файла
rm "$BACKUP_DIR/${DB_NAME}_${DATE}.dump.gz"
# Удаление бэкапов старше 30 дней
aws s3 ls "${S3_BUCKET}/" \
| awk '{print $4}' \
| while read key; do
date=$(echo "$key" | grep -oP '\d{8}')
if [[ $(date -d "$date" +%s) -lt $(date -d "30 days ago" +%s) ]]; then
aws s3 rm "${S3_BUCKET}/${key}"
fi
done
echo "Backup completed: ${DB_NAME}_${DATE}.dump.gz"
# Crontab: бэкап каждые 6 часов
0 */6 * * * /opt/scripts/backup-db.sh >> /var/log/backup.log 2>&1
S3 Lifecycle Policies
{
"Rules": [{
"ID": "BackupRetention",
"Filter": { "Prefix": "database/" },
"Status": "Enabled",
"Transitions": [
{ "Days": 7, "StorageClass": "STANDARD_IA" },
{ "Days": 30, "StorageClass": "GLACIER" }
],
"Expiration": { "Days": 90 }
}]
}
Бэкап файлов (rsync + S3)
# Бэкап uploads/ на S3
aws s3 sync /var/www/mysite/storage/app/public/ \
s3://my-backups/files/ \
--storage-class STANDARD_IA \
--delete # удалять в S3 то, что удалено локально
# Без --delete (безопаснее, но растёт объём)
aws s3 sync /var/www/mysite/uploads/ s3://my-backups/uploads/
Проверка бэкапов (обязательно!)
Бэкап без проверки восстановления — ложная уверенность:
# Ежемесячная проверка восстановления
aws s3 cp s3://my-backups/database/latest.dump.gz /tmp/test-restore.dump.gz
createdb mysite_restore_test
gunzip < /tmp/test-restore.dump.gz | pg_restore -d mysite_restore_test
psql -d mysite_restore_test -c "SELECT COUNT(*) FROM users;" # должно совпасть с production
dropdb mysite_restore_test
Решения для WordPress
# WP-CLI + S3
wp package install wp-cli/db-command --allow-root
wp db export - | gzip | aws s3 cp - s3://my-backups/wp_$(date +%Y%m%d).sql.gz
Настройка автоматического бэкапа с S3-хранилищем — 2–4 часа.







