Skip to content

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