Перенос почтовых ящиков и почты 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 переходим в Управление - Учетные записи. Кликаем дважды по нужным учетным записям, которые должны иметь права администратора, ставим галочку Глобальный администратор и нажимаем Сохранить.

# Linux # Почта # Резервное копирование # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет