Created
May 26, 2017 23:24
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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