Skip to content

Instantly share code, notes, and snippets.

@gagan0123
Created January 6, 2022 19:09
Show Gist options
  • Select an option

  • Save gagan0123/654a1d7eb35a5e22ad3a845959ffc376 to your computer and use it in GitHub Desktop.

Select an option

Save gagan0123/654a1d7eb35a5e22ad3a845959ffc376 to your computer and use it in GitHub Desktop.
Backup Script
#!/bin/bash
set -e
export BACKUP_SERVER="{IP of server}"
export BACKUP_SERVER_NAME="{Any-name-you-want-to-give-it}"
export BORG_REPO={borg-repo-path}
export BACKUP_DIR={backup-directory-path}
export BACKUP_USER="root"
export EXCLUDE_DBS=("information_schema" "performance_schema")
# Create backup Directory if it does not exists
[ ! -d "$BACKUP_DIR" ] && mkdir -p "$BACKUP_DIR" && cp excludes.txt $BACKUP_DIR/excludes.txt
# Create borg repo if it does not exists
[ ! -d "$BORG_REPO" ] && borg init -e=none
cd $BACKUP_DIR
# Sync files
echo "Backing up home directory"
rsync --bwlimit=100000 -avz --exclude-from 'excludes.txt' --delete $BACKUP_USER@$BACKUP_SERVER:/home $BACKUP_DIR/
echo "Backing up etc directory"
rsync --bwlimit=100000 -avz --exclude-from 'excludes.txt' --delete $BACKUP_USER@$BACKUP_SERVER:/etc $BACKUP_DIR/
echo "Backing up databases"
# Fetch databases
DATABASES=($(ssh root@${BACKUP_SERVER} 'mysql -e "show databases" -s --skip-column-names'))
# Remove excluded DBs from Database array
for target in "${EXCLUDE_DBS[@]}"; do
for i in "${!DATABASES[@]}"; do
if [[ ${DATABASES[i]} = $target ]]; then
unset 'DATABASES[i]'
fi
done
done
# Create database directory if it does not exists
[ ! -d "$BACKUP_DIR/databases" ] && mkdir -p "$BACKUP_DIR/databases"
# Fetch all databases
for DB in "${DATABASES[@]}" ; do
echo "$DB..."
ssh root@$BACKUP_SERVER "mysqldump --single-transaction --skip-lock-tables --quick $DB | gzip -c" | gunzip > databases/$DB.sql;
done
# Create borg snapshot
export NOW="$(date +"%Y-%m-%d-%H%M%S")"
echo "Creating Borg Backup $BACKUP_SERVER_NAME-$NOW"
cd $BACKUP_DIR
borg create --stats --list --filter=AME ::$BACKUP_SERVER_NAME-$NOW .
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment