- #!/bin/bash
- # Backup $FIND_PATH
- BACKUP_SITES=yes
- # Backup databases
- BACKUP_DATABASES=yes
- # Delete local backups older than x days (0 = don't delete)
- DELETE_OLDER_THAN=7
- # Send backups to remote server
- SEND_REMOTE=yes
- # Where all the domains are located
- FIND_PATH="/home/*/domains/*"
- # Used to filter domain name from its full system path
- # E.g. (1)/home(2)/my(3)/domains(4)/mydomain.com(5)
- AWK_DOMAIN_POS="5"
- AWK_DOMAIN_OWNER_POS="3"
- # Where all the local backups are stored
- BACKUP_FOLDER="/backups"
- # Database credientals
- DATABASE_USER="{{DATABASE_USER}}"
- DATABASE_PASS="{{DATABASE_PASS}}"
- REMOTE_HOST="{{REMOTE_HOST}}"
- REMOTE_USER="{{REMOTE_USER}}"
- REMOTE_FOLDER="~/backups"
- REMOTE_ADDRESS="$REMOTE_USER@$REMOTE_HOST:$REMOTE_FOLDER"
- # This will be the name for the backup folder
- CURRENT_TIMESTAMP=$(date +"%Y-%m-%d")
- # Backup files will be appended by this
- UNIXTIME=$(date +"%s")
- # Check if rsync is installed
- if [ $SEND_REMOTE = "yes" ]; then
- command -v rsync >/dev/null 2>&1 || { echo -e >&2 "\e[97mRsync is not installed. Install it or set SEND_REMOTE to \e[1mno\e[0m\e[39m"; exit 1; }
- fi
- # Get list of domains
- find $FIND_PATH -maxdepth 0 > /tmp/domain-$UNIXTIME.txt
- # Get list of databases
- mysql --user=$DATABASE_USER --password=$DATABASE_PASS -e "SHOW DATABASES;" | tr -d "| " | grep -Ev "(Database|information_schema|performance_schema|mysql)" > /tmp/database-$UNIXTIME.txt
- # Create backup folder
- mkdir -p $BACKUP_FOLDER/$CURRENT_TIMESTAMP/{domains,databases}
- # Compress all domains
- if [ $BACKUP_SITES = "yes" ]; then
- for site in $(cat /tmp/domain-$UNIXTIME.txt)
- do
- DOMAIN_OWNER=$(echo $site | awk -F"/" '{ print $'${AWK_DOMAIN_OWNER_POS}' }')
- DOMAIN_NAME=$(echo $site | awk -F"/" '{ print $'${AWK_DOMAIN_POS}' }')
- DOMAIN_BACKUP_NAME="$DOMAIN_OWNER-$DOMAIN_NAME-$UNIXTIME.tar.gz"
- echo -en "\e[97mBackupping site \e[1m$DOMAIN_NAME\e[0m\e[97m ... \e[39m"
- tar -zcPf $BACKUP_FOLDER/$CURRENT_TIMESTAMP/domains/$DOMAIN_BACKUP_NAME $site
- if [ $? -eq 0 ]; then
- echo -e "\e[97m[\e[92mOK\e[97m]\e[39m"
- else
- echo -e "\e[97m[\e[91mERROR\e[97m]\e[39m"
- fi
- done
- fi
- # Compress all databases
- if [ $BACKUP_DATABASES = "yes" ]; then
- for db in $(cat /tmp/database-$UNIXTIME.txt)
- do
- DATABASE_BACKUP_NAME="$db-$UNIXTIME.sql.gz"
- echo -en "\e[97mBackupping database \e[1m$db\e[0m\e[97m ... \e[39m"
- mysqldump -hlocalhost -u$DATABASE_USER -p$DATABASE_PASS $db | gzip -9 > $BACKUP_FOLDER/$CURRENT_TIMESTAMP/databases/$DATABASE_BACKUP_NAME
- if [ $? -eq 0 ]; then
- echo -e "\e[97m[\e[92mOK\e[97m]\e[39m"
- else
- echo -e "\e[97m[\e[91mERROR\e[97m]\e[39m"
- fi
- done
- fi
- # Delete old backups
- if [ $DELETE_OLDER_THAN -gt 0 ]; then
- echo -en "\e[97mDeleting backups older than \e[1m$DELETE_OLDER_THAN days\e[0m\e[97m ... \e[39m"
- find $BACKUP_FOLDER -type d -ctime +$DELETE_OLDER_THAN | xargs rm -rf
- if [ $? -eq 0 ]; then
- echo -e "\e[97m[\e[92mOK\e[97m]\e[39m"
- else
- echo -e "\e[97m[\e[91mERROR\e[97m]\e[39m"
- fi
- fi
- # Send files to remote server
- if [ $SEND_REMOTE = "yes" ]; then
- echo -en "\e[97mSending backups to remote server ... \e[39m"
- rsync -a --ignore-existing $BACKUP_FOLDER/ $REMOTE_ADDRESS
- if [ $? -eq 0 ]; then
- echo -e "\e[97m[\e[92mOK\e[97m]\e[39m"
- else
- echo -e "\e[97m[\e[91mERROR\e[97m]\e[39m"
- fi
- fi
- # Remove temp list files
- rm /tmp/domain-$UNIXTIME.txt
- rm /tmp/database-$UNIXTIME.txt