├── README.md ├── no-wp-cli.sh ├── wp-cli-backup-amazon-s3.sh ├── wp-cli-backup-dropbox.sh └── wp-cli-backup-gdrive.sh /README.md: -------------------------------------------------------------------------------- 1 | # Backup WordPress without a Plugin 2 | Wordpress backup scripts to Dropbox, Google Drive, Amazon S3 using [WP-CLI](http://wp-cli.org/) and bash 3 | 4 | ## Guides on Usage 5 | * [Google Drive Guide](https://guides.wp-bullet.com/automatically-back-wordpress-google-drive-wp-cli-bash-script/) 6 | * [Dropbox Guide](https://guides.wp-bullet.com/automatically-back-wordpress-dropbox-wp-cli-bash-script/) 7 | -------------------------------------------------------------------------------- /no-wp-cli.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Purpose: WordPress staging for Apache 3 | # Source: https://guides.wp-bullet.com 4 | # Adapted 5 | # Author: Mike 6 | 7 | # define WordPress path and wp-config.php file 8 | WPPATH="/var/www/domain.com" 9 | WPCONFIG="$WPPATH/wp-config.php" 10 | 11 | # extract database host and credentials 12 | DBHOST=$(grep DB_HOST "$WPCONFIG" | awk -F ["'"] '{ print $4 }') 13 | DBUSER=$(grep DB_USER "$WPCONFIG" | awk -F ["'"] '{ print $4 }') 14 | DBPASS=$(grep DB_PASSWORD "$WPCONFIG" | awk -F ["'"] '{ print $4 }') 15 | DBNAME=$(grep DB_NAME "$WPCONFIG" | awk -F ["'"] '{ print $4 }') 16 | 17 | # mysqldump optimized for speed and gzip 18 | mysqldump -h "$DBHOST" -u "$DBUSER" -p"$DBPASS" "$DBNAME" --single-transaction --quick --lock-tables=false | gzip > /tmp/latest.sql.gz 19 | -------------------------------------------------------------------------------- /wp-cli-backup-amazon-s3.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # WP-CLI Back up Script to Amazon S3 3 | # Source: https://guides.wp-bullet.com 4 | # Author: Mike 5 | 6 | #define local path for backups 7 | BACKUPPATH=/tmp/backups 8 | 9 | #path to WordPress installations 10 | SITESTORE=/var/www 11 | 12 | #S3 bucket 13 | S3DIR="s3://bucket-name/backups" 14 | 15 | #date prefix 16 | DATEFORM=$(date +"%Y-%m-%d") 17 | 18 | #Days to retain 19 | DAYSKEEP=7 20 | 21 | #calculate days as filename prefix 22 | DAYSKEPT=$(date +"%Y-%m-%d" -d "-$DAYSKEEP days") 23 | 24 | #create array of sites based on folder names 25 | SITELIST=($(ls -lh $SITESTORE | awk '{print $9}')) 26 | 27 | #make sure the backup folder exists 28 | mkdir -p $BACKUPPATH 29 | 30 | #start the loop 31 | for SITE in ${SITELIST[@]}; do 32 | echo Backing up $SITE 33 | #enter the WordPress folder 34 | #cd $SITESTORE/$SITE 35 | if [ ! -e $BACKUPPATH/$SITE ]; then 36 | mkdir $BACKUPPATH/$SITE 37 | fi 38 | 39 | #back up the WordPress folder 40 | tar -czf $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz $SITESTORE/$SITE 41 | 42 | #back up the WordPress database 43 | wp db export $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql --path=$SITESTORE/$SITE --single-transaction --quick --lock-tables=false --allow-root --skip-themes --skip-plugins 44 | cat $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql | gzip > $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz 45 | rm $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql 46 | 47 | #upload packages 48 | S3DIRUP=$S3DIR/$SITE/$DATE 49 | aws s3 mv $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz $S3DIR 50 | aws s3 mv $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz $S3DIR 51 | 52 | #delete old backups 53 | S3REM=$S3DIR/ 54 | aws s3 rm $S3REM/$DAYSKEPT 55 | done 56 | 57 | #if you want to delete all local backups 58 | #rm -rf $BACKUPPATH/* 59 | 60 | #delete old backups locally over DAYSKEEP days old 61 | find $BACKUPPATH -type d -mtime +$DAYSKEEP -exec rm -rf {} \; 62 | 63 | #Fix permissions 64 | sudo chown -R www-data:www-data $SITESTORE 65 | sudo find $SITESTORE -type f -exec chmod 644 {} + 66 | sudo find $SITESTORE -type d -exec chmod 755 {} + 67 | -------------------------------------------------------------------------------- /wp-cli-backup-dropbox.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Source: https://guides.wp-bullet.com 3 | # Author: Mike 4 | 5 | #define local path for backups 6 | BACKUPPATH=/tmp/backups 7 | 8 | #path to WordPress installations 9 | SITESTORE=/var/www 10 | 11 | #date prefix 12 | DATEFORM=$(date +"%Y-%m-%d") 13 | 14 | #Days to retain 15 | DAYSKEEP=7 16 | 17 | #calculate days as filename prefix 18 | DAYSKEPT=$(date +"%Y-%m-%d" -d "-$DAYSKEEP days") 19 | 20 | #create array of sites based on folder names 21 | SITELIST=($(ls -d $SITESTORE/* | awk -F '/' '{print $NF}')) 22 | 23 | #make sure the backup folder exists 24 | mkdir -p $BACKUPPATH 25 | 26 | #start the loop 27 | for SITE in ${SITELIST[@]}; do 28 | #check if there are old backups and delete them 29 | EXISTS=$(dropbox_uploader list /$SITE | grep -E $DAYSKEPT.*.tar.gz | awk '{print $3}') 30 | if [ ! -z $EXISTS ]; then 31 | dropbox_uploader delete /$SITE/$DAYSKEPT-$SITE.tar.gz /$SITE/ 32 | dropbox_uploader delete /$SITE/$DAYSKEPT-$SITE.sql.gz /$SITE/ 33 | fi 34 | echo Backing up $SITE 35 | #enter the WordPress folder 36 | cd $SITESTORE/$SITE 37 | if [ ! -e $BACKUPPATH/$SITE ]; then 38 | mkdir $BACKUPPATH/$SITE 39 | fi 40 | 41 | #back up the WordPress folder 42 | tar -czf $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz . 43 | 44 | #back up the WordPress database 45 | wp db export $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql --all-tablespaces --single-transaction --quick --lock-tables=false --allow-root --skip-themes --skip-plugins 46 | cat $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql | gzip > $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz 47 | rm $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql 48 | 49 | #upload packages 50 | dropbox_uploader upload $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz /$SITE/ 51 | dropbox_uploader upload $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz /$SITE/ 52 | done 53 | 54 | #if you want to delete all local backups 55 | #rm -rf $BACKUPPATH/* 56 | 57 | #delete old backups locally over DAYSKEEP days old 58 | find $BACKUPPATH -type d -mtime +$DAYSKEEP -exec rm -rf {} \; 59 | 60 | #Fix permissions 61 | sudo chown -R www-data:www-data $SITESTORE 62 | sudo find $SITESTORE -type f -exec chmod 644 {} + 63 | sudo find $SITESTORE -type d -exec chmod 755 {} + 64 | -------------------------------------------------------------------------------- /wp-cli-backup-gdrive.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Source: https://guides.wp-bullet.com 3 | # Author: Mike 4 | 5 | #define local path for backups 6 | BACKUPPATH="/tmp/backups" 7 | 8 | #define remote backup path 9 | BACKUPPATHREM="WP-Bullet-Backups" 10 | 11 | #path to WordPress installations 12 | SITESTORE="/var/www" 13 | 14 | #date prefix 15 | DATEFORM=$(date +"%Y-%m-%d") 16 | 17 | #Days to retain 18 | DAYSKEEP=7 19 | 20 | #calculate days as filename prefix 21 | DAYSKEPT=$(date +"%Y-%m-%d" -d "-$DAYSKEEP days") 22 | 23 | #create array of sites based on folder names 24 | SITELIST=($(ls -d $SITESTORE/* | awk -F '/' '{print $NF}')) 25 | 26 | #make sure the backup folder exists 27 | mkdir -p $BACKUPPATH 28 | 29 | #check remote backup folder exists on gdrive 30 | BACKUPSID=$(gdrive list --no-header | grep $BACKUPPATHREM | grep dir | awk '{ print $1}') 31 | if [ -z "$BACKUPSID" ]; then 32 | gdrive mkdir $BACKUPPATHREM 33 | BACKUPSID=$(gdrive list --no-header | grep $BACKUPPATHREM | grep dir | awk '{ print $1}') 34 | fi 35 | 36 | #start the loop 37 | for SITE in ${SITELIST[@]}; do 38 | #delete old backup, get folder id and delete if exists 39 | OLDBACKUP=$(gdrive list --no-header | grep $DAYSKEPT-$SITE | grep dir | awk '{ print $1}') 40 | if [ ! -z "$OLDBACKUP" ]; then 41 | gdrive delete $OLDBACKUP 42 | fi 43 | 44 | # create the local backup folder if it doesn't exist 45 | if [ ! -e $BACKUPPATH/$SITE ]; then 46 | mkdir $BACKUPPATH/$SITE 47 | fi 48 | 49 | #entire the WordPress folder 50 | cd $SITESTORE/$SITE 51 | 52 | #back up the WordPress folder 53 | tar -czf $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz . 54 | #back up the WordPress database, compress and clean up 55 | wp db export $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql --all-tablespaces --single-transaction --quick --lock-tables=false --allow-root --skip-themes --skip-plugins 56 | cat $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql | gzip > $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz 57 | rm $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql 58 | 59 | #get current folder ID 60 | SITEFOLDERID=$(gdrive list --no-header | grep $SITE | grep dir | awk '{ print $1}') 61 | 62 | #create folder if doesn't exist 63 | if [ -z "$SITEFOLDERID" ]; then 64 | gdrive mkdir --parent $BACKUPSID $SITE 65 | SITEFOLDERID=$(gdrive list --no-header | grep $SITE | grep dir | awk '{ print $1}') 66 | fi 67 | 68 | #upload WordPress tar 69 | gdrive upload --parent $SITEFOLDERID --delete $BACKUPPATH/$SITE/$DATEFORM-$SITE.sql.gz 70 | #upload wordpress database 71 | gdrive upload --parent $SITEFOLDERID --delete $BACKUPPATH/$SITE/$DATEFORM-$SITE.tar.gz 72 | done 73 | 74 | #Fix permissions 75 | sudo chown -R www-data:www-data $SITESTORE 76 | sudo find $SITESTORE -type f -exec chmod 644 {} + 77 | sudo find $SITESTORE -type d -exec chmod 755 {} + 78 | --------------------------------------------------------------------------------