====== iRedMail 至 Mailu 信箱與郵件遷移 SOP ======
===== 前言 =====
本文件提供從 iRedMail 遷移信箱與郵件到 Mailu 的標準操作程序 (SOP)。Mailu 是一個基於 Docker 的開源郵件伺服器,支援 SMTP、IMAP、POP3、Webmail(Roundcube 或 Rainloop)、反垃圾郵件(Rspamd)等功能,適合取代 iRedMail。本 SOP 涵蓋備份 iRedMail 資料、在 Mailu 上設定環境、同步郵件以及驗證遷移結果。
===== 適用範圍 =====
* **來源伺服器**:運行 iRedMail 的郵件伺服器(支援 MySQL/MariaDB、PostgreSQL 或 OpenLDAP 後端)。
* **目標伺服器**:運行 Mailu 的新伺服器(使用 Docker Compose 部署)。
* **目標**:遷移所有信箱、郵件、網域設定,確保服務無縫轉移。
===== 前置條件 =====
- **確認 iRedMail 環境**:
* 檢查 iRedMail 版本(''/etc/iredmail-release'')。
* 確認後端類型(MySQL/MariaDB、PostgreSQL 或 OpenLDAP)。
* 確保服務正常運行,無資料損壞。
- **Mailu 環境準備**:
* 新伺服器已安裝 Docker 和 Docker Compose。
* Mailu 已根據官方文件([[https://mailu.io/|Mailu 官方文件]])部署完成,並配置好網域和基本設定。
* 確保 Mailu 的 IMAP、SMTP 和 Webmail 服務正常運行。
- **工具準備**:
* 安裝 ''imapsync'' 用於郵件同步([[https://imapsync.lamiral.info/|IMAPSync 官網]])。
* 使用 ''rsync'' 或 ''scp'' 進行資料傳輸。
* 確保新舊伺服器之間可透過 SSH 連線。
- **管理員權限**:
* 取得 iRedMail 和 Mailu 伺服器的 root 權限。
* 準備 iRedMail 資料庫的 root 帳號密碼。
- **DNS 設定**:
* 確認網域的 MX、A、SPF、DKIM、DMARC 記錄可用於新伺服器。
* 建議在遷移前降低 DNS TTL(例如 300 秒),以加快切換。
===== 步驟 =====
==== 1. 備份 iRedMail 資料 ====
在 iRedMail 伺服器上備份所有必要資料,以防止資料遺失。
- **停止郵件服務(可選)**:
* 若短暫停機可接受,停止服務以避免資料不一致:
systemctl stop postfix dovecot amavisd clamd
- **備份郵件資料**:
* 郵件儲存路徑通常為 ''/var/vmail/vmail1''。
* 使用 ''rsync'' 備份到本地:
rsync -av /var/vmail/vmail1 /backup/vmail/
- **備份資料庫**:
* 根據後端類型備份資料庫:
* **MySQL/MariaDB**:
mysqldump -u root -p --all-databases > /backup/mysql_all_databases.sql
* **PostgreSQL**:
pg_dumpall -U postgres > /backup/postgres_all_databases.sql
* **OpenLDAP**:
slapcat -l /backup/ldap_backup.ldif
- **備份設定檔**:
* 備份 iRedMail 設定檔(供參考):
tar -zcvf /backup/iredmail_configs.tar.gz /etc/postfix /etc/dovecot /etc/amavisd /etc/nginx /opt/www
- **備份 SSL 憑證**:
* 備份憑證(若非 Let's Encrypt):
tar -zcvf /backup/ssl_certs.tar.gz /etc/pki/tls/certs/iRedMail.crt /etc/pki/tls/private/iRedMail.key
- **備份 SOGo 資料(若使用)**:
* 若使用 SOGo(行事曆和聯絡人同步),執行備份腳本:
/var/vmail/backup/backup_sogo.sh
* 備份檔案儲存在 ''/var/vmail/backup/sogo///''。
==== 2. 在 Mailu 上設定網域與使用者 ====
在 Mailu 伺服器上建立與 iRedMail 相同的網域和使用者帳號,為郵件同步做準備。
- **確認 Mailu 運行**:
* 檢查 Docker Compose 服務狀態:
docker-compose -f /path/to/mailu/docker-compose.yml ps
* 確保 Web 管理介面(''https://mailu_server_ip/admin'')可訪問。
- **新增網域**:
* 登入 Mailu Web 管理介面(預設帳號:''admin@domain'',密碼在 ''mailu.env'' 中)。
* 在「Domains」選項中新增與 iRedMail 相同的網域(例如 ''example.com'')。
- **匯入使用者帳號**:
* 從 iRedMail 資料庫匯出使用者清單:
* **MySQL/MariaDB**:
mysql -u root -p vmail -e "SELECT username, password FROM mailbox WHERE active=1;" > /backup/users.csv
* **PostgreSQL**:
psql -U postgres -d vmail -c "COPY (SELECT username, password FROM mailbox WHERE active=1) TO '/backup/users.csv' WITH CSV HEADER;"
* **OpenLDAP**:
ldapsearch -x -D "cn=Manager,dc=xx,dc=xx" -W -b "o=domains,dc=xx,dc=xx" "(objectClass=mailUser)" mail userPassword > /backup/users.ldif
* 在 Mailu 上手動或批量新增使用者:
* 使用 Web 管理介面逐一新增使用者(適合少量帳號)。
* 或使用 Mailu CLI 批量匯入(參考 [[https://mailu.io/master/cli.html|Mailu CLI 文件]]):
docker-compose exec admin flask mailu admin user@example.com example.com password
* 將 iRedMail 的密碼(通常為 SSHA 或 CRYPT 格式)轉換為 Mailu 支援的格式(例如 bcrypt),或重設密碼並通知使用者。
- **設定 DKIM**:
* 在 Mailu 管理介面中為網域生成 DKIM 密鑰,並更新 DNS 記錄。
* 若希望重用 iRedMail 的 DKIM 密鑰,需從 ''/etc/amavisd/dkim/'' 複製並配置到 Mailu。
==== 3. 同步郵件資料 ====
使用 ''imapsync'' 將 iRedMail 的郵件同步到 Mailu,避免直接複製 Maildir 檔案(因 Mailu 和 iRedMail 的 Maildir 結構可能不同)。
- **安裝 imapsync**:
* 在中間伺服器(或新舊伺服器之一)安裝 ''imapsync'':
apt update && apt install imapsync
- **準備同步指令**:
* 針對每個使用者執行 ''imapsync'',範例:
imapsync --host1 --user1 user@example.com --password1 \
--host2 --user2 user@example.com --password2 \
--ssl1 --ssl2 --syncinternaldates --allowsizemismatch
* 參數說明:
* ''--host1'' 和 ''--host2'':iRedMail 和 Mailu 的 IMAP 伺服器 IP 或域名。
* ''--ssl1'' 和 ''--ssl2'':啟用 SSL 連線(IMAP 預設端口 993)。
* ''--syncinternaldates'':保留郵件的原始日期。
* ''--allowsizemismatch'':忽略可能的檔案大小差異。
- **批量同步**:
* 編寫腳本批量同步所有使用者:
#!/bin/bash
while IFS=, read -r username password; do
imapsync --host1 --user1 "$username" --password1 "$password" \
--host2 --user2 "$username" --password2 "" \
--ssl1 --ssl2 --syncinternaldates --allowsizemismatch
done < /backup/users.csv
* 確保 ''users.csv'' 格式正確,且 Mailu 的密碼已設定。
- **監控同步**:
* 檢查 ''imapsync'' 日誌,確保無錯誤。
* 若同步失敗,檢查防火牆(確保 993 端口開放)或帳號密碼。
==== 4. 驗證遷移結果 ====
在新伺服器上測試 Mailu 的功能,確保資料完整。
- **啟動 Mailu 服務**:
* 確保所有 Docker 容器運行:
docker-compose -f /path/to/mailu/docker-compose.yml up -d
- **測試功能**:
* 登入 Mailu Webmail(''https://mailu_server_ip/webmail''),檢查郵件是否完整。
* 使用郵件客戶端(例如 Thunderbird)測試 IMAP(端口 993)、SMTP(端口 587)和 POP3(端口 995)。
* 發送測試郵件,確認 SMTP 和 DKIM 簽章正常。
* 檢查反垃圾郵件(Rspamd)是否有效。
- **檢查日誌**:
* 查看 Mailu 日誌:
docker-compose -f /path/to/mailu/docker-compose.yml logs
* 檢查 Dovecot 和 Postfix 日誌(位於 Mailu 容器的 ''/var/log/'')。
- **驗證 SOGo 資料(若適用)**:
* Mailu 不原生支援 SOGo(行事曆和聯絡人同步)。若 iRedMail 使用 SOGo,需額外部署 SOGo 容器並還原資料:
* 將 iRedMail 的 SOGo 備份(''/var/vmail/backup/sogo/'')傳輸到新伺服器。
* 參考 SOGo 文件([[https://www.sogo.nu/support.html|SOGo 支持]])還原資料庫。
==== 5. 更新 DNS 設定 ====
將 DNS 記錄指向 Mailu 伺服器,完成遷移。
- **更新 DNS**:
* 修改網域的 A 記錄,將 ''mail.example.com'' 指向 Mailu 伺服器 IP。
* 更新 MX 記錄,指向 Mailu 的 FQDN。
* 更新 SPF、DKIM、DMARC 記錄,確保與 Mailu 配置一致。
- **等待 DNS 傳播**:
* DNS 更新可能需要 24-48 小時。
* 期間保持 iRedMail 伺服器運行,接收新郵件。
- **最終同步**:
* 在 DNS 傳播完成前,若 iRedMail 收到新郵件,再次運行 ''imapsync'' 同步增量資料。
==== 6. 關閉 iRedMail 伺服器 ====
確認 Mailu 運行正常且無郵件遺失後,關閉 iRedMail 伺服器。
- **停止服務**:
systemctl stop postfix dovecot amavisd clamd nginx
- **備份最終資料**:
* 再次備份 iRedMail 資料存檔。
- **關閉伺服器**:
* 根據需求關閉或重新利用 iRedMail 伺服器。
===== 注意事項 =====
* **密碼相容性**:iRedMail 和 Mailu 的密碼加密格式可能不同(iRedMail 常用 SSHA,Mailu 支援 bcrypt)。建議在 Mailu 上重設密碼並通知使用者,或使用腳本轉換密碼格式。
* **SOGo 支援**:Mailu 不原生支援 ActiveSync 或 CalDAV/CardDAV。若需要行事曆和聯絡人同步,需額外部署 SOGo 或其他解決方案。
* **資源需求**:Mailu 的多容器設計可能比 iRedMail 消耗更多資源,建議至少 2GB RAM。
* **防火牆**:確保 Mailu 伺服器開放必要端口(25、110、143、465、587、993、995、80、443)。
* **備份保留**:保留 iRedMail 備份至少 30 天,以防資料遺失。
* **測試環境**:建議在測試環境中模擬遷移,確認流程無誤後再應用到正式環境。
* **IMAPSync 限制**:免費版 ''imapsync'' 有同步次數限制,大量帳號可能需購買授權。
===== 參考資源 =====
* [[https://docs.iredmail.org/|iRedMail 官方文件]]
* [[https://mailu.io/|Mailu 官方文件]]
* [[https://imapsync.lamiral.info/|IMAPSync 官方網站]]
* [[https://www.sogo.nu/support.html|SOGo 文件]]
* [[https://forum.iredmail.org/|iRedMail 論壇討論]]
* [[https://github.com/Mailu/Mailu|Mailu GitHub]]
{{tag>from_gork}}