Skip to content

Instantly share code, notes, and snippets.

@liuyigh
Last active April 18, 2022 14:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save liuyigh/0a02c8419b78057b45d1836d73ad205e to your computer and use it in GitHub Desktop.
Save liuyigh/0a02c8419b78057b45d1836d73ad205e to your computer and use it in GitHub Desktop.
Automatically Back up WordPress to Google Drive with Bash Script. Adapted frpm Mike@wp-bullet.com for serverpilot server.
#!/usr/bin/env bash
# Source: https://guides.wp-bullet.com
# Author: Mike
# Editted by Yi Liu (http://liuyi.co).
# Changes: packup path, site path, use find wp-admin to skip non-wp apps, removed permission lines.
# Run this as user serverpilot
#define local path for backups
BACKUPPATH="/srv/users/serverpilot/bak/tmp"
#define remote backup path
BACKUPPATHREM="gBackup"
#path to WordPress installations, no trailing slash
SITESTORE="/srv/users/serverpilot/apps"
#date prefix
DATEFORM=$(date +"%Y-%m-%d")
#Days to retain
DAYSKEEP=7
#calculate days as filename prefix
DAYSKEPT=$(date +"%Y-%m-%d" -d "-$DAYSKEEP days")
#create array of sites based on folder names
for site_path in $( cd $SITESTORE ; find . -mindepth 3 -maxdepth 3 -type d -name 'wp-admin' | sort -n | cut -d / -f 2 ); do
SITELIST="${SITELIST} ${site_path}"
done
#make sure the backup folder exists
mkdir -p $BACKUPPATH
#check remote backup folder exists on gdrive
BACKUPSID=$(gdrive list --no-header | grep $BACKUPPATHREM | grep dir | awk '{ print $1}')
if [ -z "$BACKUPSID" ]; then
gdrive mkdir $BACKUPPATHREM
BACKUPSID=$(gdrive list --no-header | grep $BACKUPPATHREM | grep dir | awk '{ print $1}')
fi
#start the loop
for SITE in ${SITELIST[@]}; do
#delete old backup, get folder id and delete if exists
OLDBACKUP=$(gdrive list --no-header | grep $DAYSKEPT-$SITE | grep dir | awk '{ print $1}')
if [ ! -z "$OLDBACKUP" ]; then
gdrive delete $OLDBACKUP
fi
# create the local backup folder if it doesn't exist
if [ ! -e $BACKUPPATH/$SITE ]; then
mkdir $BACKUPPATH/$SITE
fi
#enter the WordPress folder
cd $SITESTORE/$SITE
#back up the WordPress folder
tar -czf $BACKUPPATH/$SITENAME/$SITE/$DATEFORM-$SITE.tar.gz public
#back up the WordPress database, compress and clean up
cd $SITESTORE/$SITE/public
wp db export $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql --add-drop-table --skip-themes --skip-plugins
cat $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql | gzip > $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz
rm $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql
#get current folder ID
SITEFOLDERID=$(gdrive list --no-header | grep $SITE | grep dir | awk '{ print $1}')
#create folder if doesn't exist
if [ -z "$SITEFOLDERID" ]; then
gdrive mkdir --parent $BACKUPSID $SITE
SITEFOLDERID=$(gdrive list --no-header | grep $SITE | grep dir | awk '{ print $1}')
fi
#upload WordPress tar
gdrive upload --parent $SITEFOLDERID --delete $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz
#upload wordpress database
gdrive upload --parent $SITEFOLDERID --delete $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment