Skip to content

Instantly share code, notes, and snippets.

@matteomattei
Last active August 29, 2015 14:03
Show Gist options
  • Save matteomattei/3d718b8a1ea692b632f3 to your computer and use it in GitHub Desktop.
Save matteomattei/3d718b8a1ea692b632f3 to your computer and use it in GitHub Desktop.
Backup last 7 days of httpdocs and MySQL data using FTP. This script is intended to be used in a server with Plesk.
#!/bin/bash
TMP_FOLDER="/root/daily_backup"
MYSQL_FOLDER="${TMP_FOLDER}/MYSQL"
WWW_FOLDER="${TMP_FOLDER}/WWW"
LOCAL_WWW_FOLDER="/var/www/vhosts"
FTP_USER="ftp_username"
FTP_PASS="ftp_password"
FTP_HOST="ftp_host"
MAIL_ALERT="notification@email.com"
###################################
alert()
{
echo "Error executing step ${1}" | mail -s "error from backup" ${MAIL_ALERT}
exit 1
}
case "${1}" in
start)
# PERFORM THE ACTUAL BACKUP (CALLED BY CRON)
rm -rf ${TMP_FOLDER}
mkdir -p ${MYSQL_FOLDER}
mkdir -p ${WWW_FOLDER}
# BACKUP ALL DATABASES SEPARATELY
DB_LIST=$(mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e 'show databases' | awk '{print $1}' | grep -Ev "(Database|information_schema|mysql|psa|phpmyadmin|performance_schema)")
for db in ${DB_LIST}
do
mysqldump --opt -uadmin -p`cat /etc/psa/.psa.shadow` ${db} | bzip2 > ${MYSQL_FOLDER}/${db}.sql.bz2 || alert 1
done
# BACKUP ALL DATABASE TOGETHER (INCLUDING SYSTEM DBS)
mysqldump --opt -uadmin -p`cat /etc/psa/.psa.shadow` --all-databases --events | bzip2 > ${MYSQL_FOLDER}/ALL.sql.bz2 || alert 2
# BACKUP SOURCES
cd ${LOCAL_WWW_FOLDER}
for DOMAIN in *
do
[ ! -d "${DOMAIN}/httpdocs" ] && continue
tar cpf - "${DOMAIN}/httpdocs" | bzip2 > "${WWW_FOLDER}/${DOMAIN}.tar.bz2" || alert 3
done
# CREATE DAILY BACKUP
cd ${TMP_FOLDER}
BACKUP_FILENAME=`date +%F`.tar
tar cf - WWW MYSQL > ${BACKUP_FILENAME} || alert 4
rm -rf ${MYSQL_FOLDER} ${WWW_FOLDER}
# CHECK IF THERE IS A BACKUP WITH THE SAME NAME AND REMOVE IT
FOUND=$(lftp -e 'cd backup; cls --sort="date"; exit;' -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} 2> /dev/null | grep "${BACKUP_FILENAME}")
if [ -n "${FOUND}" ]
then
lftp -e "cd backup; rm -f ${BACKUP_FILENAME}; exit;" -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} || alert 5
fi
# FTP TRANSER
lftp -e "cd backup; put ${BACKUP_FILENAME}; exit;" -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} || alert 6
# REMOVE BACKUPS OLDER THAN 7 DAYS
FILES=$(lftp -e 'cd backup; cls --sort="date"; exit;' -u ${FTP_USER},${FTP_PASS} ${FTP_HOST}) || alert 7
while [ $(echo "${FILES}" | grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}.tar" | wc -l) -gt 7 ]
do
FILE_TO_REMOVE=$(echo "${FILES}" | grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}.tar" | sort | head -n1)
lftp -e "cd backup; rm -f ${FILE_TO_REMOVE}; exit;" -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} || alert 8
FILES=$(lftp -e 'cd backup; cls --sort="date"; exit;' -u ${FTP_USER},${FTP_PASS} ${FTP_HOST}) || alert 7
done
;;
list)
# RETURN THE LIST OF BACKUPS
lftp -e 'cd backup; cls --sort="date"; exit;' -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} 2> /dev/null
;;
get)
# GET A SELECTED BACKUP
BACKUP_FILE="${2}"
if [ -z "${BACKUP_FILE}" ]
then
echo "Error: specify a backup file to download"
echo "for example: ${0} get FILE_NAME"
exit 1
fi
FOUND=$(lftp -e 'cd backup; cls --sort="date"; exit;' -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} 2> /dev/null | grep "${BACKUP_FILE}")
if [ -z "${FOUND}" ]
then
echo "Error: the file specified does not exist"
exit 1
fi
lftp -e "cd backup; get ${BACKUP_FILE}; exit;" -u ${FTP_USER},${FTP_PASS} ${FTP_HOST}
if [ ! "${?}" = "0" ]
then
echo "Error downloading file ${BACKUP_FILE}"
exit 1
else
echo "File downloaded correctly"
fi
;;
*)
# USAGE
echo "Usage: ${0} <start|list|get [FILE_NAME]>"
echo "-----------------------------------------------"
echo "To start backup: ${0} start"
echo "To list remote backups: ${0} list"
echo "To download a specific backup: ${0} get FILE_NAME"
exit 1
;;
esac
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment