نیاز داشتیم زیمبرا موجود را عینا با همه چیز از روی سرور قدیمی به زیرساخت جدید منتقل کنیم.
براساس این راهنما عمل کردم و همه چیز (بجز بخش chat که برای ما حیاتی نبود) حتی پسورد کاربران عینا منتقل شد. فقط چند نکته :
۱- اکسپورت از روی سرور قدیمی ، zip و انتقال به سرور جدید و unzip و ایمپورت روی سرور جدید زمان زیادی بسته به میزان دیتاها نیاز دارد ، از زمانی که mailbox data کاربران را اکسپورت کرده اید ، درصورت آنلاین بودن سرور قدیمی ، ایمیل ها و اطلاعات جدید منتقل نخواهند شد، بنابراین حتما باید با کاربران برای قطعی چند ساعته زیمبرا هماهنگ کنید.
۲- حتما از tmux یا ترمینال مشابهی استفاده کنید که درصورت قطع شدن ارتباط اینترنت کنسول آن برقرار بماند.
۳- برای انتقال باید هر دو نسخه زیمبرا مشابه باشند، با این روش ما از روی Zimbra 8.8.15 نصب شده روی Centos8 به همین نسخه روی Ubuntu Server 20.04 انتقال دادیم و فقط اطلاعات chat نیامد که برای ما حیاتی نبودند.
۴- واقعیتش کاری که سالی ۲ سالی یکبار باید انجام بشه را نمی صرفه اسکریپت و ansible و ... کنم! همین جا لیست دستورات و منبع را یادداشت می کنم بعدا برای این نسخه این کار دوباره پیش آمد استفاده می کنم.
Step 0.
# mkdir -p /migration/zimbra
# chmod -R 777 /migration/zimbra
# chown -R zimbra:zimbra /migration/zimbra
Step 1. Export all domains
# su - zimbra
$ mkdir -p /migration/zimbra/domains
$ cd /migration/zimbra/domains
$ zmprov gad | tee -a domains.txt
Step 2. Export all accounts
$ mkdir -p /migration/zimbra/accounts
$ cd /migration/zimbra/accounts
$ zmprov gaaa | tee -a admins.txt
$ zmprov -l gaa | tee -a users.txt
Step 3. Export all account details
$ mkdir -p /migration/zimbra/account_details
$ cd /migration/zimbra/account_details
$ for user in `cat ../accounts/users.txt`; do zmprov ga $user | grep -i Name: | tee -a $user.txt ; done
Step 4. Export all account passwords
$ mkdir -p /migration/zimbra/passwords
$ cd /migration/zimbra/passwords
$ for user in `cat ../accounts/users.txt`; do zmprov -l ga $user userPassword | grep userPassword: | awk '{ print $2}' | tee -a $user.shadow; done
Step 5. Export all distribution lists
$ mkdir -p /migration/zimbra/distribution_lists
$ cd /migration/zimbra/distribution_lists
$ zmprov gadl | tee -a distribution_lists.txt
$ for list in `cat distribution_list.txt`; do zmprov gdlm $list > $list.txt ;echo "$list"; done
Step 6. Export all aliases
$ mkdir -p /migration/zimbra/aliases
$ cd /migration/zimbra/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 /migration/zimbra/aliases -type f -empty | xargs -n1 rm -v
Step 7. Exporting mailbox data
$ 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
خط بالا یک خط است، $ اول مربوط به کنسول و بقیه مربوط به متغییرها هستند
$ for user in `cat ../accounts/problematic_accounts.txt`; do echo "Exporting mailbox $user" ; zmmailbox -z -m $user getRestURL '/?fmt=tgz' > ./$user.tgz ; done
Step 8. Exporting email filters for all the accounts
$ mkdir /migration/zimbra/filters
$ cd /migration/zimbra/filters
$ vim 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 777 export_filters.sh
$ ./export_filters.sh
# zip -r migration.zip migration
# scp migration.zip user@newserver:/migration.zip
Step 9. Restore all domains to the new server
# su zimbra
$ cd /migration/zimbra/domains
$ for domain in `cat domains.txt `; do zmprov cd $domain zimbraAuthMech zimbra ;echo $domain ;done
Step 10. Restore all accounts and passwords
$ mkdir -p /migration/zimbra/scripts
$ cd /migration/zimbra/scripts
$ vim 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 777 restore_accounts.sh
$ ./restore_accounts.sh
Step 11. Restore distribution lists
$ cd /migration/zimbra
$ for lists in `cat distribution_lists/distribution_lists.txt`; do zmprov cdl $lists ; echo "$lists -- done " ; done
$ cd migration/zimbra/distribution_lists
$ vim 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 777 restore_dist_lists.sh
$ ./restore_dist_lists.sh
Step 12. Restore all aliases
$ cd /migration/zimbra/aliases
$ vim 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 777 restore_aliases.sh
$ ./restore_aliases.sh
Step 13. Importing mailboxes
$ 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
Step 14. Importing mail filters
$ cd /migration/zimbra/filters
$ vim import_filters.sh
for file in /migration/zimbra/filters/*
do StrFilter=`cat "$file"` Acc=`echo $file | cut -d "/" -f5` su - zimbra -c "zmprov ma $Acc zimbraMailSieveScript '$StrFilter'" echo "Process filter $Acc" done echo "All filters have been imported successfully"
$ chmod 777 import_filters.sh
$ ./import_filters.sh
Step 15.
$ zmcontrol restart
$zmcontrol status