Skip to content

Instantly share code, notes, and snippets.

@michelep
Last active October 29, 2022 21:09
Show Gist options
  • Save michelep/c9c028d62b754b1311edbc0b87638998 to your computer and use it in GitHub Desktop.
Save michelep/c9c028d62b754b1311edbc0b87638998 to your computer and use it in GitHub Desktop.
Server backup to MEGA free space
#!/bin/bash
#
# backup mysql dbs, /etc folder and all subfolders inside /var/www. Encrypt it using aes256 and upload to MEGA.nz /backup folder
# 1) have a mega.nz account for 50GB of space
# 2) install MEGAcmd (https://mega.nz/cmd)
# 3) change CONFIGURATION lines to fit your needs and copy to /etc/cron.daily ;-)
# CONFIGURATION
SERVER="[name of the server]"
DAYS_TO_BACKUP=3
WORKING_DIR="/root/backup_tmp_dir"
PASSWORD="[password]"
MEGA_LOGIN="[mega e-mail]"
MEGA_PASSWORD="[mega password]"
BACKUP_MYSQL="true"
MYSQL_USER="[mysql username]"
MYSQL_PASSWORD="[mysql password]"
DOMAINS_FOLDER="/var/www"
##################################
# Login to MEGA
if [[ ! `mega-session` =~ "session is" ]]
then
echo "Logging in to MEGA..."
mega-login ${MEGA_LOGIN} ${MEGA_PASSWORD} &> /dev/null
else
echo "Already logged in"
fi
# Remove old backups
echo "Remove old backups..."
for FN in `mega-ls /backups/backup_${SERVER}` ; do
if [[ ${FN} =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]
then
echo ${FN}
if [ $((($(date +%s) - $(date -d ${FN} +%s)) / 86400)) -gt ${DAYS_TO_BACKUP} ]
then
echo "removing old backup ${FN}"
mega-rm -r -f /backups/backup_${SERVER}/${FN}
fi
fi
done
echo "Start backup..."
# Create local working directory and collect all data
rm -rf ${WORKING_DIR}
mkdir ${WORKING_DIR}
cd ${WORKING_DIR}
# Backup /etc folder
cd /
tar czf - etc | openssl enc -e -aes256 -out ${WORKING_DIR}/etc.tar.gz.enc -k ${PASSWORD}
cd - > /dev/null
# Backup MySQL
if [ "${BACKUP_MYSQL}" = "true" ]
then
mkdir ${WORKING_DIR}/mysql
for db in $(mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e 'show databases;' | grep -Ev "^(Database|mysql|information_schema|performance_schema|phpmyadmin)$")
do
echo "processing ${db}"
mysqldump --opt -u${MYSQL_USER} -p${MYSQL_PASSWORD} "${db}" | gzip | openssl enc -e -aes256 -out ${WORKING_DIR}/mysql/${db}_$(date +%F_%T).sql.gz.enc -k ${PASSWORD}
done
#echo "all db now"
mysqldump --opt -u${MYSQL_USER} -p${MYSQL_PASSWORD} --events --ignore-table=mysql.event --all-databases | gzip | openssl enc -e -aes256 -out ${WORKING_DIR}/mysql/ALL_DATABASES_$(date +%F_%T).sql.gz.enc -k ${PASSWORD}
fi
# Backup domains
mkdir ${WORKING_DIR}/domains
for folder in $(find ${DOMAINS_FOLDER} -mindepth 1 -maxdepth 1 -type d)
do
cd $(dirname ${folder})
tar --exclude='*.log' -czf - $(basename ${folder}) | openssl enc -e -aes256 -out ${WORKING_DIR}/domains/$(basename ${folder}).tar.gz.enc -k ${PASSWORD}
cd - > /dev/null
done
# Create remote folder
curday=$(date +%F)
mega-mkdir -p /backups/backup_${SERVER}/${curday} 2> /dev/null
# Backup now!!!
mega-put ${WORKING_DIR}/* /backups/backup_${SERVER}/${curday} > /dev/null
# Clean local environment
rm -rf ${WORKING_DIR}
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment