#!/usr/bin/env bash # WP-CLI Back up Script to Amazon S3 # Source: https://www.jonathan.vc # Author: Jonathan Dingman # Adapted from Mike at WP Bullet #define local path for backups BACKUPPATH=/tmp/backups #path to WordPress installations SITESBASE=/var/www #S3 bucket S3DIR="s3://yourbucketname" #date prefix DATEFORM=$(date +"%Y-%m-%d") #Days to retain DAYSKEEP=7 # Alternate DB Host - useful if you have a high availability setup and want to leverage a read-only user, instead of the Writer. ALTDBHOST="yourdatabase.rds.amazonaws.com" # completely optional, in my use-case, it made sense. #calculate days as filename prefix DAYSKEPT=$(date +"%Y-%m-%d" -d "-$DAYSKEEP days") # Create array() of domains listed in $SITESBASE SITELIST=() for DIR in "$SITESBASE"/*/ ; do DIR2=${DIR%/} # Remove the trailing / DIR3=${DIR2##*/} # Remove everything up to, and including, the last / if [[ ${DIR3} = *"."* ]]; then # Only add strings that have a period in them (ex: domain names) SITELIST+=( "$DIR3" ) fi done #make sure the backup folder exists mkdir -p "$BACKUPPATH" #start the loop for SITE in "${SITELIST[@]}"; do cd "$SITESBASE/$SITE/htdocs" || exit if [ ! -e "$BACKUPPATH/$SITE" ]; then mkdir "$BACKUPPATH/$SITE" fi tar -czf "$BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz" -C "$SITESBASE/$SITE" . wp db export "$BACKUPPATH/$SITE/$DATEFORM-$SITE".sql \ --host="$ALTDBHOST" \ --path="$SITESBASE/$SITE/htdocs" \ --single-transaction \ --quick \ --lock-tables=false \ --allow-root \ --skip-themes \ --skip-plugins < "$BACKUPPATH/$SITE/$DATEFORM-$SITE".sql gzip > "$BACKUPPATH/$SITE/$DATEFORM-$SITE".sql.gz rm "$BACKUPPATH/$SITE/$DATEFORM-$SITE".sql S3DIRUP="$S3DIR/$SITE/$DATE" aws s3 mv "$BACKUPPATH/$SITE/$DATEFORM-$SITE".tar.gz "$S3DIRUP" aws s3 mv "$BACKUPPATH/$SITE/$DATEFORM-$SITE".sql.gz "$S3DIRUP" #delete old backups S3REM="$S3DIR/" aws s3 rm "$S3REM/$DAYSKEPT" done #if you want to delete all local backups #rm -rf "${BACKUPPATH:?}/*" #delete old backups locally over DAYSKEEP days old # find "$BACKUPPATH" -type d -mtime +$DAYSKEEP -exec rm -rf {} \;