Перенос почтовых ящиков и почты Zimbra с одного сервера на другой


Мы рассмотрим универсальный способ переноса данных Zimbra со старого сервера на новый. По сути, данная инструкция является рерайтом другой инструкции Перенос данных между различными версиями Zimbra безопасно и без простоя. Но для упрощения восприятия и использования в качестве шпаргалки, упускаются детали.
Предполагается, что у нас уже есть почтовый сервер Zimbra на новом сервере. В противном случае можно воспользоваться другой инструкцией Установка и настройка Zimbra на Linux.
Подготовка
Структурные данные
Экспорт
Подготовка к импорту
Импорт
Данные пользователей
Экспорт
Подготовка
Импорт
Учетные записи администраторов
Подготовка
На новом и старом серверах создаем каталог, в который будут складываться файлы для импорта и экспорта:
mkdir -p /backup/zimbra
Выдадим разрешающие права на созданную папку для пользователя zimbra:
chown -R zimbra:zimbra /backup/zimbra
На старом сервере входим под пользователем zimbra:
su - zimbra
Переходим в созданный ранее каталог:
cd /backup/zimbra
Можно приступать к экспорту.
Перенос структурной информации
Сначала мы перенесем информацию о доменах, пользователях, группах рассылки и псевдонимах. Эти данные экспортируются и импортируются, относительно, быстро.
Экспорт данных
Начнем с экспорта — выполняем команды на старом (текущем сервере).
1. Домены:
zmprov gad | tee -a domains.txt
Проверяем:
cat domains.txt
2. Учетные записи администраторов:
zmprov gaaa | tee -a admins.txt
3. Учетные записи пользователей:
zmprov -l gaa | tee -a users.txt
4. Настройки пользователей:
mkdir users_settings
for user in `cat users.txt`; do zmprov ga $user | grep -i Name: | tee -a users_settings/$user.txt ; done
* операция может занять некоторое время.
5. Пароли:
mkdir passwords
for user in `cat users.txt`; do zmprov -l ga $user userPassword | grep userPassword: | awk '{ print $2}' | tee -a passwords/$user.shadow; done
6. Группы рассылки:
zmprov gadl | tee -a distribution_lists.txt
И список адресов, которые входят в группы рассылки:
mkdir distribution_lists
for list in `cat distribution_lists.txt`; do zmprov gdlm $list > distribution_lists/$list.txt ; echo "$list"; done
7. Псевдонимы:
mkdir aliases
for user in `cat users.txt`; do zmprov ga $user | grep zimbraMailAlias | awk '{print $2}' | tee -a aliases/$user.txt ; echo $i ; done
Удалим пустые файлы с алиасами (для записей которых нет псевдонимов):
find aliases/ -type f -empty | xargs -n1 rm -v
Готово. Мы выполнили импорт всех нужных нам список. Мы должны получить следующий список файлов:
[zimbra@mail zimbra]$ ll
total 24
-rw-r----- 1 zimbra zimbra 52 Jun 12 09:31 admins.txt
drwxr-x--- 2 zimbra zimbra 151 Jun 12 10:46 aliases
drwxr-x--- 2 zimbra zimbra 264 Jun 12 10:35 distribution_lists
-rw-r----- 1 zimbra zimbra 170 Jun 12 10:22 distribution_lists.txt
-rw-r----- 1 zimbra zimbra 69 Jun 12 09:28 domains.txt
drwxr-x--- 2 zimbra zimbra 4096 Jun 12 09:51 passwords
-rw-r----- 1 zimbra zimbra 878 Jun 12 09:34 users.txt
drwxr-x--- 2 zimbra zimbra 4096 Jun 12 09:43 users_settings
Приступаем к переносу данных и импорту.
Подготовка к импорту
Перенесем полученные файлы на новый сервер. Для этого есть несколько способов, например, с помощью WinSCP. Мы же просто перенесем данные командой rsync или scp — рассмотрим оба примера.
а) с помощью rsync:
rsync -a -e 'ssh -p <SSH-порт>' /backup/zimbra <учетная запись на новом сервере>@<IP-адрес нового сервера>:/tmp/
Например:
rsync -a -e 'ssh -p 22' /backup/zimbra root@192.168.1.20:/tmp/
б) с помощью scp:
scp -r -P <SSH-порт> /backup/zimbra <учетная запись на новом сервере>@<IP-адрес нового сервера>:/tmp/
Например:
scp -r -P 22 /backup/zimbra root@192.168.1.20:/tmp/
После того, как мы перенесли файлы в каталог /tmp на новом сервере, подключаемся к последнему и переносим эти файлы в каталог /backup:
mv /tmp/zimbra /backup/
Задаем нужные права на перенесенные файлы:
chown -R zimbra:zimbra /backup/zimbra
Устанавливаем локаль с кириллицей в UTF-8:
localedef -i ru_RU -f UTF-8 ru_RU
Заходим под учетной записью zimbra:
su - zimbra
Переходим в каталог:
cd /backup/zimbra
Экспортируем системную переменную:
export LC_ALL=ru_RU.UTF-8
* это необходимо для корректного отображения символов на кириллице.
Переходим, непосредственно, к импорту.
Импорт данных
Выполним обратные операции на новом сервере, которые приведут к созданию необходимых нам данных и настроек. После каждой операции рекомендуется заходить на веб-интерфейс почтовой системы и проверять перенос.
1. Домены:
for domain in `cat domains.txt` ; do zmprov cd $domain zimbraAuthMech zimbra ; echo $domain ; done
2. Учетные записи, их настройки и пароли.
Процесс выполняется с помощью скрипта. Создадим его:
vi restore_accounts.sh
PASSWDS="passwords"
ACCOUNT_DETAILS="users_settings"
for i in `cat users.txt`
do
givenName=$(grep givenName: $ACCOUNT_DETAILS/$i.txt | cut -d ":" -f2)
displayName=$(grep displayName: $ACCOUNT_DETAILS/$i.txt | cut -d ":" -f2)
shadowpass=$(cat $PASSWDS/$i.shadow)
zmprov ca $i "TeMpPa55^()" cn "$givenName" displayName "$displayName" givenName "$givenName"
zmprov ma $i userPassword "$shadowpass"
done
И запускаем его на выполнение:
bash ./restore_accounts.sh
3. Списки рассылки:
for lists in `cat distribution_lists.txt`; do zmprov cdl $lists ; echo "$lists -- done " ; done
А также их содержимое (создадим сначала скрипт):
vi restore_dist_lists.sh
for list in `cat distribution_lists.txt`
do
for mbmr in `grep -v '#' distribution_lists/$list.txt | grep '@'`
do
zmprov adlm $list $mbmr
echo " $mbmr has been added to $list"
done
done
Запускаем его на выполнение:
bash ./restore_dist_lists.sh
4. Псевдонимы.
Создаем скрипт:
vi restore_aliases.sh
echo "Processing User accounts"
for user in `cat users.txt`
do
echo $user
if [ -f "aliases/$user.txt" ]; then
for alias in `grep '@' aliases/$user.txt`
do
zmprov aaa $user $alias
echo "$user ALIAS $alias - Restored"
done
fi
done
echo "Processing Admin accounts"
for user in `cat admins.txt`
do
echo $user
if [ -f "aliases/$user.txt" ]; then
for alias in `grep '@' aliases/$user.txt`
do
zmprov aaa $user $alias
echo "$user ALIAS $alias - Restored"
done
fi
done
Запускаем его:
bash restore_aliases.sh
Со структурой разобрались. Идем дальше.
Перенос данных
Теперь переходим к переносу самого главного, а именно почтовых сообщений. Также мы перенесем пользовательские фильтры.
Данную операции стоит уже делать после полного перехода на новый сервере (как правило, после смены записей MX и перевода пользователей на использование нового сервера.
Экспорт
На старом сервере выполним экспорт. По своему принципу, действия одинаковые, как мы выполняли выше. Также напомню, что мы должны зайти под пользователем zimbra и перейти в наш рабочий каталог:
su - zimbra
cd /backup/zimbra
1. Почта.
Создаем каталог, где будут размещены наши файлы с выгруженной почтой:
mkdir mailbox_data
Запускаем команду:
for user in `cat users.txt`; do echo "Exporting mailbox $user" ; zmmailbox -z -m $user getRestURL '/?fmt=tgz' > mailbox_data/$user.tgz ; done
Данная операция может выполняться долго. Это зависит от объема почтовых сообщений.
2. Фильтры.
Создаем каталог:
mkdir filters
Создаем скрипт:
vi export_filters.sh
mkdir tmp
set -x
clear
for user in `cat users.txt`;
do
filter=`zmprov ga $user zimbraMailSieveScript > ./tmp/$user`
sed -i -e "1d" ./tmp/$user
sed 's/zimbraMailSieveScript: //g' ./tmp/$user > filters/$user;
rm ./tmp/$user
echo "Export filter for $user"
done
\rm -rf tmp
И выполняем его:
bash ./export_filters.sh
В каталоге filters мы получим файлы с пользовательскими правилами.
Перенос файлов
Теперь нам нужно перенести полученные данные на новый сервер. Это будут два каталога:
- mailbox_data
- filters
Для этого мы можем воспользоваться вышеописанными командами rsync или scp, например:
rsync -a -e 'ssh -p 22' /backup/zimbra/mailbox_data /backup/zimbra/filters root@192.168.1.20:/tmp/
... или
scp -r -P 22 /backup/zimbra/mailbox_data /backup/zimbra/filters root@192.168.1.20:/tmp/
После чего на новом сервере перенесем каталоги из /tmp в рабочую директорию:
mv /tmp/mailbox_data /tmp/filters /backup/zimbra/
Задаем права:
chown -R zimbra:zimbra /backup/zimbra
Импорт
Переходим на новый сервер. Заходим под пользователем zimbra в рабочий каталог:
su - zimbra
cd /backup/zimbra
Мы готовы к импорту.
1. Почта:
for mailbox in `cat users.txt`; do zmmailbox -z -m $mailbox postRestURL "/?fmt=tgz&resolve=skip" mailbox_data/$mailbox.tgz ; echo "$mailbox - done "; done
* операция займет много времени, особенно, для больших почтовых ящиков.
2. Фильтры.
Для импорта фильтров нужно создать скрипт:
vi import_filters.sh
for filter in filters/*
do
Filter_String=`cat "$filter"`
Account=$filter
zmprov ma $(echo $filter | grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b") zimbraMailSieveScript "$Filter_String"
echo "Process filter $Account"
done
echo "All filter has been import successfully"
И запускаем его командой:
bash import_filters.sh
Собственно, импорт данных выполнен.
Учетные записи администраторов
После переноса учетных записей, они создаются как пользователи с обычными правами. В начале нашей выгрузки мы создали файл admins.txt. Смотрим его содержимое:
cat admins.txt
И веб-панели управления zimbra переходим в Управление - Учетные записи. Кликаем дважды по нужным учетным записям, которые должны иметь права администратора, ставим галочку Глобальный администратор и нажимаем Сохранить.