Skip to content

Instantly share code, notes, and snippets.

@yusufhm
Last active June 20, 2020 02:12
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 yusufhm/7985b6aee1228db90289 to your computer and use it in GitHub Desktop.
Save yusufhm/7985b6aee1228db90289 to your computer and use it in GitHub Desktop.
Bash scripts to backup databases & files for Drupal sites. Adapted from scripts originally written by Joseph Chin.
#!/usr/bin/env bash
WEBSITES_ROOT=/var/www
BACKUP_ROOT=/var/backups/websites
# Checks to see if arguments are provided
if [ $2 ]
then
BUCKET=$2
else
echo "Missing arguments. Format is 'db_backup.sh {website} {bucket}"
exit
fi
if [ $1 ]
then
WEBSITE=$1
else
echo "Missing arguments. Format is 'db_backup.sh {website} {bucket}"
exit
fi
FOLDER=$WEBSITE"_db"
TIME_STAMP=`eval date +%Y%m%d-%H%M`
BACKUP_FILE=$BACKUP_ROOT/$WEBSITE'_'$TIME_STAMP'.sql'
BACKUP_FILE_S3=$BUCKET/$WEBSITE"_db"/$WEBSITE'_'$TIME_STAMP'.sql.gz'
echo $WEBSITE" backup started at "$TIME_STAMP
# PERFORM sqldump using drush
cd $WEBSITES_ROOT/$WEBSITE/php
echo "Performing MySQL Dump..."
drush sql-dump --gzip --result-file=$BACKUP_FILE
if [ $? -eq 0 ]; then
s3cmd -c /etc/.s3cfg put $BACKUP_FILE'.gz' $BACKUP_FILE_S3
if [ $? -ne 0 ]; then
echo "Upload to S3 failed!"
else
rm $BACKUP_FILE'.gz'
fi
else
echo "sqldump failed!"
fi
END_TIME_STAMP=`eval date +%Y%m%d-%H%M`
echo $WEBSITE" backup finished at "$END_TIME_STAMP
#!/usr/bin/env bash
WEBSITES_ROOT=/var/www
BACKUP_ROOT=/var/backups/websites
# Checks to see if arguments are provided
if [ $2 ]
then
BUCKET=$2
else
echo "Missing arguments. Format is 'file_backup.sh {website} {bucket}"
exit
fi
if [ $1 ]
then
WEBSITE=$1
else
echo "Missing arguments. Format is 'file_backup.sh {website} {bucket}"
exit
fi
TIME_STAMP=`eval date +%Y%m%d-%H%M`
DATE_MONTH=`eval date +%Y%m`
MONTHLY_FILE=$BACKUP_ROOT/$WEBSITE'_'$DATE_MONTH'.tar.gz'
MONTHLY_FILE_S3=$BUCKET/$WEBSITE"_files"/$WEBSITE'_'$DATE_MONTH'.tar.gz'
INCREMENTAL_FILE=$BACKUP_ROOT/$WEBSITE'_'$TIME_STAMP'.tar.gz'
INCREMENTAL_FILE_S3=$BUCKET/$WEBSITE"_files"/$WEBSITE'_'$TIME_STAMP'.tar.gz'
INCREMENTAL_SNAPSHOT_FILE=$BACKUP_ROOT/$WEBSITE'_'$DATE_MONTH'.snar'
INCREMENTAL_SNAPSHOT_FILE_S3=$BUCKET/$WEBSITE"_files"/$WEBSITE'_'$DATE_MONTH'.snar'
# if monthly file does not exist on S3,
# create full backup and upload it along with the incremental file
# else retrieve the snapshot file from S3,
# create the incremental file & upload
ONLINE_MONTHLY_FILE_S3=`s3cmd -c /etc/.s3cfg ls $MONTHLY_FILE_S3`
BACKUP_FILE=''
BACKUP_FILE_S3=''
if [ -z "$ONLINE_MONTHLY_FILE_S3" ]; then
echo 'Creating full monthly backup since none exists'
tar --create \
--gzip \
--file=$MONTHLY_FILE \
--listed-incremental=$INCREMENTAL_SNAPSHOT_FILE \
--dereference \
$WEBSITES_ROOT/$WEBSITE/php/sites/default/files
if [ $? -eq 0 ]; then
BACKUP_FILE=$MONTHLY_FILE
BACKUP_FILE_S3=$MONTHLY_FILE_S3
fi
else
echo 'Creating incremental backup since monthly already exists'
echo 'Downloading snapshot file from S3'
s3cmd -c /etc/.s3cfg get $INCREMENTAL_SNAPSHOT_FILE_S3 $INCREMENTAL_SNAPSHOT_FILE
if [ $? -eq 0 ]; then
tar --create \
--gzip \
--file=$INCREMENTAL_FILE \
--listed-incremental=$INCREMENTAL_SNAPSHOT_FILE \
--dereference \
$WEBSITES_ROOT/$WEBSITE/php/sites/default/files
if [ $? -eq 0 ]; then
BACKUP_FILE=$INCREMENTAL_FILE
BACKUP_FILE_S3=$INCREMENTAL_FILE_S3
fi
fi
fi
# if there's a backup file to upload, do it now
if [ -n $BACKUP_FILE ]; then
# upload backup file
echo 'Uploading backup file to S3'
s3cmd -c /etc/.s3cfg put $BACKUP_FILE $BACKUP_FILE_S3
if [ $? -ne 0 ]; then
echo 'Upload to S3 failed; please upload manually to ensure backups are safe'
else
# upload snapshot file
echo 'Uploading snapshot file to S3'
s3cmd -c /etc/.s3cfg put $INCREMENTAL_SNAPSHOT_FILE $INCREMENTAL_SNAPSHOT_FILE_S3
if [ $? -ne 0 ]; then
echo 'Could not upload snapshot file to S3'
else
# remove local files after all uploads are successful
rm $INCREMENTAL_SNAPSHOT_FILE
rm $BACKUP_FILE
fi
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment