Backup procedure

From Newroco Tech Docs
Jump to navigationJump to search

This page will describe how a backup procedure would look.

On backup server

Install rsync

apt-get install rsync

Switch to root and create a private/public key pair

sudo su -
ssh-keygen

Copy the public key from /root/.ssh/id_rsa.pub

On target server(s)

Install rsync

apt-get install rsync

Create a user for the backup script with the public key copied before

adduser --disabled-password --gecos "" rsyncbackup
mkdir /home/rsyncbackup/.ssh
touch /home/rsyncbackup/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuP+3RNIk3C7/fDU/hSexdkH4da8ZW3DdO53kemVtsEk8TOskD1GEzJxhLB6SHbC/ke9295nFXHMNsbSOKgs6HHPqOgaaX0Ff5RmDZK7psSLvBJp745f6R6LtzHHMRZrY0FV2q0dKTZBT71/uv+7/kd9QgDGci7qAkpRmAihLBryVnt9hYZrm04D/G6CGhdgt0I257sUnQ8RwdAIUNyjMlFTahJUFBuvJi3qEJ11S6D7lQZC3VddO6KlgYPvpZOtf/5aLbzlNZALeP1wSw83+Bkk9wU8nQ/KpZyQPy8NYRTw5fYWfCoOg98cElaU00ZMTBEwA+bssTzdLpe9xPLO/AQ== chris@chris-desktop' > /home/rsyncbackup/.ssh/authorized_keys
chown -R rsyncbackup:rsyncbackup /home/rsyncbackup/.ssh
chmod 600 /home/rsyncbackup/.ssh/authorized_keys

Add entry in /etc/sudoers for the created user

#visudo
rsyncbackup ALL=NOPASSWD: /usr/bin/rsync

Back on backup server

Copy this script in /opt/bin/rsyncbackup.sh

#!/bin/bash

if [ $# -ne 2 ] ; then
    echo "Error: you need to provide 2 parameters, $# given."
    echo "Syntax: rsyncbackup.sh remote local"
    echo "Example: rsyncbackup.sh rsyncbackup@ip.add.re.ss:/path/to/source/ /path/to/destination/ (mind the slashes)"
    echo
    exit 1
fi

CURRENTDATE=`/bin/date +"%F"`
OLDDATE=`/bin/date --date="2 days ago" +"%F"`

SOURCE=`echo $1`
DEST=$2

echo "source=$SOURCE"

INPROGRESS=${DEST}inprogress
LATEST=${DEST}latest

if [ -d $INPROGRESS ] ; then
    echo `date +"%F %T"` " : Directory $INPROGRESS already exists - is a previous backup still running?"
    echo `date +"%F %T"` " : Directory $INPROGRESS already exists - is a previous backup still running?" | /usr/bin/mail -s "Backup of $SOURCE failed. Directory $INPROGRESS already exists - is a previous backup still running?" example@email.com
    exit 1
fi

echo `date +"%F %T"` " : Started rsyncing to  ${DEST}${CURRENTDATE}."


echo "source=$SOURCE"


/usr/bin/rsync --old-compress -rlptD --numeric-ids --hard-links --inplace --acls --xattrs --rsync-path "/usr/bin/sudo /usr/bin/rsync" --link-dest "${DEST}latest" --old-compress ${SOURCE} ${DEST}inprogress
RSYNCERROR=$?

if [ $RSYNCERROR -ne 0 ] ; then
    echo `date +"%F %T"` " : Rsync to ${DEST}inprogress exited with non-null status. Exiting..."
    echo `date +"%F %T"` " : Rsync to ${DEST}inprogress exited with non-null status. Exiting..." | /usr/bin/mail -s "Backup of $SOURCE failed" example@email.com
    exit 1
fi

/bin/mv ${DEST}inprogress ${DEST}${CURRENTDATE}
/bin/rm ${DEST}latest
/bin/ln -s ${DEST}${CURRENTDATE} ${DEST}latest
/bin/rm -r ${DEST}${OLDDATE}

echo `date +"%F %T"` " : Finished rsyncing to  ${DEST}${CURRENTDATE}."

exit 0

And make it executable

chmod +x /opt/bin/rsyncbackup.sh

Create the directories where the backups will be saved

mkdir -p /dir/for/the/backup

Create a file /etc/cron.d/rsyncbackup and set the backup

# Minute   Hour   Day of Month       Month          Day of Week       User     Command    
# (0-59)  (0-23)     (1-31)    (1-12 or Jan-Dec)  (0-6 or Sun-Sat)         

00 00 * * * root /opt/bin/rsyncbackup.sh rsyncbackup@ta.rg.et.ip:/path/to/source /path/to/destination/ >> /var/log/replication.log

Make it executable

chmod +x /etc/cron.d/rsyncbackup

Proxy

If you can't connect directly to the server that needs to be backed up and need to use a proxy, replace the rsync command from the above script with this one

/usr/bin/rsync --old-compress -rlptD --numeric-ids --hard-links --inplace --acls --xattrs --rsync-path "/usr/bin/sudo /usr/bin/rsync" --link-dest "${DEST}latest" --old-compress -e 'ssh -o "ProxyCommand ssh -A backup-user@<proxy-ip> -W %h:%p"' ${SOURCE} ${DEST}inprogress

And of course make sure there is a backup-user on the proxy with the previously generated public key.