Backup Shell Script for Linux Web Host


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:


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.


#! /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

# 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.
# if ! grep -q "$REMOTESERVER" /etc/mtab
# then 
#	  mount /mnt/fileserver
# fi

# No more editing needed after this line

echo "Web sites Backup Starting [`date`] to $TARGET"
if [ -d $TARGET ]; then
     echo "Found Backup Directory ${TARGET}. Using It."
    echo "Creating Backup Directory ${TARGET} to backup sites."
    mkdir -p ${TARGET}

# 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

    sudo nice -n 19 tar -cz * -f ${TARGET}/${subfolder}.tar.gz
    echo [`date`] [${TARGET}/${subfolder}.tar.gz] backup completed.
    echo +++++++++++++++++++++++++++++++++++++++++++++

echo +++++++++++++++++++++++++++++++++++++++++++++
echo +++++++ Backup Folder Contents ++++++++++++++
echo +++++++++++++++++++++++++++++++++++++++++++++
ls -l $TARGET
echo "Finished backing up web data. [`date`]"

# This is a good spot to add a command to copy a local backup off the server.
# s3cmd sync $BACKUPFOLDER s3://bucketname --delete-removed