Налаштування резервного копіювання файлів сайту
Резервна копія файлів сайту відновлює код, завантажені медіа, конфігурації після збою або випадкового видалення. Для коду достатньо git-репозиторію - не потрібно окремо включати вихідники в резервну копію.
Що резервувати
Потрібно: завантажені користувачами файли (uploads/), SSL-сертифікати (якщо не Let's Encrypt), користувацькі конфігурації поза репозиторієм.
Не потрібно: код з git, node_modules, vendor, кеш програми, тимчасові файли.
rsync + SSH в S3/віддалений сервер
#!/bin/bash
SOURCE="/var/www/myapp/storage/app/uploads"
BACKUP_HOST="backup.example.com"
BACKUP_PATH="/backups/myapp/files"
TIMESTAMP=$(date +%Y-%m-%d)
rsync -avz \
--link-dest="${BACKUP_PATH}/latest" \
--exclude="*.tmp" \
-e "ssh -i /root/.ssh/backup_key" \
"${SOURCE}/" \
"${BACKUP_USER}@${BACKUP_HOST}:${BACKUP_PATH}/${TIMESTAMP}/"
ssh -i /root/.ssh/backup_key "${BACKUP_USER}@${BACKUP_HOST}" \
"ln -sfn '${BACKUP_PATH}/${TIMESTAMP}' '${BACKUP_PATH}/latest'"
Синхронізація AWS S3
aws s3 sync /var/www/myapp/storage/app/uploads/ \
s3://myapp-backups/files/uploads/ \
--delete \
--exclude "*.tmp" \
--storage-class STANDARD_IA
aws s3api put-bucket-lifecycle-configuration \
--bucket myapp-backups \
--lifecycle-configuration file://lifecycle.json
{
"Rules": [{
"ID": "delete-old-backups",
"Filter": { "Prefix": "files/" },
"Status": "Enabled",
"Expiration": { "Days": 90 }
}]
}
Расписання crontab
30 3 * * * /usr/local/bin/files-backup.sh >> /var/log/files-backup.log 2>&1
Обсяг зберігання та вартість
При 10 GB uploads з щоденною інкрементальною резервною копією (rsync --link-dest): додається тільки обсяг змін. В S3 STANDARD_IA: ~$0.013/GB/місяць. 90 днів 10 GB ≈ $1.2/місяць.
Тривалість реалізації
Налаштування rsync або S3-синхронізації файлів з ротацією та cron: 0.5–1 день.







