Shell Script For Backing Up A Server

Apache Logo

Linux Logo

OK, another brainwrecking day for yours truly, but I think I finally have a usable script anyone can use to back up an Apache and MySQL server. There’s some variables at the beginning so you can tailor the script to your needs.

The script will

  • stop the Apache and MySQL services
  • optionally mount an NFS share
  • copy configuration settings to the respective server files directories
  • tar and gzip the files into the backup location
  • close the NFS share
  • remove the copies of the configuration files
  • start the services again
  • log start and stop time and tell you how long the operation took

I commented the file pretty well, I think, so there should be little doubt as to what’s going on.

#!/bin/bash

################################################################################
# APACHE SERVER SETTINGS
################################################################################
#
# Set apache_server_flag to 0 if you are not using Apache.
# Any other numerical value enables backing up of an Apache server.
#
# Set apache_server_script, apache_config_locate, and apache_server files
# to the correct directories.  Default Ubuntu locations are used.

apache_server_flag=1
apache_server_script=/etc/init.d/apache2
apache_config_locate=/etc/apache2/sites-enabled
apache_server_files=/var/www

################################################################################
# MYSQL SERVER SETTINGS
################################################################################
#
# Set mysql_server_flag to 0 if you are not using MySQL.
# Any other numerical value enables backing up of a MySQL server.
#
# Set mysql_server_script, mysql_config_locate, and mysql_server files
# to the correct directories.  Default Ubuntu locations are used.

mysql_server_flag=1
mysql_server_script=/etc/init.d/mysql
mysql_config_locate=/etc/mysql
mysql_server_files=/var/lib/mysql

################################################################################
# NFS CLIENT SETTINGS
################################################################################
#
# Set backup_nfs_flag to 0 if you are not using NFS to store backups.
# Any other numerical value enables backing up of to an NFS server.
#
# Set backup_location to the directory you want to mount the NFS share on
# Set backup_nfs_addr to the share you want to connect to

backup_nfs_flag=1
backup_location=/srv/backup
backup_nfs_addr=192.168.1.2:/home/all/backup

################################################################################
# LOG FILE LOCATION
################################################################################
#
# This setting is always used, NFS or no.

backup_log_file=/var/log/server_backup.log

################################################################################
# GRAB THE HOST NAME
################################################################################
#
# Useful for combining logs

host=$(hostname)

################################################################################
# CENTER TEXT IN EQUAL SIGNS
################################################################################
#
# Makes logs look purty.

function center_txt() {
  PROMPT="$1"
  str_len=${#PROMPT}
  indent=$(( ((78 - $str_len)) / 2))
  outdent=$(( 78 - $str_len - $indent ))
  for (( i = 1 ; i > $backup_log_file
  done
  echo -n " $PROMPT " >> $backup_log_file
  for (( i = 1 ; i > $backup_log_file
  done
  echo >> $backup_log_file
} 

################################################################################
# START LOGGING
################################################################################

start_stamp=$(date +%s)
myprompt="BACKUP OF SERVER $host STARTED $(date -d @$start_stamp)"
center_txt "$myprompt"

################################################################################
# STOP WEB AND DATABASE SERVICES
################################################################################

if test $apache_server_flag -ne 0 ; then
  $apache_server_script stop >> $backup_log_file 2>&1
fi

if test $mysql_server_flag -ne 0 ; then
  $mysql_server_script stop >> $backup_log_file 2>&1
fi

################################################################################
# COPY CONFIGURATION FILES SO THEY CAN BE ARCHIVED
################################################################################

if test $mysql_server_flag -ne 0 ; then
  mkdir $mysql_server_files/config_backup >> $backup_log_file 2>&1
  cp -rp $mysql_config_locate/* $mysql_server_files/config_backup >> 
    $backup_log_file 2>&1
fi

if test $apache_server_flag -ne 0 ; then
  mkdir $apache_server_files/config_backup >> $backup_log_file 2>&1
  cp $apache_config_locate/* $apache_server_files/config_backup >> 
    $backup_log_file 2>&1
fi

################################################################################
# MOUNT NFS SHARE TO BACK UP TO
################################################################################

if test $backup_nfs_flag -ne 0 ; then
  sudo mount -vt nfs $backup_nfs_addr $backup_location >> $backup_log_file 2>&1
fi

################################################################################
# ARCHIVE DATABASE SERVER FILES
################################################################################

if test $mysql_server_flag -ne 0 ; then
  echo -n Backing up database server files >> $backup_log_file
  cd $mysql_server_files >> $backup_log_file 2>&1
  tar -czspf $backup_location/mysql-$(date -d @$start_stamp +%Y%m%d).tar.gz * 
    --checkpoint=.10 --totals >> $backup_log_file 2>&1
fi

################################################################################
# ARCHIVE WEB SERVER FILES
################################################################################

if test $apache_server_flag -ne 0 ; then
  echo -n Backing up web server files  >> $backup_log_file
  cd $apache_server_files >> $backup_log_file 2>&1
  tar -czspf $backup_location/www-$(date -d @$start_stamp +%Y%m%d).tar.gz * 
    --checkpoint=.10 --totals >> $backup_log_file 2>&1
fi

################################################################################
# UNMOUNT NFS SHARE
################################################################################

if test $backup_nfs_flag -ne 0 ; then
  sudo umount -vl $backup_location >> $backup_log_file 2>&1
fi

################################################################################
# REMOVE COPIES OF CONFIGURATION FILES
################################################################################

if test $mysql_server_flag -ne 0 ; then
  rm -r $mysql_server_files/config_backup >> $backup_log_file 2>&1
fi

if test $apache_server_flag -ne 0 ; then
  rm -r $apache_server_files/config_backup >> $backup_log_file 2>&1
fi

################################################################################
# START WEB AND DATABASE SERVICES
################################################################################

if test $mysql_server_flag -ne 0 ; then
  $mysql_server_script start >> $backup_log_file 2>&1
fi

if test $apache_server_flag -ne 0 ; then
  $apache_server_script start >> $backup_log_file 2>&1
fi

################################################################################
# MARK LOG FOR EASY READING
################################################################################

end_stamp=$(date +%s)
elapsed_seconds=$(expr $end_stamp - $start_stamp)
elapsed_time=$(date -u -d @$elapsed_seconds +%H hours %M minutes %S seconds)
center_txt "BACKUP OF SERVER $host ENDED $(date -d @$end_stamp)"
center_txt "BACKUP OF SERVER $host TOOK $elapsed_time"
echo >> $backup_log_file

fold $backup_log_file > $backup_log_file.tmp
rm $backup_log_file
mv $backup_log_file.tmp $backup_log_file