Zimbra 8 FOSS shell backup script

Het ondenkbare is pas uitgekomen, mijn mailserver was compleet onbruikbaar na een update. De LDAP database gaf alleen maar meldingen terug dat accounts niet bestonden en alle email werd gebounced, omdat de mailbox niet werd herkent.

Snel een nieuwe mailserver opzetten heeft verdere problemen weten te verhelpen, want de mail kon weer binnenstromen. Ondanks dat dit het probleem enigszins oploste, was het probleem van de kapotte mailserver nog niet opgelost. Uiteindelijk is het mij vandaag, na een week, gelukt om de mailserver weer werkend te krijgen! Het bleek dat een oudere versie van de LDAP database terugzetten het probleem oploste.

Het enige wat nog ontbrak aan deze server was een backup, tja, het heeft altijd gewerkt.. Vanaf vandaag is er een backupscript wat elke 2 dagen loopt.

Er is niet veel informatie te vinden over backupscripts van de Open-Source editie van de Zimbra Collaboration Server, versie 8. Daarom ben ik gaan sleutelen aan bestaande scripts om deze in te kunnen zetten in mijn eigen serveromgeving.

Dat script staat hieronder:

#!/bin/bash

# Zimbra Backup Script
# Requires that you have ssh-keys: https://help.ubuntu.com/community/SSHHowto#Public%20key%20authentication
# This script is intended to run from the crontab as root
# Date outputs and su vs sudo corrections by other contributors, thanks, sorry I don't have names to attribute!
# Free to use and free of any warranty! Daniel W. Martin, 5 Dec 2008
## Adapted for rsync over ssh instead of ncftp by Ace Suares, 24 April 2009 (Ubuntu 6.06 LTS)

# Outputs the time the backup started, for log/tracking purposes
echo Starttijd backup = $(date +%T)
before="$(date +%s)"
# all the destination variables
ZIMBRADIR=/opt/zimbra/
LOCALBACKUPDIR=/backup/zimbra/$(date +%F-%H-%M-%S)
REMOTEBACKUPDIR=192.168.2.20:/volume1/Backups/zimbra

# Live sync before stopping Zimbra to minimize sync time with the services down
# Comment out the following line if you want to try single cold-sync only
#rsync -aHK --delete --backup /opt/zimbra/ /backup/zimbra/$(date +%F-%H-%M-%S)

# Now we need to shut down Zimbra to rsync any files that were/are locked
# whilst backing up when the server was up and running.
before2="$(date +%s)"

# Stop Zimbra Services (as user Zimbra from root crontab)
echo Zimbra wordt afgesloten...
su - zimbra -c "/opt/zimbra/bin/zmcontrol stop"
echo Zimbra is afgesloten...
echo 60 seconden wachten en dan alle overgebleven Zimbra processen killen...
sleep 60
# Kill any orphaned Zimbra processes
ORPHANED=`ps -u zimbra -o "pid="` && kill -9 $ORPHANED
echo Mogelijke Zimbraprocessen zijn gekilld...

# Sync to local backup directory
echo Rsync start met backup van /opt/zimbra...
rsync -aHK --delete --backup $ZIMBRADIR $LOCALBACKUPDIR
echo Lokale backup maken afgerond...

# Restart Zimbra Services (as user Zimbra from root crontab)
echo Zimbra starten...
su - zimbra -c "/opt/zimbra/bin/zmcontrol start"
echo Zimbra starten uitgevoerd...

# Calculates and outputs amount of time the server was down for
after="$(date +%s)"
elapsed="$(expr $after - $before2)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Server downtime: "$hours uur $minutes minuten $seconds seconden"

# Create a txt file in the backup directory that'll contains the current Zimbra
# server version. Handy for knowing what version of Zimbra a backup can be restored to.
echo Zimbra versie toevoegen aan /opt/zimbra/conf/zimbra_version.txt...
su - zimbra -c "zmcontrol -v > /opt/zimbra/conf/zimbra_version.txt"
echo Zimbra versie toegevoegd /opt/zimbra/conf/zimbra_version.txt...

# Display Zimbra services status
echo Zimbra services status:
su - zimbra -c "/opt/zimbra/bin/zmcontrol status"

# backup the $localbackupdir to $remotebackupdir
echo Remote backup starten...
rsync -aHK --delete-during $LOCALBACKUPDIR $REMOTEBACKUPDIR
echo Remote backup uitgevoerd...
echo Lokale backupmap verwijderen...
rm -Rf $LOCALBACKUPDIR
echo Lokale backupmap verwijderd...

# Outputs the time the backup finished
echo Backup geslaagd om = $(date +%T)

# Calculates and outputs total time taken
after="$(date +%s)"
elapsed="$(expr $after - $before)"
hours=$(($elapsed / 3600))
elapsed=$(($elapsed - $hours * 3600))
minutes=$(($elapsed / 60))
seconds=$(($elapsed - $minutes * 60))
echo Totale benodigde tijd: "$hours uur $minutes minuten $seconds seconden"

# end

Allereerst wordt Zimbra gestopt. Dan wordt 60 seconden gewacht om eventuele overgebleven Zimbra-processen te laten ‘sterven’ en anders worden ze gekilld.

Daarna wordt er een lokale backup van /opt/zimbra/ naar /backup/zimbra/ gemaakt met behoudt van alle (hard/soft)links. Direct hierna wordt Zimbra weer gestart en de downtime wordt weergegeven.

Dan wordt de huidige versie van Zimbra opgeslagen in /opt/zimbra/conf/zimbra_version.txt, zodat zelfs een versiebackup mogelijk is.

Als dit uitgevoerd is, dan wordt er een statuscheck uitgevoerd op Zimbra, om te zien of alle processen weer opgestart zijn.

Vervolgens wordt de backup van de lokale backupmap naar de remote backupmap gestart. In mijn geval is dit de NAS in het interne netwerk. Het is ook mogelijk om hier een server op afstand aan toe te voegen, mits deze met SSH-verbindingen overweg kan. Lees hier meer over Public Key Authentication, wat nodig is voor deze overdracht!

Is dit allemaal uitgevoerd? Dan wordt de lokale backup verwijderd van de server en wordt een overzicht gegeven van de totale tijd die de backup in beslag heeft genomen…