Written by James McDonald

July 24, 2017

This script run from cron will keep 7 days of backups in S3 overwriting as needed.

Your cron entry will look like
22 18 * * * /path/to/the/script/backup.sh

#!/bin/bash

cd `dirname $0`
DIR_ROOT=/var/www
WEB_DIRS=`ls -1 $DIR_ROOT`
DAY=`date +%a`
DAY_NUM=`date +%u`
BUCKET=mybackupbucket
REGION=ap-northeast-1

for i in $WEB_DIRS
do
echo Checking $DIR_ROOT/${i}
# create a file in each directory that you want to backup
# the script will check for it backing up only the ones you want
if [ -f $DIR_ROOT/${i}/backup -a -d $DIR_ROOT/${i} ]
then
 echo Backup up $DIR_ROOT/${i}
 # the awscli tools can copy from stdin to a bucket so no need to create files locally
 tar --exclude $DIR_ROOT/${i}/tmp -cz $DIR_ROOT/${i} | aws s3 cp - s3://$BUCKET/$DAY_NUM-${i}-$DAY.tar.gz --region $REGION
fi

done

# create a readonly mysql backup user 
MYSQL_USER=myBackupUser
MYSQL_PASS=mySecreteBackupUserPassword2017

DB_HOST=yourdbhost.example.com

# skipdbs is a text file with databases to skip e.g.
# mysql
# information_schema

# don't put a newline after the last db in skipdbs as grep will filter everything
# and no databases will be backed up
DBS=`mysql --host=$DB_HOST -p$MYSQL_PASS -u $MYSQL_USER \
        --skip-column-names \
        -e "show databases;" | \
        awk '{print $1}' | grep -vf skipdbs`

for DB in $DBS
do
echo BACKUP $DB

mysqldump --host=$DB_HOST -p$MYSQL_PASS -u $MYSQL_USER \
        $DB | gzip | aws s3 cp - s3://$BUCKET/$DAY_NUM-$DB-$DAY-db.sql.gz --region $REGION

done

# copy your config and anything else you want to backup
sudo tar -cz /etc | aws s3 cp - s3://$BUCKET/$DAY_NUM-etc-$DAY.tar.gz --region $REGION

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.

You May Also Like…

Squarespace Image Export

To gain continued access to your Squarespace website images after cancelling your subscription you have several...

MySQL 8.x GRANT ALL STATEMENT

-- CREATE CREATE USER 'tgnrestoreuser'@'localhost' IDENTIFIED BY 'AppleSauceLoveBird2024'; GRANT ALL PRIVILEGES ON...

Exetel Opt-Out of CGNAT

If your port forwards and inbound and/or outbound site-to-site VPN's have failed when switching to Exetel due to their...