This script backups a WordPress installation (including data,base files & directories, excluding cache) to a bup
remote server running on 10.1.2.3
. You need to ensure passwordless access to that server.
It is based on automated extraction of database host, username & password, see How to grep for WordPress DB_NAME, DB_USER, DB_PASSWORD and DB_HOST in wp-config.php for more details.
#!/bin/bash export NAME=$(basename $(pwd)) export BUP_DIR=/var/bup/$NAME.bup export REMOTE_BUP_DIR=/bup-backups/$NAME.bup export REMOTE_SERVER=10.1.2.3 export BUP_REMOTE=$REMOTE_SERVER:$REMOTE_BUP_DIR # Init bup -d $BUP_DIR init -r $BUP_REMOTE # Save MariaDB dump (extract MariaDB config from wp-config.php) DB_NAME=$(grep -oP "define\(['\"]DB_NAME['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" wp-config.php) DB_USER=$(grep -oP "define\(['\"]DB_USER['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" wp-config.php) DB_PASSWORD=$(grep -oP "define\(['\"]DB_PASSWORD['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" wp-config.php) DB_HOST=$(grep -oP "define\(['\"]DB_HOST['\"],\s*['\"]\K[^'\"]+(?=[\'\"]\s*\)\s*;)" wp-config.php) mysqldump -h$DB_HOST -u$DB_USER -p$DB_PASSWORD $DB_NAME | bup -d $BUP_DIR split -n $NAME-$DB_NAME.sql # Save wordpress directory bup -d $BUP_DIR index --exclude wp-content/cache --exclude wp-content/uploads/cache . && bup save -r $BUP_REMOTE -9 --strip-path $(pwd) -n $NAME . # OPTIONAL: Add par2 information # This is only recommended for backup on unreliable storage or for extremely critical backups # If you already have bitrot protection (like BTRFS with regular scrubbing), this might be overkill. # Uncomment this line to enable: # bup on $REMOTE_SERVER -d $REMOTE_BUP_DIR fsck -g # OPTIONAL: Cleanup old backups bup on $REMOTE_SERVER -d $REMOTE_BUP_DIR prune-older --keep-all-for 1m --keep-dailies-for 6m --keep-monthlies-for forever -9 --unsafe