|
@@ -0,0 +1,170 @@
|
|
|
|
+#!/usr/bin/env bash
|
|
|
|
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
|
|
|
+#==============================================================#
|
|
|
|
+# Description: backup script #
|
|
|
|
+# Author: Teddysun <[email protected]> #
|
|
|
|
+# Visit: https://teddysun.com #
|
|
|
|
+#==============================================================#
|
|
|
|
+
|
|
|
|
+[[ $EUID -ne 0 ]] && echo 'Error: This script must be run as root!' && exit 1
|
|
|
|
+
|
|
|
|
+### START OF CONFIG ###
|
|
|
|
+
|
|
|
|
+# Encrypt flag(true:encrypt, false:not encrypt)
|
|
|
|
+ENCRYPTFLG=true
|
|
|
|
+
|
|
|
|
+# KEEP THE PASSWORD SAFE.
|
|
|
|
+# The password used to encrypt the backup
|
|
|
|
+# To decrypt backups made by this script, run the following command:
|
|
|
|
+# openssl enc -aes256 -in [encrypted backup] -out decrypted_backup.tgz -pass pass:[backup password] -d -md sha1
|
|
|
|
+BACKUPPASS="mypassword"
|
|
|
|
+
|
|
|
|
+# Directory to store backups
|
|
|
|
+LOCALDIR="/root/backups/"
|
|
|
|
+
|
|
|
|
+# Temporary directory used during backup creation
|
|
|
|
+TEMPDIR="/root/backups/temp/"
|
|
|
|
+
|
|
|
|
+# File to log the outcome of backups
|
|
|
|
+LOGFILE="/root/backups/backup.log"
|
|
|
|
+
|
|
|
|
+# OPTIONAL: If you want MySQL to be backed up, enter the root password below
|
|
|
|
+MYSQL_ROOT_PASSWORD=""
|
|
|
|
+
|
|
|
|
+# Below is a list of files and directories that will be backed up in the tar backup
|
|
|
|
+# For example:
|
|
|
|
+# File: /data/www/default/test.tgz
|
|
|
|
+# Directory: /data/www/default/test/
|
|
|
|
+# if you want not to be backed up, leave it blank.
|
|
|
|
+BACKUP[0]=""
|
|
|
|
+
|
|
|
|
+# Date & Time
|
|
|
|
+BACKUPDATE=$(date +%Y%m%d%H%M%S)
|
|
|
|
+
|
|
|
|
+# Backup file name
|
|
|
|
+TARFILE="${LOCALDIR}""$(hostname)"_"${BACKUPDATE}".tgz
|
|
|
|
+
|
|
|
|
+# Backup MySQL dump file name
|
|
|
|
+SQLFILE="${TEMPDIR}mysql_${BACKUPDATE}.sql"
|
|
|
|
+
|
|
|
|
+### END OF CONFIG ###
|
|
|
|
+
|
|
|
|
+log() {
|
|
|
|
+ echo "$(date "+%Y-%m-%d %H:%M:%S")" "$1"
|
|
|
|
+ echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "$1" >> ${LOGFILE}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+### START OF CHECKS ###
|
|
|
|
+
|
|
|
|
+# Check if the backup folders exist and are writeable
|
|
|
|
+if [ ! -d "${LOCALDIR}" ]; then
|
|
|
|
+ mkdir -p ${LOCALDIR}
|
|
|
|
+fi
|
|
|
|
+if [ ! -d "${TEMPDIR}" ]; then
|
|
|
|
+ mkdir -p ${TEMPDIR}
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+# This section checks for all of the binaries used in the backup
|
|
|
|
+BINARIES=( cat cd du date dirname echo openssl mysql mysqldump pwd rm tar )
|
|
|
|
+
|
|
|
|
+# Iterate over the list of binaries, and if one isn't found, abort
|
|
|
|
+for BINARY in "${BINARIES[@]}"; do
|
|
|
|
+ if [ ! "$(command -v "$BINARY")" ]; then
|
|
|
|
+ log "$BINARY is not installed. Install it and try again"
|
|
|
|
+ exit 1
|
|
|
|
+ fi
|
|
|
|
+done
|
|
|
|
+
|
|
|
|
+STARTTIME=$(date +%s)
|
|
|
|
+
|
|
|
|
+cd "${LOCALDIR}" || exit
|
|
|
|
+
|
|
|
|
+### END OF CHECKS ###
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+### START OF MYSQL BACKUP ###
|
|
|
|
+
|
|
|
|
+if [ -z ${MYSQL_ROOT_PASSWORD} ]; then
|
|
|
|
+ log "MySQL root password not set, MySQL back up skip"
|
|
|
|
+else
|
|
|
|
+ log "MySQL dump start"
|
|
|
|
+ mysql -u root -p"${MYSQL_ROOT_PASSWORD}" <<EOF
|
|
|
|
+exit
|
|
|
|
+EOF
|
|
|
|
+ if [ $? -ne 0 ]; then
|
|
|
|
+ log "MySQL root password is incorrect. Please check it and try again"
|
|
|
|
+ exit 1
|
|
|
|
+ fi
|
|
|
|
+ mysqldump -u root -p"${MYSQL_ROOT_PASSWORD}" --all-databases > "${SQLFILE}"
|
|
|
|
+ if [ $? -ne 0 ]; then
|
|
|
|
+ log "MySQL backup failed"
|
|
|
|
+ exit 1
|
|
|
|
+ fi
|
|
|
|
+ log "MySQL dump completed"
|
|
|
|
+ log "MySQL dump file name: ${SQLFILE}"
|
|
|
|
+ #Add MySQL backup dump file to BACKUP list
|
|
|
|
+ BACKUP=(${BACKUP[*]} ${SQLFILE})
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+### END OF MYSQL BACKUP ###
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+### START OF TAR BACKUP ###
|
|
|
|
+
|
|
|
|
+log "Backup progress start"
|
|
|
|
+
|
|
|
|
+log "Tar backup file start"
|
|
|
|
+tar -zcPf ${TARFILE} ${BACKUP[*]}
|
|
|
|
+if [ $? -ne 0 ]; then
|
|
|
|
+ log "Tar backup file failed"
|
|
|
|
+ exit 1
|
|
|
|
+fi
|
|
|
|
+log "Tar backup file completed"
|
|
|
|
+
|
|
|
|
+# Encrypt tar file
|
|
|
|
+if ${ENCRYPTFLG}; then
|
|
|
|
+ log "Encrypt backup file start"
|
|
|
|
+ openssl enc -aes256 -in "${TARFILE}" -out "${TARFILE}.enc" -pass pass:"${BACKUPPASS}" -md sha1
|
|
|
|
+ log "Encrypt backup file completed"
|
|
|
|
+
|
|
|
|
+ # Delete unencrypted tar
|
|
|
|
+ log "Delete unencrypted tar file"
|
|
|
|
+ rm -f "${TARFILE}"
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+log "Backup progress complete"
|
|
|
|
+if ${ENCRYPTFLG}; then
|
|
|
|
+ BACKUPSIZE=$(du -h ${TARFILE}.enc | cut -f1)
|
|
|
|
+ log "File name: ${TARFILE}.enc, File size: ${BACKUPSIZE}"
|
|
|
|
+else
|
|
|
|
+ BACKUPSIZE=$(du -h ${TARFILE} | cut -f1)
|
|
|
|
+ log "File name: ${TARFILE}, File size: ${BACKUPSIZE}"
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+# Transfer file to Google Drive
|
|
|
|
+# If you want to install gdrive command, please visit website:
|
|
|
|
+# https://github.com/prasmussen/gdrive
|
|
|
|
+# of cause, you can use below command to install it
|
|
|
|
+# For x86_64: wget -O /usr/bin/gdrive http://dl.teddysun.com/files/gdrive-linux-x64; chmod +x /usr/bin/gdrive
|
|
|
|
+# For i386: wget -O /usr/bin/gdrive http://dl.teddysun.com/files/gdrive-linux-386; chmod +x /usr/bin/gdrive
|
|
|
|
+
|
|
|
|
+if [ ! "$(command -v "gdrive")" ]; then
|
|
|
|
+ log "gdrive is not installed"
|
|
|
|
+ log "File transfer skipped. please install it and try again"
|
|
|
|
+else
|
|
|
|
+ log "Tranferring tar backup to Google Drive"
|
|
|
|
+ if ${ENCRYPTFLG}; then
|
|
|
|
+ gdrive upload --no-progress ${TARFILE}.enc >> ${LOGFILE}
|
|
|
|
+ else
|
|
|
|
+ gdrive upload --no-progress ${TARFILE} >> ${LOGFILE}
|
|
|
|
+ fi
|
|
|
|
+ log "File transfer completed"
|
|
|
|
+fi
|
|
|
|
+
|
|
|
|
+### END OF TAR BACKUP ###
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ENDTIME=$(date +%s)
|
|
|
|
+DURATION=$((ENDTIME - STARTTIME))
|
|
|
|
+log "All done"
|
|
|
|
+log "Backup and transfer completed in ${DURATION} seconds"
|