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