Перенос данных между различными версиями Zimbra безопасно и без простоя

  • Автор:

zimbra-server-migration-000.pngПредставляем вашему вниманию перевод статьи зарубежного автора, в которой он подробно рассказывает о процессе переноса данных между двумя серверами Zimbra OSE разных версий, работающих под управлением разных операционных систем. На наш взгляд данный материал будет полезен широкому кругу администраторов почтовых серверов, тем более что аналогичного по полноте и проработанности русскоязычного материала нам не попадалось. В процессе перевода мы немного адаптировали материал для читателей нашего блога, не затрагивая при этом основной смысл исходной статьи.

Немного предыстории

После четырех лет работы почтового сервера Zimbra в виртуальной машине объемом в 500 ГБ сервер начал испытывать недостаток свободного места и когда вывод df -h показал, что осталось всего 50 ГБ пришло время перейти на более емкую виртуальную машину.

Бесплатная версия, с которой я работал (и продолжаю работать) не имеет в своем составе инструментов для миграции, хотя в интернете можно найти массу инструкций о переносе данных между старым и новым серверами при помощи rsync. Но этот способ меня не устраивал. Во-первых, требовался простой системы, а во-вторых, синхронизацию требуется проводить между одинаковыми серверами, т.е. мой новый сервер должен был оставаться Zimbra 8.6 под управлением CentOS 6.

Также некоторое время назад был случай аварийного завершения работы сервера (из-за сбоя питания) и база данных оказалась повреждена, что время от времени приводило к ошибкам в логах. То, что с базой не все в порядке стало очевидно после попытки обновления до 8.7.1, которая с треском провалилась и единственное что меня спасло - это сделанная прошлой ночью резервная копия. Поэтому я опасался, что при переносе с помощью rsync я перемещу на новый сервер проблемные данные, которые будут доставлять мне проблемы в будущем.

Так как мне все равно предстояло преодолеть множество сложностей, я хотел получить не только больше свободного места, но и перейти на новую операционную систему CentOS 7 и новую (на тот момент) версию Zimbra 8.7.1, поэтому об rsync не могло быть и речи.

Zmmailbox и bash спешат на помощь

Если вы хоть немного занимались администрированием Zimbra, то вам должна быть знакома такая команда как zmprov. Вы могли использовать ее для сброса забытого пароля администратора, получения списка учетных записей, использующих пересылку почты или делать многие другие вещи, не заходя в веб-интерфейс. Также вы можете быть немного знакомы с zmmailbox.

Zmmailbox, также как и zmprov, очень мощная команда, ее можно использовать для таких тривиальных вещей, как создание почтовой папки, а можно с ее помощью экспортировать в формат tgz целые почтовые ящики с любой структурой пользовательских папок.

Единственным недостатком является то, что вы должны экспортировать каждый ящик отдельно, не допускается использовать * или иные подстановочные символы. Но мы же работаем в Linux, поэтому всегда можно написать bash-скрипты, которые сделают всю тяжелую работу за нас.

Подготовка нового сервера

Вам потребуется установить новый сервер с теми же настройками, что и у старого, но с иным IP-адресом. Не забудьте правильно настроить записи на внутреннем DNS-сервере (dnsmasq) и проверить /etc/hosts. При этом не следует заводить все обслуживаемые сервером домены, укажите только основной, остальные мы перенесем со старого сервера автоматически.

План перехода на новый сервер

Чтобы обеспечить минимальное время простоя мы будем действовать следующим образом:

  1. Установите значение TTL для DNS-записей относящихся к почтовому серверу на минимально короткое время, лучше сделать это не менее чем за сутки до переноса.
  2. Подготовьте полностью рабочий новый сервер
  3. Импортируйте все обслуживаемые домены со старого сервера
  4. Перенесите все учетные записи, пароли, списки рассылки и псевдонимы
  5. Измените все записи DNS и перенаправьте на брандмауэре 25 порт на новый сервер (или не меняя DNS поменяйте местами IP-адреса серверов)
  6. Убедитесь, что новая почта приходит на новый сервер
  7. Убедитесь, что пользователи могут подключаться и работать с новым сервером
  8. Экспортируйте почтовые ящики на старом сервере и загрузите их на новый

Прежде чем продолжить

Время выполнения команд во время экспорта или импорта могут занимать продолжительное время, измеряемое часами. Их следует запускать непосредственно в консоли сервера, если же вы вынуждены выполнять все действия удаленно, убедитесь что вы используете команду screen, чтобы при разрыве связи вы могли повторно подключиться к сеансу без прерывания работы команды.

Важно! Прерывание работы любого из описанных ниже сценариев во время импорта может привести к повреждению базы данных, поэтому запускайте их из только из консоли сервера или используя команду screen! Мы вас предупредили.

Подготовка к переносу

Прежде чем начать экспорт нужно убедиться, что у нас достаточно места для хранения, которое доступно как со старого, так и с нового сервера. На старом сервере у меня совсем не было свободного места, тогда как на новом свободен был почти целый 1 ТБ, поэтому в моем случае было сделано удаленное монтирование NFS-ресурса с нового сервера и использование его в качестве промежуточного хранилища.

Вы можете использовать иные способы: USB-диски, сетевые ресурсы, iSCSI и т.д. В общем - на ваше усмотрение.

Следующие шаги предполагают, что промежуточное хранилище находится в /migration/zimbra, если ваш путь отличается, то вам нужно соответствующим образом изменить сценарии. Чтобы везде был порядок, мы будем использовать разные папки для разных файлов миграции, также убедитесь, что пользователь zimbra имеет полный доступ к папкам. Я бы порекомендовал:

chmod -R 777 /migration/zimbra
chown -R zimbra:zimbra /migration/zimbra

Шаг 1. Экспорт доменов

su - zimbra
cd /migration/zimbra
mkdir domains
cd domains
zmprov gad | tee -a domains.txt

Команда выполняется всего несколько секунд, в зависимости от количества обслуживаемых доменов, просмотреть получившийся список можно командой:

cat domains.txt

zimbra-server-migration-001.pngШаг 2. Экспорт аккаунтов

Вернитесь в /migration/zimbra и создайте новый каталог accounts. Затем экспортируем туда учетные записи администраторов:

cd /migration/zimbra
mkdir accounts
cd accounts
zmprov gaaa | tee -a admins.txt

Посмотреть список экспортированных аккаунтов вы также можете командой cat, затем экспортируем пользовательские аккаунты:

zmprov -l gaa | tee -a users.txt

Шаг 3. Экспорт данных учетных записей

Снова вернемся в /migration/zimbra и создадим новый каталог account_details, в него экспортируем данные учетных записей:

cd /migration/zimbra
mkdir account_details
cd account_details
for user in `cat ../accounts/users.txt`; do zmprov ga $user | grep -i Name: | tee -a $user.txt ; done

Шаг 4. Экспорт паролей учетных записей

Также возвращаемся в /migration/zimbra, где создаем каталог passwords в который экспортируем пароли:

cd /migration/zimbra
mkdir passwords
cd passwords
for user in `cat ../accounts/users.txt`; do zmprov -l ga $user userPassword | grep userPassword: | awk '{ print $2}' | tee -a $user.shadow; done

Шаг 5. Экспорт списков рассылок

Вернемся в /migration/zimbra и создадим каталог distribution_lists, в который выгрузим списки рассылок:

cd /migration/zimbra
mkdir distribution_lists
cd distribution_lists
zmprov gadl | tee -a distribution_lists.txt
for list in `cat distributinlist.txt`; do zmprov gdlm $list > $list.txt ;echo "$list"; done

Шаг 6. Экспорт псевдонимов

Также создадим в каталоге /migration/zimbra директорию aliases и экспортируем туда псевдонимы:

cd /migration/zimbra
mkdir aliases
cd aliases
for user in `cat ../accounts/users.txt`; do zmprov ga $user | grep zimbraMailAlias | awk '{print $2}' | tee -a $user.txt ;echo $i ;done

Этот процесс займет некоторое время, в зависимости от количества учетных записей, а так как многие аккаунты не имеют псевдонимов, то мы получим много пустых файлов. Удалим их командой:

find . -type f -empty | xargs -n1 rm -v

Таким образом мы экспортировали со старого сервера все данные, кроме самих ящиков пользователей и любых созданных ими фильтров.

Шаг 7. Импорт доменов на новом сервере

Первый шаг в процессе восстановления на новом сервере заключается в восстановлении доменов, если вы уже создали основной домен, то можете удалить его из файла /migration/zimbra/domains/domains.txt.

Далее предполагается, что все данные, которые мы экспортировали в прошлых шагах, доступны или скопированы на новый сервер. Если вы копировали данные, то не забудьте выполнить команду:

chown -R zimbra:zimbra /migration/zimbra 

для того, чтобы пользователь zimbra имел полный доступ к файлам и каталогам.

Давайте начнем, войдите в систему под пользователем zimbra и выполните следующие команды:

su - zimbra
cd /migration/zimbra/domains
for domain in `cat domains.txt `; do zmprov cd $domain zimbraAuthMech zimbra ;echo $domain ;done

Для проверки можно зайти в админку и убедиться, что все домены успешно импортированы.

Шаг 8. Импорт учетных записей и паролей

Для этого нам потребуется небольшой скрипт. Восстановление каждой учетной записи происходит в два этапа: создание на новом сервере аккаунта с временным паролем, который затем будет заменен на пароль пользователя.

Перейдем в /migration/zimbra, где следует создать каталог scripts. В нем при помощи любимого редактора создадим и откроем файл restore_accounts.sh:

cd /migration/zimbra
mkdir scripts
cd scripts
nano restore_accounts.sh

Внесем в него следующие строки и сохраним:

#!/bin/bash
PASSWDS="../passwords"
ACCOUNT_DETAILS="../account_details"
USERS="../accounts/users.txt"
for i in `cat $USERS`
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

Сделаем его исполняемым и запустим:

chmod +x restore_accounts.sh
./restore_accounts.sh

В процессе импорта вы можете время от времени получать сообщение об ошибке:

ERROR: account.ACCOUNT_EXISTS (email address already exists: admin@domain.com, at DN: uid=admin,ou=people,dc=domain,dc=com)

Это означает, что данные учетные записи уже существуют. Это справедливо для учетной записи администратора и служебных учетных записей, перед импортом вы можете удалить их из файла /migration/zimbra/accounts/users.txt.

Также имейте ввиду, что после выполнения сценария пароль администратора нового сервера будет заменен паролем со старого, если вы конечно не удалите запись admin@domain.com из users.txt

Шаг 9. Импорт списков рассылки

Перейдите в /migration/zimbra и выполните следующую команду, чтобы заново создать списки рассылки:

for lists in `cat  distribution_lists/distribution_lists.txt`; do zmprov cdl distribution_lists/$lists ; echo "$lists -- done " ; done

Теперь заполним их, используя короткий bash-скрипт. Перейдем в /migration/zimbra/distribution_lists и откроем на редактирование скрипт restore_dist_lists.sh:

cd /migration/zimbra/distribution_lists
nano restore_dist_lists.sh

Внесем в него следующий текст:

#!/bin/bash
for list in `cat distribution_lists.txt`
do
for mbmr in `grep -v '#' ./$list.txt | grep '@'`
do
zmprov adlm $list $mbmr
echo " $mbmr has been added to $list"
done
done

Сделаем исполняемым и выполним:

chmod +x restore_dist_lists.sh
./restore_dist_lists.sh

Этот сценарий может занять несколько минут, в зависимости от количества списков рассылки и от количества учетных записей в каждом из них.

Шаг 10. Импорт псевдонимов

Как вы уже догадались, перейдем в /migration/zimbra и создадим новый скрипт restore_aliases.sh:

cd /igration / zimbra / aliases
nano restore_aliases.sh

Внесем в него следующий текст:

#!/bin/bash
echo "Processing User accounts"
for user in `cat ../accounts/users.txt`
do
echo $user
if [ -f "./$user.txt" ]; then
for alias in `grep '@' ./$user.txt`
do
zmprov aaa $user $alias
echo "$user ALIAS $alias - Restored"
done
fi
done
echo "Processing Admin accounts"
for user in `cat ../accounts/admins.txt`
do
echo $user
if [ -f "./$user.txt" ]; then
for alias in `grep '@' ./$user.txt`
do
zmprov aaa $user $alias
echo "$user ALIAS $alias - Restored"
done
fi
done

Сделаем исполняемым и выполним:

chmod +x restore_aliases.sh
./restore_aliases.sh

Шаг 11. Подключаем новый сервер к сети и переводим старый в автономный режим

На данный момент мы перенесли все учетные записи, псевдонимы и списки рассылки, фактически у нас есть полностью рабочий новый сервер. На всякий случай перезапустим службы zimbra и проверим их состояние:

zmcontrol restart
zmcontrol status

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

После чего войдите в почту обычным пользователем и проверьте, можете ли вы отправлять письма на учетные записи своего домена, так как Zimbra использует локальный DNS и считает себя почтовым сервером для вашего домена, такая доставка должна происходить мгновенно.

Также проверьте /var/log/zimbra.log на наличие ошибок.

Если все хорошо, то самое время переключить сервера. Есть два способа сделать это:

  • Измените все DNS-записи и переадресацию портов на брандмауэре на новый IP-адрес сервера
  • Дождитесь распространения DNS-записей, прежде чем продолжить миграцию

или же

  • Отключите новый сервер от сети
  • Измените его IP-адрес на адрес старого сервера
  • Измените /etc/hosts и настройки /etc/dnsmasq.conf соответственно
  • Перезапустите службы Zimbra
  • Убедитесь, что сервер может отправлять / получать электронную почту на адреса собственного домена
  • Отключите старый сервер от сети
  • Подключите новый сервер к сети
  • Измените IP-адрес старого сервера на неиспользуемый IP-адрес
  • Измените его /etc/hosts и настройки /etc/dnsmasq.conf соответственно
  • Перезапустите службы Zimbra
  • Подключите его снова к сети, чтобы продолжить миграцию данных

Второй метод выглядит более сложным, но он гарантирует нулевое время простоя. Хотите верьте, хотите нет, но на мой взгляд это самый быстрый способ переключения на новый сервер.

После переключения все пользователи, использующие IMAP или веб-клиент, обнаружат пустой почтовый ящик, но вся новая почта будет доставляться на новый сервер.

В последних шагах мы экспортируем содержимое почтовых ящиков со старого сервера и перенесем их на новый.

Шаг 12. Перенос данных почтовых ящиков

Это шаг будет наиболее продолжительным, в зависимости от объема ящиков он может занять сутки и более, импорт данных потребует столько же времени.

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

Войдите на старый сервер через консоль или используя команду screen. Предполагается что промежуточное хранилище снова смонтировано на старом сервере по прежнему пути.

Сменим учетную запись на zimbra и перейдем в /migration/zimbra, затем начнем экспорт содержимого ящиков:

su - zimbra
cd /migration/zimbra
mkdir mailbox_data
cd mailbox_data
for user in `cat ../accounts/users.txt`; do echo "Exporting mailbox $user" ; zmmailbox -z -m $user getRestURL '/?fmt=tgz' > ./$user.tgz ; done

Выполнение последней команды займет продолжительное время, поэтому можете смело переключиться на иные задачи.

Если какие-либо ящики выдают ошибки во время экспорта, то запишите эти учетные записи, чтобы попробовать экспортировать их еще раз позже. Список таких аккаунтов разместите в /migration/zimbra/accounts/problematic_accounts.txt, затем можете повторить экспорт командой:

for user in `cat ../accounts/problematic_accounts.txt`; do echo "Exporting mailbox $user" ; zmmailbox -z -m $user getRestURL '/?fmt=tgz' > ./$user.tgz ; done

После того, как завершится экспорт содержимого ящиков, следует экспортировать пользовательские фильтры, для этого понадобится еще один скрипт, создадим новый каталог filters с файлом export_filters.sh в нем.

mkdir /migration/zimbra/filters
cd /migration/zimbra/filters
nano export_filters.sh

Внесем в него следующий текст:

#!/bin/bash
mkdir tmp
set -x
clear
for user in `cat ../accounts/users.txt`;
do
filter=`zmprov ga $user zimbraMailSieveScript > ./tmp/$user`
sed -i -e "1d" ./tmp/$user
sed 's/zimbraMailSieveScript: //g' ./tmp/$user > ./$user;
rm ./tmp/$user
echo "Export filter for $user"
done
\rm -rf tmp

Сделаем исполняемым и запустим:

chmod +x export_filters.sh
./export_filters.sh

Смонтируем, скопируем или иным образом перенесем промежуточное хранилище на новый сервер. Затем перейдем в /migration/zimbra/mailbox_data и выполним:

cd /migration/zimbra/mailbox_data
for mailbox in `cat ../accounts/users.txt`; do zmmailbox -z -m $mailbox postRestURL "/?fmt=tgz&resolve=skip" ./$mailbox.tgz ; echo "$mailbox - done "; done

Этот процесс также займет много времени, при этом пользователи могут продолжать использовать сервер, когда подойдет их очередь - они увидят, как их ящик начал заполняться письмами со старого сервера.

Если во время импорта вы получили ошибки, можно повторно выгрузить и загрузить проблемные учетные записи, соответственно изменив /migration/zimbra/accounts/users.txt и повторно выполнив команду экспорта. Если вы получаете ошибки типа broken pipe, это означает, что архив tgz был поврежден во время передачи по тем или иным причинам и не может быть распакован.

Давайте теперь импортируем пользовательские фильтры. Перейдем в /migration/zimbra/filters и создадим скрипт import_filters.sh:

cd /migration/zimbra/filters
nano import_filters.sh

Внесем в него следующие строки:

#!/bin/bash
for filter in ./*
do
if [ "$filter" == "./import_filters.sh" ] ; then
continue;
fi

if [ "$filter" == "./export_filters.sh" ] ; then
continue;
fi
if [ "$filter" == "./tmp" ] ; then
continue;
fi
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"

Сделаем исполняемым и выполним:

chmod +x import_filters.sh
./import_filters.sh

Заключение

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

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

Источник: Migrating opensource Zimbra 8.6.0 on Centos 6.8 to Zimbra 8.7.1 on Centos 7 safely and with no downtime!

Перевод: Уваров А.С.

Дополнительные материалы:


  1. Zimbra - почтовый сервер и не только...
  2. Экспорт и установка сертификата Zimbra
  3. Установка сертификата при помощи групповых политик
  4. Zimbra. Сбор почты с внешних аккаунтов
  5. Zimbra. Включаем SMTP-аутентификацию для внутренней сети
  6. Сравнение возможностей бесплатной и коммерческой версий Zimbra
  7. Zimbra. Настраиваем протоколы доступа к веб-интерфейсу
  8. Zimbra. Обновляем установленную версию до 8.6
  9. Перевыпуск самоподписанного сертификата Zimbra
  10. Zimbra. Обновляем операционную систему (Ubuntu Server)
  11. Zimbra. Обновляем установленную версию до 8.7
  12. Перенос данных между различными версиями Zimbra безопасно и без простоя