How To Back Up a Web Server

Q. I’m using Red Hat Enterprise Linux based Apache web server. How do I backup my Apache webserver, MySQL and PostgreSQL database to another disk called /backup and then copy it to other offsite backup ssh server called

A. There are many tools under Linux / UNIX to backup a webserver. You can create a simple shell script to backup everything to /backup directory. You can also copy /backup directory content offsite using ssh and scp tool.

Step # 1: Create /root/ script

Use the following shell script (download link):

# A Simple Shell Script to Backup Red Hat / CentOS / Fedora / Debian / Ubuntu Apache Webserver and SQL Database
# Path to backup directories
DIRS="/home/vivek/ /var/www/html/ /etc"
# Store todays date
NOW=$(date +"%F")
# Store backup path
# Backup file name hostname.time.tar.gz 
BFILE="$(hostname).$(date +'%T').tar.gz"
PFILE="$(hostname).$(date +'%T').pg.sql.gz"
MFILE="$(hostname).$(date +'%T').mysql.sq.gz"
# Set Pgsql username
# Set MySQL username and password
# Remote SSH server setup
SSHSERVER="" # your remote ssh server
SSHUSER="vivek"                # username   
SSHDUMPDIR="/backup/remote"    # remote ssh server directory to store dumps
# Paths for binary files
# make sure backup directory exists
[ ! -d $BACKUP ] && mkdir -p ${BACKUP} 
# Log backup start time in /var/log/messages
$LOGGER "$0: *** Backup started @ $(date) ***"
# Backup websever dirs
$TAR -zcvf ${BACKUP}/${BFILE} "${DIRS}"
# Backup PgSQL
# Backup MySQL
$MYSQLDUMP  -u ${MYSQLUSER} -h localhost -p${MYSQLPASSWORD} --all-databases | $GZIP -9 > ${BACKUP}/${MFILE}
# Dump all local files to failsafe remote UNIX ssh server / home server
# Log backup end time in /var/log/messages
$LOGGER "$0: *** Backup Ended @ $(date) ***"

Customize it according to your needs, set username, password, ssh settings and other stuff.

Step # 2: Create ssh keys

Create ssh keys for password less login from your server to another offsite server hosted at your own home or another datacenter. See following faqs for more information:

Step #3: Create Cron job

Setup a cronjob to backup server everyday, enter:
# crontab -e
Append following code to backup server everyday at midnight:
@midnight /root/

Further readings:

🐧 Get the latest tutorials on Linux, Open Source & DevOps via RSS feed or Weekly email newsletter.

🐧 22 comments so far... add one

CategoryList of Unix and Linux commands
Disk space analyzersncdu pydf
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network UtilitiesNetHogs dig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
22 comments… add one
  • Diya Aug 2, 2008 @ 12:55

    Excellent and simple to the point.

  • S. Nilesh Aug 2, 2008 @ 16:15

    superb man… a marvellous script.

  • dj Aug 2, 2008 @ 18:43

    Nice script. Are you concerned about pwd in plaintext? Falisafe should be Failsafe in comment :-) We use a combo for daily and monthly, system and user. And use tape and disk. We looked at DVD UDF packet writing format, but decided against it.

    Depending on your needs ZAmanda is very nice. Like any product the configuration took a little to understand, but it wasn’t bad, and I believe they also have a GUI now. We liked it over Baccula because it uses tar or dump.

    I didn’t find the O’Reilly book, “Backup and Recovery” very helpful. It’s too high level, and the good stuff is all on their website or available online elsewhere.

  • 🐧 nixCraft Aug 2, 2008 @ 18:50

    Are you concerned about pwd in plaintext?
    Not much.. if attacker can read my script password, he/she has full access to system. There is no simple solution for password. Usually, I lockdown httpd, named, other service is jail. Continues monitoring and patching prevents lots of bad stuff.


  • Liju Aug 3, 2008 @ 16:24

    Excelent Notes.. Vivek

    resync command will be best if you have limited bandwidth on backup server.

    Also lftp is also support to incremental backup in between the linux servers which support only ftp access in to it.

  • Samir Aug 4, 2008 @ 14:59

    Concise and useful, a well written script.
    Thanks for the effort.

  • IndianWebhost Jan 7, 2009 @ 12:35

    Nice script. Thanks for sharing your resource.
    Are there any scripts for taking backups for windows server?

  • devarajan Jun 8, 2009 @ 6:07

    hi , we r using apache for mailserver . just i want to back the mails …..
    could u can give me any scripts for me .

  • Casey Jul 17, 2009 @ 13:16

    Hi Vivek,

    Thanks for the great script.

    Is there anyway to add an exclude directory list in this script? Thanks

    Kind regards


  • 🐧 nixCraft Jul 17, 2009 @ 13:24

    Find this line

    # Store backup path



    Find Line:

    # Backup websever dirs
    $TAR -zcvf ${BACKUP}/${BFILE} "${DIRS}"

    Update it as follows:

    # Backup websever dirs
    $TAR  --exclude-from=${EXCLUDE_CONF} -zcvf ${BACKUP}/${BFILE} "${DIRS}"

    Save and close the file. Create/root/exclude.files.conf file:

    vi /root/exclude.files.conf

    To exclude all log files and a directory called /home/vivek/mp3 enter:

  • Casey Oct 1, 2009 @ 10:32

    Hi Vivek,

    Thanks for the above. I have implemented this and it has been working fine for many months now.

    Just recently however I have noticed a problem with the last part of the code. I am not sure if this has been going on all the time or not, but I have was just doing a general check up on the backups and noticed an error.

    The section below is the culprit:
    ### Find out if ftp backup failed or not ###
    if [ “$?” == “0” ]; then
    rm -f $BACKUP/*
    echo “Date: $(date)”>$T
    echo “Hostname: $(hostname)” >>$T
    echo “Backup failed” >>$T
    sendmail “BACKUP FAILED” “$EMAILID” <$T
    rm -f $T

    I actually get an error:
    [: 83: ==: unexpected operator

    As you can see I have amended the mail part to sendmail as the other one was not working and hence this is the reason why I spotted the other problem.

    Do you know why this is happening? I have unbuntu 8.04.

    Any help much appreciated. Thanks


    • 🐧 nixCraft Oct 1, 2009 @ 10:49

      look like problem with the if statement.

  • Casey Oct 2, 2009 @ 16:35

    Hi Vivek,

    I believe it is the == that is not working. Obviously this should mean equal to but for some reason I just get an error. I have read around and people have stated to use the -eq instead of the == but this is only for numbers and I have tried this.

    The statement below is what I have added for testing purposes. I have put the result at the bottom. I am completely baffled!

    ead #This is to cause an error in the script

    if [ “$?” -eq “0” ]; then
    echo “This is good before $?”
    echo “This is bad before $?”

    ### Find out if ftp backup failed or not ###
    if [ “$?” -eq “0” ]; then
    rm -f $BACKUP/*
    echo “All Good $?”
    echo “Date: $(date)”>$T
    echo “Hostname: $(hostname)” >>$T
    echo “Backup failed” >>$T
    sendmail “BACKUP FAILED” “$EMAILID” <$T
    rm -f $T
    echo "ALL Bad $?"

    if [ "$?" -eq "0" ]; then
    echo "This is good after $?"
    echo "This is bad after $?"

    Result from this is: 42: ead: not found
    This is bad before 1
    All Good 0
    This is good after 0

    I am completely stumped. Any ideas? Thanks


  • Chris Mar 3, 2010 @ 21:52

    Spectacular script. I don’t suppose you have a version that also restores? :)

  • dhanesh mane Jan 19, 2011 @ 5:05

    perfect script. I was looking for something like this only and found the correct script works perfect on ubuntu.

  • Leon Oct 18, 2011 @ 10:16

    Excellent script, thanks for sharing.

  • Lo Jan 26, 2012 @ 14:35

    Hey Vivec,

    this is an excellent script. on Redhat, it is asking me for a password. how can i deal with that.

    • 🐧 nixCraft Jan 26, 2012 @ 18:40

      Setup ssh keys as described in step #2.

  • Quran Sep 29, 2012 @ 6:45

    Thank you for this script, I will use it to setup my backups.

  • Chris Nov 4, 2012 @ 18:11

    Hey, great script. This has been working well until the past week or so. Have Amazon changed something? as I keep getting broken pipe message now. Anyone else experiencing this problem?

  • Babin Lonston Jul 16, 2013 @ 11:41

    Will u please give me a script to backup my client machines to centos Server , All the Client machines are ubuntu 12.04 LTS and server machine is centos 6.3 , i want to backup the systems which have ip address and want to backup the whole PC and it want to be saved under /backup folder of centos

  • SherlockStd Dec 15, 2016 @ 9:02

    Very nice script thanks you very much ! :)

Leave a Reply

Your email address will not be published.

Use HTML <pre>...</pre> for code samples. Still have questions? Post it on our forum