Backup procedure
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.