Setting up website files backup
Website file backup restores code, uploaded media, configurations after failure or accidental deletion. For code, git repository is enough - don't need separate backup.
What to backup
Needed: user-uploaded files (uploads/), SSL certificates (if not Let's Encrypt), custom configs outside repo.
Not needed: code from git, node_modules, vendor, application cache, temp files.
rsync + SSH to S3/remote server
#!/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 synchronization
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 schedule
30 3 * * * /usr/local/bin/files-backup.sh >> /var/log/files-backup.log 2>&1
Storage volume and cost
With 10 GB uploads with daily incremental backup (rsync --link-dest): only change volume is added. In S3 STANDARD_IA: ~$0.013/GB/month. 90 days of 10 GB ≈ $1.2/month.
Implementation Timeline
Setup rsync or S3 sync files with rotation and cron: 0.5–1 day.







