Website Backups to S3 Storage
Overview
Complete Website Backup Solutions
Backup your websites, including files, databases, and configurations to S3 storage. Supports WordPress, static sites, and custom applications.
Prerequisites
Before You Start
- S3 storage configured with valid credentials
- AWS CLI installed and configured
- Web server access (SSH or local access)
- Database credentials (if applicable)
WordPress Backups
Complete WordPress Backup
Full WordPress Backup Script
Create wordpress_backup.sh:
#!/bin/bash
# Configuration
SITE_NAME="mywebsite"
WP_PATH="/var/www/html"
DB_NAME="wordpress_db"
DB_USER="wp_user"
DB_PASSWORD="wp_password"
S3_BUCKET="website-backups"
BACKUP_DIR="/tmp/wp_backups"
# S3 Configuration
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
# Create backup directory
mkdir -p $BACKUP_DIR
# Create timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Starting WordPress backup for $SITE_NAME..."
# 1. Backup WordPress files
echo "Backing up WordPress files..."
tar -czf "$BACKUP_DIR/${SITE_NAME}_files_${TIMESTAMP}.tar.gz" -C "$WP_PATH" .
# 2. Backup WordPress database
echo "Backing up WordPress database..."
mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME | gzip > "$BACKUP_DIR/${SITE_NAME}_db_${TIMESTAMP}.sql.gz"
# 3. Create combined backup
echo "Creating combined backup..."
tar -czf "$BACKUP_DIR/${SITE_NAME}_complete_${TIMESTAMP}.tar.gz" \
-C "$BACKUP_DIR" \
"${SITE_NAME}_files_${TIMESTAMP}.tar.gz" \
"${SITE_NAME}_db_${TIMESTAMP}.sql.gz"
# 4. Upload to S3
echo "Uploading to S3..."
aws s3 cp "$BACKUP_DIR/${SITE_NAME}_complete_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/wordpress/$SITE_NAME/" \
--endpoint-url https://eu-west-1.euronodes.com
# 5. Upload individual components
aws s3 cp "$BACKUP_DIR/${SITE_NAME}_files_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/wordpress/$SITE_NAME/files/" \
--endpoint-url https://eu-west-1.euronodes.com
aws s3 cp "$BACKUP_DIR/${SITE_NAME}_db_${TIMESTAMP}.sql.gz" \
"s3://$S3_BUCKET/wordpress/$SITE_NAME/database/" \
--endpoint-url https://eu-west-1.euronodes.com
# 6. Clean up local files
rm "$BACKUP_DIR/${SITE_NAME}_files_${TIMESTAMP}.tar.gz"
rm "$BACKUP_DIR/${SITE_NAME}_db_${TIMESTAMP}.sql.gz"
rm "$BACKUP_DIR/${SITE_NAME}_complete_${TIMESTAMP}.tar.gz"
echo "WordPress backup completed: ${SITE_NAME}_complete_${TIMESTAMP}.tar.gz"
WordPress Files Only Backup
Files-Only WordPress Backup
Create wordpress_files_backup.sh:
#!/bin/bash
# Configuration
SITE_NAME="mywebsite"
WP_PATH="/var/www/html"
S3_BUCKET="website-backups"
# S3 Configuration
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
# Create timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Backing up WordPress files for $SITE_NAME..."
# Backup WordPress files excluding cache and temporary files
tar -czf "/tmp/${SITE_NAME}_files_${TIMESTAMP}.tar.gz" \
-C "$WP_PATH" \
--exclude="wp-content/cache/*" \
--exclude="wp-content/uploads/cache/*" \
--exclude="*.log" \
.
# Upload to S3
aws s3 cp "/tmp/${SITE_NAME}_files_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/wordpress/$SITE_NAME/files/" \
--endpoint-url https://eu-west-1.euronodes.com
# Clean up
rm "/tmp/${SITE_NAME}_files_${TIMESTAMP}.tar.gz"
echo "Files backup completed: ${SITE_NAME}_files_${TIMESTAMP}.tar.gz"
WordPress Restore
Restore WordPress from S3
Create wordpress_restore.sh:
#!/bin/bash
# Configuration
SITE_NAME="mywebsite"
BACKUP_FILE="mywebsite_complete_20241201_120000.tar.gz"
WP_PATH="/var/www/html"
S3_BUCKET="website-backups"
# Download backup from S3
echo "Downloading backup from S3..."
aws s3 cp "s3://$S3_BUCKET/wordpress/$SITE_NAME/$BACKUP_FILE" ./ \
--endpoint-url https://eu-west-1.euronodes.com
# Extract backup
echo "Extracting backup..."
tar -xzf $BACKUP_FILE
# Extract files and database
tar -xzf "${SITE_NAME}_files_*.tar.gz" -C "$WP_PATH"
gunzip "${SITE_NAME}_db_*.sql.gz"
# Restore database (you'll need to configure database details)
echo "Restore database manually with:"
echo "mysql -u username -p database_name < ${SITE_NAME}_db_*.sql"
# Clean up
rm $BACKUP_FILE
rm "${SITE_NAME}_files_*.tar.gz"
echo "WordPress restore completed"
Static Website Backups
Static Site Backup
Static Website Backup Script
Create static_site_backup.sh:
#!/bin/bash
# Configuration
SITE_NAME="mystaticsite"
SITE_PATH="/var/www/html"
S3_BUCKET="website-backups"
# S3 Configuration
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
# Create timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Backing up static site: $SITE_NAME..."
# Create backup
tar -czf "/tmp/${SITE_NAME}_${TIMESTAMP}.tar.gz" -C "$SITE_PATH" .
# Upload to S3
aws s3 cp "/tmp/${SITE_NAME}_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/static-sites/$SITE_NAME/" \
--endpoint-url https://eu-west-1.euronodes.com
# Also sync files directly for easy browsing
aws s3 sync "$SITE_PATH" "s3://$S3_BUCKET/static-sites/$SITE_NAME/current/" \
--endpoint-url https://eu-west-1.euronodes.com \
--delete
# Clean up
rm "/tmp/${SITE_NAME}_${TIMESTAMP}.tar.gz"
echo "Static site backup completed: ${SITE_NAME}_${TIMESTAMP}.tar.gz"
Hugo/Jekyll Site Backup
Static Site Generator Backup
Create hugo_backup.sh:
#!/bin/bash
# Configuration
SITE_NAME="myblog"
SOURCE_PATH="/home/user/myblog"
PUBLIC_PATH="/home/user/myblog/public"
S3_BUCKET="website-backups"
# S3 Configuration
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
# Create timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Backing up Hugo/Jekyll site: $SITE_NAME..."
# Backup source files (markdown, config, themes)
tar -czf "/tmp/${SITE_NAME}_source_${TIMESTAMP}.tar.gz" \
-C "$SOURCE_PATH" \
--exclude="public/*" \
--exclude="node_modules/*" \
--exclude=".git/*" \
.
# Backup generated site
tar -czf "/tmp/${SITE_NAME}_public_${TIMESTAMP}.tar.gz" -C "$PUBLIC_PATH" .
# Upload source backup
aws s3 cp "/tmp/${SITE_NAME}_source_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/static-generators/$SITE_NAME/source/" \
--endpoint-url https://eu-west-1.euronodes.com
# Upload public backup
aws s3 cp "/tmp/${SITE_NAME}_public_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/static-generators/$SITE_NAME/public/" \
--endpoint-url https://eu-west-1.euronodes.com
# Clean up
rm "/tmp/${SITE_NAME}_source_${TIMESTAMP}.tar.gz"
rm "/tmp/${SITE_NAME}_public_${TIMESTAMP}.tar.gz"
echo "Hugo/Jekyll backup completed"
Application Backups
Node.js Application Backup
Node.js App Backup Script
Create nodejs_backup.sh:
#!/bin/bash
# Configuration
APP_NAME="myapp"
APP_PATH="/var/www/myapp"
S3_BUCKET="website-backups"
# S3 Configuration
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
# Create timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Backing up Node.js application: $APP_NAME..."
# Backup application files (excluding node_modules)
tar -czf "/tmp/${APP_NAME}_${TIMESTAMP}.tar.gz" \
-C "$APP_PATH" \
--exclude="node_modules/*" \
--exclude="logs/*" \
--exclude="tmp/*" \
.
# Upload to S3
aws s3 cp "/tmp/${APP_NAME}_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/nodejs/$APP_NAME/" \
--endpoint-url https://eu-west-1.euronodes.com
# Backup package.json separately for quick reference
aws s3 cp "$APP_PATH/package.json" \
"s3://$S3_BUCKET/nodejs/$APP_NAME/package-json/" \
--endpoint-url https://eu-west-1.euronodes.com
# Clean up
rm "/tmp/${APP_NAME}_${TIMESTAMP}.tar.gz"
echo "Node.js backup completed: ${APP_NAME}_${TIMESTAMP}.tar.gz"
PHP Application Backup
PHP Application Backup
Create php_backup.sh:
#!/bin/bash
# Configuration
APP_NAME="myphpapp"
APP_PATH="/var/www/html"
DB_NAME="app_database"
DB_USER="app_user"
DB_PASSWORD="app_password"
S3_BUCKET="website-backups"
# S3 Configuration
export AWS_ACCESS_KEY_ID="YOUR_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="YOUR_SECRET_KEY"
# Create timestamp
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo "Backing up PHP application: $APP_NAME..."
# Backup application files
tar -czf "/tmp/${APP_NAME}_files_${TIMESTAMP}.tar.gz" \
-C "$APP_PATH" \
--exclude="cache/*" \
--exclude="logs/*" \
--exclude="vendor/*" \
.
# Backup database
mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME | \
gzip > "/tmp/${APP_NAME}_db_${TIMESTAMP}.sql.gz"
# Upload files
aws s3 cp "/tmp/${APP_NAME}_files_${TIMESTAMP}.tar.gz" \
"s3://$S3_BUCKET/php/$APP_NAME/files/" \
--endpoint-url https://eu-west-1.euronodes.com
# Upload database
aws s3 cp "/tmp/${APP_NAME}_db_${TIMESTAMP}.sql.gz" \
"s3://$S3_BUCKET/php/$APP_NAME/database/" \
--endpoint-url https://eu-west-1.euronodes.com
# Clean up
rm "/tmp/${APP_NAME}_files_${TIMESTAMP}.tar.gz"
rm "/tmp/${APP_NAME}_db_${TIMESTAMP}.sql.gz"
echo "PHP application backup completed"
Automated Scheduling
Cron Jobs for Website Backups
Schedule Website Backups
# Edit crontab
crontab -e
# Daily WordPress backup at 1 AM
0 1 * * * /path/to/wordpress_backup.sh >> /var/log/wp_backup.log 2>&1
# Weekly static site backup on Sundays at 2 AM
0 2 * * 0 /path/to/static_site_backup.sh >> /var/log/static_backup.log 2>&1
# Daily application backup at 3 AM
0 3 * * * /path/to/nodejs_backup.sh >> /var/log/app_backup.log 2>&1
Backup Rotation
Manage Backup Retention
Add to your backup scripts:
# Clean up old backups (keep last 30 days)
echo "Cleaning up old backups..."
aws s3 ls "s3://$S3_BUCKET/wordpress/$SITE_NAME/" --endpoint-url https://eu-west-1.euronodes.com | \
while read -r line; do
createDate=$(echo $line | awk '{print $1" "$2}')
createDate=$(date -d "$createDate" +%s)
olderThan=$(date -d "30 days ago" +%s)
if [[ $createDate -lt $olderThan ]]; then
fileName=$(echo $line | awk '{print $4}')
if [[ $fileName != "" ]]; then
aws s3 rm "s3://$S3_BUCKET/wordpress/$SITE_NAME/$fileName" \
--endpoint-url https://eu-west-1.euronodes.com
echo "Deleted old backup: $fileName"
fi
fi
done
Monitoring and Verification
Backup Health Check
Verify Backup Integrity
Create backup_health_check.sh:
#!/bin/bash
# Configuration
S3_BUCKET="website-backups"
SITES=("mywebsite" "mystaticsite" "myapp")
# Check if backups exist for today
for site in "${SITES[@]}"; do
echo "Checking backups for $site..."
backup_count=$(aws s3 ls "s3://$S3_BUCKET/wordpress/$site/" \
--endpoint-url https://eu-west-1.euronodes.com | \
grep "$(date +%Y%m%d)" | wc -l)
if [ $backup_count -gt 0 ]; then
echo "✓ Backup found for $site"
else
echo "✗ No backup found for $site today"
# Send alert
echo "Missing backup for $site" | \
mail -s "Backup Alert - $site" [email protected]
fi
done
FAQ
How often should I backup my website?
For active websites, daily backups are recommended. Static sites may only need weekly backups.
Should I backup the entire server or just the website?
Focus on website files and databases. System files can be recreated, but your content cannot.
How do I backup large media files efficiently?
Use S3 sync for large media directories, and exclude them from compressed backups.
Can I automate WordPress plugin updates with backups?
Yes, create a script that backs up before updates and can rollback if needed.
What about SSL certificates and server configurations?
Include server configs in your backup strategy, especially for custom configurations.
Contact Support
Need Help?
- Backup Issues: Open support ticket through client portal
- Website Problems: Include site type and error messages
- Automation Help: Specify your platform and requirements
For S3 setup, see S3 Configuration | For database backups, see Database Backups