Skip to content

Instantly share code, notes, and snippets.

@donwilson
Created May 26, 2017 23:24
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save donwilson/4abff2966fe43625d925ee5a44af90c0 to your computer and use it in GitHub Desktop.
Save donwilson/4abff2966fe43625d925ee5a44af90c0 to your computer and use it in GitHub Desktop.
Back up WWW, MySQL DB and separate content folder to S3 using rclone
#!/bin/bash
###
# Backup Script
###
# Toggle debug mode for CLI output - "YES" or "NO"
DEBUG="YES"
# Command locations
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
RCLONE="$(which rclone)"
TAR="$(which tar)"
GZIP="$(which gzip)"
MKDIR="$(which mkdir)"
RM="$(which rm)"
DATE=`$(which date) +%Y%m%d`
# Check if date is correctly calculated
if [ "$DATE" == "" ]; then
if [ "$DEBUG" == "YES" ]; then
echo "Unable to calculate the date";
fi
exit 1
fi
# Backup directory - where .tar.gz of WWW_DIR is stored temporarily
BACKUP_DIR="/root/backup_data"
# Domain name for backup - used on backup archive filenames
BACKUP_DOMAIN_NAME="domain.tld"
# Amazon S3 settings
AWS_S3_BUCKET_WWW=""
AWS_S3_BUCKET_CONTENT=""
# Paths (exclude trailing slash)
WWW_DIR="/path/to/www"
CONTENT_DIR="/path/to/content"
# MySQL settings
MYSQL_HOST=""
MYSQL_USER=""
MYSQL_PASS=""
MYSQL_DATABASE=""
# Rclone options
RCLONE_CONFIG_PATH="/root/.config/rclone/rclone.conf"
RCLONE_OPTIONS="--config $RCLONE_CONFIG_PATH" #RCLONE_OPTIONS="--dry-run --config $RCLONE_CONFIG_PATH"
RCLONE_REMOTE_NAME="remote"
###
# Start the script
###
# Make sure all required applications are installed
if [ "$MYSQLDUMP" == "" ] || [ "$RCLONE" == "" ] || [ "$TAR" == "" ] || [ "$GZIP" == "" ] || [ "$RM" == "" ] || [ "$MKDIR" == "" ]; then
if [ "$DEBUG" == "YES" ]; then
echo "At least one of the required applications does not exist:"
echo " mysqldump: $MYSQLDUMP"
echo " rclone: $RCLONE"
echo " tar: $TAR"
echo " gzip: $GZIP"
echo " mkdir: $MKDIR"
echo " rm: $RM"
fi
exit 1
fi
# Script introduction
if [ "$DEBUG" == "YES" ]; then
echo "Starting $BACKUP_DOMAIN_NAME backup script...";
echo " date: $DATE"
echo " rclone remote: $RCLONE_REMOTE_NAME"
echo " www path: $WWW_DIR"
echo " www bucket: $AWS_S3_BUCKET_WWW"
echo " mysql database: $MYSQL_DATABASE"
echo " content path: $CONTENT_DIR"
echo " content bucket: $AWS_S3_BUCKET_CONTENT"
fi
# Make sure backup directory exists for temporarily storing files generated by this script
if [ ! -d "$BACKUP_DIR" ]; then
if [ "$DEBUG" == "YES" ]; then
echo "Creating backup directory '$BACKUP_DIR'"
fi
$MKDIR -p "$BACKUP_DIR"
if [ ! -d "$BACKUP_DIR" ]; then
if [ "$DEBUG" == "YES" ]; then
echo "Directory '$BACKUP_DIR' doesn't exist and was unable to be created"
fi
exit 1
fi
fi
# MOVE processed MySQL Dump + WWW directory
if [ -d "$WWW_DIR/" ]; then
# MySQL dump
if [ "$DEBUG" == "YES" ]; then
echo "Dumping MySQL database..."
fi
MYSQL_BACKUP_DIR="$WWW_DIR/dev/mysql_data"
if [ ! -d "$MYSQL_BACKUP_DIR" ]; then
$MKDIR -p "$MYSQL_BACKUP_DIR"
fi
if [ "$MYSQL_PASS" != "" ]; then
MYSQL_CONNECTION_OPTIONS="--host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS"
else
MYSQL_CONNECTION_OPTIONS="--host=$MYSQL_HOST --user=$MYSQL_USER"
fi
for MYSQL_TABLE_NAME in `$MYSQL $MYSQL_CONNECTION_OPTIONS -D$MYSQL_DATABASE -N -B -e 'show tables'`; do
$MYSQLDUMP $MYSQL_CONNECTION_OPTIONS --opt $MYSQL_DATABASE $MYSQL_TABLE_NAME | $GZIP -c > "$MYSQL_BACKUP_DIR/$MYSQL_DATABASE.$MYSQL_TABLE_NAME.sql.gz"
done
if [ "$DEBUG" == "YES" ]; then
echo "Done!"
fi
# Backup WWW directory
if [ "$DEBUG" == "YES" ]; then
echo "Creating backup file of WWW directory..."
fi
BACKUP_FILE_WWW_PATH="$BACKUP_DIR/$BACKUP_DOMAIN_NAME.$DATE.tar.gz"
$TAR -czf "$BACKUP_FILE_WWW_PATH" "$WWW_DIR/" --exclude "$CONTENT_DIR"
if [ "$DEBUG" == "YES" ]; then
echo "Done!"
fi
if [ -f "$BACKUP_FILE_WWW_PATH" ]; then
if [ "$DEBUG" == "YES" ]; then
echo "Uploading www file..."
fi
RCLONE_WWW_DEST="$RCLONE_REMOTE_NAME:$AWS_S3_BUCKET_WWW"
$RCLONE $RCLONE_OPTIONS move "$BACKUP_FILE_WWW_PATH" $RCLONE_WWW_DEST
# Remove backup file of WWW folder if rclone didn't delete it
if [ -f "$BACKUP_FILE_WWW_PATH" ]; then
$RM -f "$BACKUP_FILE_WWW_PATH"
fi
if [ "$DEBUG" == "YES" ]; then
echo "Done!"
fi
fi
fi
# SYNC content directory
if [ -d "$CONTENT_DIR/" ]; then
if [ "$DEBUG" == "YES" ]; then
echo "Syncing content directory..."
fi
RCLONE_CONTENT_DEST="$RCLONE_REMOTE_NAME:$AWS_S3_BUCKET_CONTENT"
$RCLONE $RCLONE_OPTIONS sync "$CONTENT_DIR" $RCLONE_CONTENT_DEST
if [ "$DEBUG" == "YES" ]; then
echo "Done!"
fi
fi
if [ "$DEBUG" == "YES" ]; then
echo "Script finished!"
fi
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment