
Scenario
Backup multiple web sites stored on a Linux server. Sites are stored in a single folder as sub-folders.
I run a web host that is a custom fault tolerant solution on Amazon AWS t1.micro hosts. The primary host should be backed up daily, but a historic backup was necessarily. My goal was to have two weeks of daily backups. The sites databases are backed up separately, so my primary concern was the folder contents.
Easier to read script here:
https://github.com/willisiw/ShellScripts/blob/master/full_sites_backup.sh
Prerequisites
Linux system running bash.
Tested on Ubuntu 8, 10 & 12. Developed initially on RedHat EL platform.
Optional: Amazon s3 tools to sync backup files to the cloud.
Code
#! /bin/bash # # This script will backup your web data for several sites # into a 14 different folders based on the day and week. # # This is based on a backup script for a mail server, adapted to a web server. # # If run daily, this backup will eventually create two weeks of backups # 0 or 1 MON-SUN # # The SITESFOLDER is meant to be a base folder contining sub-folders which are # each an individual site. #Get the week number of the year and Day of Week WEEK_NUM=$(date +%V) #TAPE_SET will be 0 or 1 TAPE_SET=$(expr $WEEK_NUM % 2) TAPE=$TAPE_SET$(date +%a) # Edit the following two values if necessary SITESFOLDER="/var/www" BACKUPFOLDER="/home/ubuntu/backup" TARGET="$BACKUPFOLDER/$TAPE" # Uncomment the next four lines and modify if you want to backup to a mount point # This requires a predefined mount point setup in mtab. # REMOTESERVER="myserver.example.com" # if ! grep -q "$REMOTESERVER" /etc/mtab # then # mount /mnt/fileserver # fi #### END CUSTOM HEADER ##### # # No more editing needed after this line cd ${SITESFOLDER} echo "Web sites Backup Starting [`date`] to $TARGET" if [ -d $TARGET ]; then echo "Found Backup Directory ${TARGET}. Using It." else echo "Creating Backup Directory ${TARGET} to backup sites." mkdir -p ${TARGET} fi # This command is designed to for i in $(ls -d */); do subfolder=`printf "$i" | sed -e 's:/::g'` cd ${SITESFOLDER}/${subfolder} # # $subfolder = folder without trailing slash # echo +++++++++++++++++++++++++++++++++++++++++++++ echo [`date`] [`pwd`] backup started to [${TARGET}/${subfolder}.tar.gz] if [ -e ${TARGET}/${subfolder}.tar.gz ]; then echo "Existing backup found. Deleting before creating new backup." rm -f ${TARGET}/${subfolder}.tar.gz fi sudo nice -n 19 tar -cz * -f ${TARGET}/${subfolder}.tar.gz echo [`date`] [${TARGET}/${subfolder}.tar.gz] backup completed. echo +++++++++++++++++++++++++++++++++++++++++++++ done echo +++++++++++++++++++++++++++++++++++++++++++++ echo +++++++ Backup Folder Contents ++++++++++++++ echo +++++++++++++++++++++++++++++++++++++++++++++ ls -l $TARGET echo echo "Finished backing up web data. [`date`]" echo # This is a good spot to add a command to copy a local backup off the server. # s3cmd sync $BACKUPFOLDER s3://bucketname --delete-removed