Теперь, когда все учётки перенесены, можно начинать синхронизировать ящики. Но само собой разумеется если ящиков много, паролей мы не знаем. Поэтому, нужно сделать финт ушами а именно:
- Создать задачу на синхронизацию с одинаковым паролем на стороне зимбры
- Заменить сервер зимбра на сервер mailcow (заменой айпишников или доменного имени)
- Заменить все пароли на зимбре на один, но известный.
Создаём задачи синхронизации:
Само собой если ящиков штук 100 и больше, создавать задачи на синхронизацию руками это с ума сойдёшь.
Поэтому надо воспользоваться mailcow api и баш скриптингом.
В админке mailcow найдите пункт api и сгенерируйте ключ. Сохраните этот ключ в файл mailcowapi.
Так же нам понадобится файл emails.txt который мы получили в прошлой статье. В этом файле уберите все лишние емейлы, которые не надо синхронизировать.
И вот нужный скрипт:
Код: Выделить всё
#!/usr/bin/env bash
set -euo pipefail
MAILCOW_URL="https://cow.domain.ru"
API_KEY="$(< mailcowapi)"
SOURCE_HOST="zimbra.domain.ru"
SOURCE_PORT="993"
SOURCE_PASSWORD="123"
while IFS= read -r EMAIL; do
[[ -z "$EMAIL" ]] && continue
echo "Creating sync job for $EMAIL"
RESPONSE=$(
curl -s -k \
-X POST \
"${MAILCOW_URL}/api/v1/add/syncjob" \
-H "X-API-Key: ${API_KEY}" \
-H "Content-Type: application/json" \
-d "{
\"username\":\"${EMAIL}\",
\"host1\":\"${SOURCE_HOST}\",
\"port1\":\"${SOURCE_PORT}\",
\"user1\":\"${EMAIL}\",
\"password1\":\"${SOURCE_PASSWORD}\",
\"enc1\":\"SSL\",
\"mins_interval\":\"20\",
\"maxage\":\"0\",
\"exclude\":\"(?i)spam|(?i)junk\",
\"maxbytespersecond\":\"0\",
\"delete2duplicates\":\"1\",
\"delete1\":\"0\",
\"automap\":\"1\",
\"subscribeall\": \"1\"
\"skipcrossduplicates\":\"0\",
\"custom_params\":\"\",
\"active\":\"1\"
}"
)
echo "$RESPONSE"
done < emails.txtВнимание!
Перед тем как запустите реальную синхронизацию, настоятельно рекомендую поправить конфиг dovecot fts в mailcow, особенно рекомендую поправить в mailcow.conf количество памяти, которое разрешено будет жрать индексатору. По-умолчанию установлено 128 Мегабайт, я рекомендую как минимум 512 а лучше и 1024.
Переключаем местами серверы zimbra и mailcow
Я не могу тут ничего комментировать, поскольку конфиг у всех разный. Однако, чтобы синхронизация ящиков началась, все пароли на зимбре придётся сбросить. Кроме того, нам нужно чтобы почта приходила уже на новый сервер, чтобы не приходилось циклично синхронизировать почту, которая будет прилетать пока синхронизация будет идти. Так что нам нужно запустить новый сервер и временно оставить юзеров без почты. По скорости могу сказать так, на не очень хороших серверах 2 Тб почты синхронизировались 3 суток.
Поэтому теперь вы должны активировать новый сервер и убедится что почта ходит именно на него и отправляется с него. Как именно устроена ваша сеть и как вы это сделаете решать вам.
Я просто убрал внешний ip адрес и оставил зимбру только на локальном ip адресе.
Заменяем все пароли в зимбре
Теперь когда вы готовы, нам опять потребуется файл emails.txt
Кстати, если у вас рядом находятся сотрудники, которые могут ввести свой пароль, пригласите их чтобы они в sync job просто ввели свой текущий пароль, и исключите их из emails.txt. Я именно так и поступил, запустил синхронизацию в первую очередь тех ящиков, которые очень большие.
Далее, в зависимости от того как вы перенесли зимбру у вас может возникнуть проблема с заменой паролей.
Нам нужно обеспечить работу ldap. если ldap висел на внешнем адресе, нужно либо в /etc/hosts заменить внешний адрес на внутренний, либо в localconfig зимбры заменить ldap bind url вот таким образом:
Код: Выделить всё
zmlocalconfig -e ldap_bind_url=ldap://localzimbra.domain.ru:389Действуйте в соответствии с вашей конфигурацией.
И вот такой скрипт, который мы запускаем от root, после того как вы поправите конфигурацию ldap:
Код: Выделить всё
#!/usr/bin/env bash
MAILBOX_LIST="emails.txt"
NEWPASS="123"
while IFS= read -r account; do
[ -z "$account" ] && continue
echo "Changing password for $account"
su - zimbra -c "zmprov sp '$account' '$NEWPASS'"
done < "$MAILBOX_LIST"
Код: Выделить всё
#!/usr/bin/env bash
NEWPASS="123"
for account in $(zmprov -l gaa); do
echo "Changing password for $account"
zmprov sp "$account" "$NEWPASS"
done
Всё, теперь остаётся только дождаться пока mailcow перетянет себе все письма.
Когда синхронизация закончится, удалите sync jobs иначе mailcow будет пытаться перетянуть старые письма снова и снова, если пользователи захотят почистить старую почту.