#!/usr/bin/env bash # Author: M. Dutt (hello@mditech.net) # Date: 28/10/2023 # Purpose: Backup all specified direcories. # License: This shell script is released under GPL v2. # ######################## # REQUIREMENTS ######################## # # * Required commands: # + du # + tar # ######################## # USAGE ######################## # # * It stores all backup copies in directory '/var/backup' by default, # You can change it in variable $BACKUP_DIR below. # # * Add crontab job for root user: # # # crontab -e -u root # 10 0 * * * /bin/bash /var/daily_backup.sh # KEEP_DAYS='7' export BACKUP_DIR="/var/backup" export DIRECTORIES='directory1 directory2 directory3 directory4' export CMD_DATE='/bin/date' export CMD_DU='du -sh' export YEAR="$(${CMD_DATE} +%Y)" export MONTH="$(${CMD_DATE} +%m)" export DAY="$(${CMD_DATE} +%d)" export TIME="$(${CMD_DATE} +%H-%M-%S)" export TIMESTAMP="${YEAR}-${MONTH}-${DAY}-${TIME}" export BACKUP_SUCCESS='YES' export PATH='/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin' export LOGFILE="${BACKUP_DIR}/${TIMESTAMP}.log" [ ! -d ${BACKUP_DIR} ] && mkdir -p ${BACKUP_DIR} 2>/dev/null chown root ${BACKUP_DIR} chmod 0400 ${BACKUP_DIR} echo "* Starting backup: ${TIMESTAMP}." >${LOGFILE} echo "* Backup directory: ${BACKUP_DIR}." >>${LOGFILE} chmod 0400 ${LOGFILE} echo "* Backing up directories: ${DIRECTORIES}." >> ${LOGFILE} for d in ${DIRECTORIES}; do tar --exclude='vendor' --exclude='.git' --exclude='node_modules' --exclude='wp-admin' --exclude='wp-includes' -cjf ${BACKUP_DIR}/${d}-${TIMESTAMP}.tar.bz2 -C /var/www ${d} >>${LOGFILE} compressed_size="$(${CMD_DU} ${BACKUP_DIR}/${d}-${TIMESTAMP}.tar.bz2 | awk '{print $1}')" if [ X"$?" == X'0' ]; then sleep 10 else export BACKUP_SUCCESS='NO' fi done echo -e "* File size:\n----">>${LOGFILE} cd ${BACKUP_DIR} && \ ${CMD_DU} *${TIMESTAMP}* >>${LOGFILE} echo "----" >>${LOGFILE} echo "* Backup completed (Success? ${BACKUP_SUCCESS})." >>${LOGFILE} if [ X"${BACKUP_SUCCESS}" == X'YES' ]; then echo "==> Backup completed successfully." else echo -e "==> Backup completed with !!!ERRORS!!!.\n" 1>&2 fi find ${BACKUP_DIR}/* -type f -mtime +${KEEP_DAYS} -print | while read -r file; do echo "* Old backup found. Deleting: ${file}." >>${LOGFILE} rm "$file" done echo "==> Detailed log (${LOGFILE}):" echo "==============================" cat ${LOGFILE}