Setting up backup and recovery of Zimbra OSE entirely and in separate boxes without using Zextras

  • Tutorial

1. Where to start


How do you start the backup? Planning. When backing up any system, you need to create a backup plan: what exactly, how often, how long to store, is there enough free space? From the answers to these questions follows the answer to the main question - how to back it up?

If there is a lot of free space, you can store the entire virtual machine. Make backups of the same Veeam on a schedule, and not think about the difficulties. But as for me, it’s a waste, I’m used to doing everything as concisely as possible and, if possible, economical. I, of course, have deployed Veeam, but I only backup them with systems that are either impossible or problematic and can be deployed from backup copies for a very long time.

Pro scripts controls the virtual environment just meaningly say nothing.

Zimbra has a zmmailbox tool. And, upon closer examination of its functionality, I realized that it would be more than enough for me. He can backup and restore boxes even on a live system. And I liked the ability to backup critical mailboxes separately from the backup of the entire system. Thus, the space occupied by backups will be limited by the size of the archived mailboxes multiplied by the number of “backup depth” days, and not by the volume of the entire system multiplied by the same number of days. In addition, with the backup of the entire system, in the case of Zimbra, it is extremely difficult to recover. It is much easier to copy a virtual machine using Veeam or virtual environment management tools (Hyper-V, ESXI, enter the right one) right after setting up the system, and put it “on the shelf”, so that at a critical moment you can quickly deploy almost nothing weighing VM and pour backups of mailboxes into it. In my opinion, this is the least expensive scenario in all respects.

2. Baseline:


Server OS : CentOS 7

About the OS
На самом деле разница между CentOS7 и любой другой системой будет заключаться исключительно в командах серверу на установку пакетов, и, возможно, расположении некоторых файлов. Работа ведется в основном с командлетами Zimbra, так что отличия настройки будет минимальны.

Domain Zimbra : zimbramail.home.local
Username and password for access to the shared folder : ZimbraBackUp / 123123
Path to the shared folder : \\ BackUpServer1 \ ZM \
Path of mounting the balls on the host Zimbra : / mnt / ZM /

3. Customization


So, let's begin!

We will write backups to a server running Windows, in a shared folder. If you want, you can merge backup copies anywhere, but everything is set up in such a way that most backups are written exactly on BackUpServer1.home.local. So:

1) Create a user in the domain to access the shared folder on this server so that you can mount it on the Zimbramail.home.local server. User name ZimbraBackUp, password, conditionally, 123123.

2) On the BackUpServer1 server, create the \ ZM \ directory in the repository and share it, giving change rights for the ZimbraBackUp user. The path to the ball will be as follows: \\ BackUpServer1 \ ZM \

3) Mount the ball to the Zimbramail.home.local server. In order for the folder to be mounted automatically, you need to correct the / etc / fstab file by adding the line to it:

//BackUpServer/ZM /mnt/ZM cifs user,uid=500,rw,suid,username=ZimbraBackUp,password=123123 0 0

But first you need to check if the mount works:

$ mount -t cifs //BackUpServer/ZM /mnt/ZM -o user=ZimbraBackUp,password=123123

Often there is an error like this:

mount: wrong fs type, bad option, bad superblock on //BackUpServer1/ZM/,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount.<type> helper program)
In some cases useful info is found in syslog - try
dmesg | tail or so.

You can fix it by installing cifs-utils:

$ yum install cifs-utils

After setting, I recommend restarting the server.

4) Create 3 script files: FullBackUp.sh HandBackUp.sh Restore.sh

The first file will be used to automatically create backup copies on a schedule, the second one to enable backup of individual mailboxes, or simply manually launch “what if.” And the third script is the restoration of one or all of the boxes at once. I tried to comment on the work of the scripts as much as possible and prescribed logging.

Content of the FullBackUp.sh file:
#!/bin/bash#Куда положить бэкап
Path="/mnt/ZM/BackUps"#Куда положить архив бэкапа
ArchPath="/mnt/ZM/Archive"#Куда положить месячный бэкап
MPath="/mnt/ZM/Mounthly"#Название домена Zimbra
ZDomain="zimbramail.home.local"#Список ящиков
MBoxes="/mnt/ZM/MBoxesList"#Текущая дата
CDate=$(date +%d-%m-%Y)
#Запоминаем день месяца
MDay=$(date +%d)
#Куда писать логиlog="/mnt/ZM/BackUpLog.txt"echo -en "BackUp ALL MailBoxes started in $(date +%T)\n" >> $log#Проверка не существования каталога для резервного копированияif [ ! -d $Path ]; then#Создание каталога хранения резервных копийecho"Создание каталога хранения резервных копий..."
	mkdir -p $Pathif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "BackUp dirctory was created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "BackUp dirctory was NOT created in $(date +%T)\n" >> $logfielseecho"Каталог хранения резервных копий существует, проверка существования каталога на сегодняшнее число..."fi#Првоерка не существования каталога на сегодняшнюю датуif [ ! -d $Path/$CDate ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echo#Создание каталога хранения резервных копий на сегодняшнее числоecho"Создание каталога хранения резервных копий на сегодняшнее число..."
	mkdir -p $Path/$CDateif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "BackUp CDate dirctory was created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "BackUp CDate dirctory was NOT created in $(date +%T)\n" >> $logfielseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho"Каталог хранения резервных копий существует, запись списка ящиков в файл..."fi#Запись списка ящиков в файл
/opt/zimbra/bin/zmprov -l gaa $ZDomain > $MBoxes#Вывод результата записи спискаif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Mail Boxes list created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Mail Box list is NOT created! in $(date +%T)\n" >> $logexitfi#создание резервных копий каждого ящика из спискаfor MailBox in $( cat $MBoxes); doecho"Создание резервной копии ящика $MailBox..."
	/opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBoxif [ $? -eq 0 ]; then#Вывод результата создания резервной копии для каждого ящикаecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $logfidone#Очищаем файл со списком ящиковecho"Очистка файла со споском ящиков..."echo -n > $MBoxesif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "File $MBoxes clear\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "File $MBoxes can NOT be cleared\n" >> $logfi#Создание архива и работа с архивами#Проверка не существования каталога для архивирвоанияif [ ! -d $ArchPath ]; then#Создание каталога хранения архивовecho"Создание каталога хранения архивов..."
	mkdir -p $ArchPathif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Archive dirctory was created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Archive dirctory was NOT created in $(date +%T)\n" >> $logfielseecho"Каталог хранения архивов существует, архививрование..."fi
tar -czf $ArchPath/$CDate.tar $Path/$CDateif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Archive created in $(date +%T)\n" >> $log#Каждое первое число месяца копирование архива на долгосрочное хранениеif [ "$MDay" = 1 ]; then#Проверка существования каталога хранения долгосрочных архивовif [ ! -d $ArchPath ]; then#Создание каталога хранения долговрочных архивовecho"Создание каталога хранения долгосроных архивов..."
			mkdir -p $ArchPathif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Long saving dirctory was created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Long saving dirctory was NOT created in $(date +%T)\n" >> $logfielse#Каталог существуетecho"Каталог долгосрочного хранения архивов существует, копирование архива на долгосрочное хранение..."fi
		cp $ArchPath/$CDate.tgz $MPath/$CDateif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Archive is copied in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Archive is NOT copied in $(date +%T)\n" >> $logfiecho"Удаление старых резервных копий (старше 1 недели)..."#Удаление каталогов, содержащих резервные копии, старше недели
		find $Path -atime +7 | xargs rm -d
		if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Old BackUps files was deleted\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Old BackUps files is NOT deleted in $(date +%T)\n" >> $logfi#Удаление старых архивов бэкапов (старше 2 месяцев)echo"Удаление старых архивов резервных копий (старше 2 месяцев)..."
		find $Path -atime +61 | xargs rm -f
		if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Old BackUps archives was deleted\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Old BackUps archives is NOT deleted in $(date +%T)\n" >> $logfifielseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Archive is NOT created in $(date +%T)\n" >> $logfiecho"BackUp job finished in $(date +%T)"#запись в лог-файл времени окончания резервного копированияecho -en "BackUp job finished in $(date +%T)$(date +%T)\n" >> $logecho -en "_____________________________________________\n" >> $log

Contents of the HandBackUp.sh file:
#!/bin/bash#Куда положить бэкап
Path="/mnt/ZM/BackUps"#Куда положить архив бэкапа
ArchPath="/mnt/ZM/Archive"#Название домена Zimbra
ZDomain="zimbramail.home.local"#Список ящиков
MBoxes="/mnt/ZM/MBoxesList"#Текущая дата
CDate=$(date +%d-%m-%Y)
#Куда писать логиlog="/mnt/ZM/BackUpLog.txt"read -p "Введите имя почтового ящика (без указания домена), или ALL для резервного копирования всех почтовых ящиков: " A
if [[ "$A" = "ALL" || "$A" = "all" ]]; thenecho -en "BackUp started in $(date +%T)\n" >> $log#Запись списка ящиков в файлecho"Запись списка ящиков в файл..."
	/opt/zimbra/bin/zmprov -l gaa $ZDomain > $MBoxesif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Mail Boxes list created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Mail Box list is NOT created! in $(date +%T)\n" >> $logexitfiif ! [ -d $Path/$Date ]; then#Создание каталога резервного копирования
		mkdir -p $Path/$CDate/
		echo -en "BackUp directory created in $(date +%T)\n" >> $logelse#Создание резервных копий каждого ящика из спискаecho"Создание резервных копий каждого ящика из списка"for MailBox in $( cat $MBoxes); doecho"Создание резервной копии ящика $MailBox..."
			/opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBoxif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $logfidonefielse
	MailBox="$A@$ZDomain"#Проверка существования запрошенного ящикаecho"Проверка существования запрошенного ящика..."
	Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox)
	if [ $? -eq 0 ]; then#Запрошенный ящик существуетecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho"Запрошенный ящик $MailBox существует, резервное копирование..."echo -en "Required Mail Box $MailBox exist $(date +%T)\n" >> $log#Проверка существования каталога для резервного копированияif ! [ -d $Path/$Date ]; then#Создание резервной копии ящика
			mkdir -p $Path/$CDate/
			echo -en "BackUp directory created in $(date +%T)\n" >> $logelse#Создание резервной копии ящика $MailBox
			/opt/zimbra/bin/zmmailbox -z -m $MailBox getRestUrl "//?fmt=tgz" > $Path/$CDate/$MailBoxif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Mail Box $MailBox BackUp created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Mail Box $MailBox BackUp is NOT created! in $(date +%T)\n" >> $logfifielse#Запрошенный ящик не существовует - выходecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho"Запрошенный ящик $MailBox не существует. Завершение работы скрипта"echo -en "Required Mail Box $MailBox is not exist\n" >> $logexitfifiread -p "Хотите запустить архивацию резервной копии ящика $MailBox? [N]: " F
if [[ "$F" = "Y" || "$F" = "y" ]]; then#Проверка не существования каталога для архивирвоанияif [ ! -d $ArchPath ]; then#Создание каталога хранения резервных копийecho"Создание каталога хранения архивов..."
		mkdir -p $ArchPathif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Archive dirctory was created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Archive dirctory was NOT created in $(date +%T)\n" >> $logfielseecho"Каталог хранения архивов существует, архививрование..."fi#Создание архива резервной копииecho"Архивирование резервной копии..."if [[ "$A" = "ALL" || "$A" = "all" ]]; then
		tar -czf $ArchPath/$CDate.tar $Path/$CDateif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Archive created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Archive is NOT created in $(date +%T)\n" >> $logfielse
		tar -czf $ArchPath/$MailBox.tar $Path/$CDate/$MailBoxif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Archive created in $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Archive is NOT created in $(date +%T)\n" >> $logfifielseecho"Архив создан не будет"echo -en "User decline archive creating\n" >> $logfi#Очищаем файл со списком ящиковecho"Очистка файла со споском ящиков..."echo -n > $MBoxesif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echofiecho"BackUp job finished in $(date +%T)$(date +%T)"#запись в лог-файл времени окончания резервного копированияecho -en "BackUp job finished in $(date +%T)$(date +%T)\n" >> $logecho -en "_____________________________________________\n" >> $log

Contents of the Restore.sh file:
#!/bin/bash#Где лежат бэкапы
Path="/mnt/ZM/BackUps"#Название домена Zimbra
ZDomain="zimbramail.home.local"#Список ящиков
MBoxes="/mnt/ZM/MBoxesList"#Куда писать логиlog="/mnt/ZM/RestoreLog.txt"read -p "Дата резервной копии, которую необходимо восстановить в формате 02-09-2001: " Date
if ! [ -d $Path/$Date ]; thenecho"Нет резервных копий на указанную дату."echo -en "No BackUp file at $Date$(date +%T)\n" > $logexitfiread -p "Введите имя почтового ящика (без указания домена), или ALL для восстановления всех почтовых ящиков на указанную дату: " A
if [[ "$A" = "ALL" || "$A" = "all" ]]; thenecho -en "Restore started in $(date +%T)\n" >> $log#Запись списка ящиков в файл
	ls "$Path/$Date" > $MBoxesfor MailBox in $( cat $MBoxes); do#Проверка существования ящикаecho"Проверка существования ящика $MailBox"
		Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox)
		if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]"echoecho -en "Start restore job for $MailBox$(date +%T)\n" >> $logecho"Ящик $MailBox существует. Восстановление..."elseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Mail Box $MailBox does not exist, creating Mail Box $MailBox$(date +%T)\n" >> $logecho"Ящик $MailBox не существует. Создание ящика $MailBox..."#Проверка создания ящика
			Result=$(/opt/zimbra/bin/zmprov ca $MailBox 12345678 displayName "$MailBox")
			if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]"echoecho -en "Mail Box $MailBox is created, starting restore $(date +%T)\n" >> $logecho"Ящик $MailBox создан успешно. Восстановление..."elseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Can NOT create Mail Box $MailBox ! $(date +%T)\n" >> $logecho"Ящик $MailBox создать не удалось."fifi#Восстановление ящика
		Result=$(/opt/zimbra/bin/zmmailbox -z -m $MailBox postRestURL "//?fmt=tgz&resolve=replace"$Path/$Date/$MailBox)
		if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Ящик $MailBox восстановлен в $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Ящик $MailBox НЕ восстановлен! $(date +%T)\n" >> $logfidoneelse#Проверка существования запрошенной резервной копии
	MailBox="$A@$ZDomain"if [ -a $Path/$Date/$MailBox ]; then#Проверка существования ящикаecho"Проверка существования ящика $MailBox..."
		Result=$(/opt/zimbra/bin/zmprov getMailboxInfo $MailBox)
		if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]"echoecho -en "Start restore job for $MailBox$(date +%T)\n" >> $logecho"Ящик $MailBox существует. Восстановление..."elseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Mail Box $MailBox does not exist $(date +%T)\n" >> $logecho"Ящик $MailBox не существует."read -p "Хотите создать почтовый ящик с указанным именем и восстановить в него резервную копию? [N]: " B
			if [[ "$B" = "Y" || "$B" = "y" ]]; thenecho"Создание почтового ящика $MailBox..."
				Result=$(/opt/zimbra/bin/zmprov ca $MailBox 12345678 displayName "$MailBox")
				#Проверка создания ящикаif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]"echoecho -en "Mail Box $MailBox is created, starting restore $(date +%T)\n" >> $logecho"Ящик $MailBox создан успешно. Восстановление..."elseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echoecho -en "Can NOT create Mail Box $MailBox ! $(date +%T)\n" >> $logecho"Ящик $MailBox создать не удалось. Завершение работы скрипта..."exitfielse#Ящик не будет создан, нечего восстанавливать. Выходecho"Ящик не будет создан. Завершение работы скрипта"exitfifi#Восстановление ящика
		Result=$(/opt/zimbra/bin/zmmailbox -z -m $MailBox postRestURL "//?fmt=tgz&resolve=replace"$Path/$Date/$MailBox)
		if [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoecho -en "Ящик $MailBox восстановлен в $(date +%T)\n" >> $logelseecho -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]"echoecho -en "Ящик $MailBox НЕ восстановлен! $(date +%T)\n" >> $logfielse#Запрошенной резервной копии не существуетecho"Запрошенной резервной копии не существует. Завершение работы скрипта"echo -en "Required BackUp file is not exist\n" >> $logexitfifi#Очищаем файл со списком ящиковecho"Очистка файла со споском ящиков..."echo -n > $MBoxesif [ $? -eq 0 ]; thenecho -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"echoelseecho -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]"echofiecho"BackUp job finished in $(date +%T)$(date +%T)"#запись в лог-файл времени окончания резервного копированияecho -en "Restore job complete in $(date +%T)\n" >> $logecho -en "____________________________________\n" >> $log

There is one subtlety. If you create and edit script files for bash under Windows, then when you try to run the script, you will get the error: / bin / sh ^ M: bad interpreter: No such file or directory , which is that Windows editors add to the end of the line is the carriage return character "CR \ LF", which the editors in Linux do not display. But this symbol is there, and has not gone anywhere. To get rid of the error and remove the extra characters do the following:

$ cat your-script.sh | tr -d '\r' > corrected-your-script.sh

Well, or you can use the dos2unix utility, but it still needs to be installed:

$ yum install dos2unix
$ dos2unix your-script.sh

5) Making the scripts executable:

$ chmod 0740 /opt/zimbra/BkUpRestScripts/FullBackUp.sh
$ chmod 0740 /opt/zimbra/BkUpRestScripts/HandBackUp.sh
$ chmod 0740 /opt/zimbra/BkUpRestScripts/Restore.sh

6) I recommend using my hands to run scripts and check if they work and how they work.

7) Create a task in CRON for daily mailbox backup:

10 0 * * * root /opt/zimbra/ BkUpRestScripts/FullBackUp.sh

8) Enjoy

4. Script work


In case the comments in the scripts themselves did not help.

1) FullBaclUp.sh script:
В начале определяются переменные, какая за что отвечает – все прокомментировано.

Далее следует проверка отсутствия каталога для резервного копирования, если он не существует – создается. Делается вывод в лог-файл и на экран (если запущен руками) о успехе или не успехе создания каталога.

Проверка отсутствия каталога с сегодняшней датой. Если его нет — создается, так же вывод на экран и в лог результата создания каталога.

Запись в файл всех существующих почтовых ящиков Zimbra. Он нужен для последовательного резерварования каждого ящика. Вывод на экран результата выполнения команды.

Создание бэкапа для каждого ящика из полученного списка. С выводом результата выполнения на экран и в лог-файл.

Очистка файла со списком ящиков. Так как с этим файлом работают все 3 скрипта, то целесообразно чистить его после каждого прогона, чтобы не было неожиданностей. Можно чистить его и перед началом работы скрипта, но мне как-то привычнее не хранить лишних данных после выполнения работы, а делать одно и то же до и после работы скрипта – легкая степень шизофрении.

Далее блок по созданию сжатого архива.

Проверка отсутствия каталога хранения архивов, его создание при отсутствии и вывод на экран и в лог результата создания.

Архивирование.

Проверка «а не первое ли сегодня число?». Я предпочитаю долгосрочно хранить бэкапы за 1е числа всех месяцев, мне этого для работы достаточно. Можно и по неделям хранить, но зачастую это избыточно. А вот сверху поставлено условие хранения бэкапов за весь период работы почтового сервера, так что лежать им там веки вечные. Если число – первое, то полученный архив копируется в отдельный каталог “ Mounthly ”. И чтобы его туда скопировать – нужно проверить, нет ли такого каталога, и если нет – создать его, о чем сообщать на экран и в лог-файл.

Далее осуществляется чистка хранилища – удаляются все резервные копии старше 2х недель, а также архивы, старше 61 дня. Результат удаления выводится на экран и в лог-файл.

После чего скрипт пишет время завершения работы в лог-файл и на экран, и завершает свою работу.

2) HandBackUp.sh script:
В начале так же определяются переменные, так же прокомментированные для чего они нужны.

Далее пользователю предлагается ввести имя почтового ящика, который необходимо бэкапить, причем без указания домена Zimbra. (там написано в приглашении на ввод), или же выбрать бэкап всех почтовых ящиков, написав ALL или all.

Если выбрано резервное копирование всех ящиков, то скрипт работает почти так же, как и первый, приведенный выше, за исключением того, что после создания бэкапов каждого ящика, он спросит – а надо ли их архивировать?

Если был написан конкретный почтовый ящик, то осуществляется проверка его существования в Zimbra. Если ящик с указанным именем существует – то запускается процесс резервного копирования этого ящика, с выводом на экран и в лог-файл соответствующей информации. Если указанного ящика не существует – об этом будет сообщено пользователю, и скрипт завершит свою работу.

После завершения резервного копирования ящика будет предложено заархивировать копию. Если пользователь соглашается – идет проверка отсутствия каталога для складирования архива и далее по списку, как и в первом скрипте.

После завершения архивирования происходит очистка файла со списком ящиков. На всякий случай.

В конце выводится информация о времени завершения работы скрипта на экран и в лог-файл.

3) Restore.sh script:
Как и в предыдущих файлах, сначала – определение переменных с комментариями.

Приглашение пользователю выбрать дату резервной копии, которую нужно восстановить. Если указанной даты в бэкапах нет – скрипт завершается, сообщив об этом.

Если бэкапы на указанную дату существуют – приглашение пользователю ввести имя ящика, который нужно восстановить. Чтобы восстановить все ящики нужно написать ALL или all.

Если выбран параметр ALL, скрипт создает список файлов в папке бэкапа в файл, оповещает о результате создания.

Далее идет пошаговое восстановление каждого ящика. Сначала проверка существования ящика в системе, в случае отсутствия он создается, после чего восстанавливается. О каждой операции выводится информация в лог-файл и на экран.

Если выбран конкретный ящик – почти то же самое. Проверка существования файла с запрошенным именем. Вывод на экран и в лог-файл результата.

Проверка существования ящика в системе. Вывод на экран и в лог-файл результата.
Приглашение пользователю согласиться с созданием ящика в случае отсутствия такового в системе. Вывод на экран и в лог-файл результата.

Создание ящика в случае согласия. Вывод на экран и в лог-файл результата.
Восстановление ящика. Вывод на экран и в лог-файл результата.

Очистка файла со списком ящиков на восстановление.

В конце выводится информация о времени завершения работы скрипта на экран и в лог-файл.

5. Regarding recovery


If we slightly modify these scripts, they are also quite suitable for moving mail from the server to the server, simply by creating in the new place boxes with all the content. It is also possible to restore the work of the system from scratch, when for some reason it is easier to re-raise the Zimbra server than to try to revive the old one. As it was written above, you can save the image of a configured virtual machine, expand it if necessary, and fill in all the data in it. The same algorithm of actions when moving from one Zimbra server to another. And you do not need any paid utilities like Zextras.

6. Conclusion


In general, there is nothing difficult in the scripts written by me. Yes, there are a lot of conditions in them, because I tried to foresee as many problems and errors in their work as possible, but I also tried to comment on the work of the script as clearly as possible. Most likely, “out of the box” they will not earn for everyone. Maybe this method of backup will not suit anyone at all. But I hope many will be useful.

7. PS:


This is the second article in the series “how I implemented Zimbra”. The first is about implementation, LDAP authorization and automatic creation of mailboxes for AD users, right here .

And I also want to note that this is my first experience with scripting on bash, because of this, the scripts turned out to be so cumbersome and “for especially smart”, as they say.

Also popular now: