Backup Zarafa with Bacula

Last week I finished migrating our mail/collaboration platform to Zarafa, and as with all things this needs to be backed up. We’re running the Zarafa Enterprise edition which come’s with a backup tool called zarafa-backup which works like this :

The first time you run the zarafa-backup tool it creates a data file and an index file refering to the items (folders and mails) inside the data file.

The next time you run zarafa-backup it detects the existing files and creates an incremental data file and updates the corresponding index file. It keeps doing this until you delete the data files and index file. Then it wil create a new full backup and the cycle will start all over.

We are using Bacula to do our backups so I needed to work something out.

As stated earlier, zarafa-backup just keeps on creating incrementals which means that if you keep this running a restore will involve restoring a lot of incrementals first. This is not something I wanted…

So I made my schedule like this :

  • create a full backup on Friday evening. That way we have the weekend to run the backup.
  • Until the next Friday we let zarafa-backup creating incrementals in the working folder.
  • On the next Friday we move the complete set to an other folder ( I called it weekly) and back it up. If this is successfull we empty the weekly folder again. Then we run zarafa-backup again which creates a new full backup (since the complete set has been moved and the working directory is empty).

Bacula schedule

Two schedules are created, each whith their own storage pool.

  • One we run on Friday.
  • One we run all the other days.
schedule {
        Name = "zarafa-dly"
	Run = Level=full pool=ZDLY-POOL sat-thu at 19:00
}   
schedule { 
	Name = "zarafa-wkly"
	Run = Level=full pool=ZWKLY-POOL fri at 19:00
}

Bacula Zarafa client

The client config has 2 jobs defined.

  • One that does the daily backups using the “zarafa-dly” schedule.
  • One that does the backups of the weekly sets using the “zarafa-wkly” schedule. Each job runs a script before the backup run. The second job that backups the weekly sets also has a script that runs after the backup has been made. This script empties the weekly folder.

Job {
        Name ="MAIL02-DLY"
        FileSet="ZARAFA-STORES"
        Client = mail-02
        Storage = TapeRobot
        Write Bootstrap = "/var/lib/bacula/%c.bsr"
        Messages = Standard
        Schedule = "zarafa-dly"
        Type = Backup
        Pool = ZDLY-POOL
        ClientRunBeforeJob = "/etc/bacula/zbackup.sh"
        Run After Job = "/scripts/bacula2nagios \"%n\" 0 \"%e %l %v\""
        Run After Failed Job = "/scripts/bacula2nagios \"%n\" 1 \"%e %l %v\""
}

job {
    	Name ="MAIL02-WKLY"
    	FileSet="ZARAFA-WEEKLY-STORES"
    	Client = mail-02
    	Storage = TapeRobot
    	Write Bootstrap = "/var/lib/bacula/%c.bsr"
    	Messages = Standard
    	Schedule = "zarafa-wkly"
    	Type = Backup
    	Pool = ZWKLY-POOL
        ClientRunBeforeJob = "/etc/bacula/zbackup.sh"
	Client Run After Job = "/etc/bacula/zbackup-cleanup.sh"
 	Run After Job = "/scripts/bacula2nagios \"%n\" 0 \"%e %l %v\""
        Run After Failed Job = "/scripts/bacula2nagios \"%n\" 1 \"%e %l %v\""
}

Backup script


#!/bin/bash

#Variables
ZBFOLDER=/zarafa_backup/working
WEEKLYFOLDER=/zarafa_backup/weekly
DRFOLDER=/zarafa_backup/dr
WEEK=`date +%W`

#check if it's Friday or if the folder is empty
if [ `date +%w` -eq 5 -a `ls -A $ZBFOLDER | wc -l` -eq 0 ]; then
    echo "Starting Full backup"
    zarafa-backup -a -o $ZBFOLDER
  elif [ `date +%w` -eq 5 -a `ls -A $ZNBFOLDER | wc -l` -ne 0 ];then
    echo "Copying working to weekly and start new Full backup"
    mkdir -p $WEEKLYFOLDER/week-$WEEK
    cp $ZBFOLDER/* $WEEKLYFOLDER/week-$WEEK
    rm -f $ZBFOLDER/*
    zarafa-backup -a -o $ZBFOLDER
  else
    echo "Starting Incremental backup"
    zarafa-backup -a -o $ZBFOLDER
fi

{% endhighlight %}

### cleanup script
{% highlight bash %}
#!/bin/bash
#cleanup the weekly folder after bacula has run
WEEKLYFOLDER=/zarafa_backup/weekly

rm -rf $WEEKLYFOLDER/*