目錄表

iRedMail 至 Mailu 信箱與郵件遷移 SOP

前言

本文件提供從 iRedMail 遷移信箱與郵件到 Mailu 的標準操作程序 (SOP)。Mailu 是一個基於 Docker 的開源郵件伺服器,支援 SMTP、IMAP、POP3、Webmail(Roundcube 或 Rainloop)、反垃圾郵件(Rspamd)等功能,適合取代 iRedMail。本 SOP 涵蓋備份 iRedMail 資料、在 Mailu 上設定環境、同步郵件以及驗證遷移結果。

適用範圍

前置條件

  1. 確認 iRedMail 環境
    • 檢查 iRedMail 版本(/etc/iredmail-release)。
    • 確認後端類型(MySQL/MariaDB、PostgreSQL 或 OpenLDAP)。
    • 確保服務正常運行,無資料損壞。
  2. Mailu 環境準備
    • 新伺服器已安裝 Docker 和 Docker Compose。
    • Mailu 已根據官方文件(Mailu 官方文件)部署完成,並配置好網域和基本設定。
    • 確保 Mailu 的 IMAP、SMTP 和 Webmail 服務正常運行。
  3. 工具準備
    • 安裝 imapsync 用於郵件同步(IMAPSync 官網)。
    • 使用 rsyncscp 進行資料傳輸。
    • 確保新舊伺服器之間可透過 SSH 連線。
  4. 管理員權限
    • 取得 iRedMail 和 Mailu 伺服器的 root 權限。
    • 準備 iRedMail 資料庫的 root 帳號密碼。
  5. DNS 設定
    • 確認網域的 MX、A、SPF、DKIM、DMARC 記錄可用於新伺服器。
    • 建議在遷移前降低 DNS TTL(例如 300 秒),以加快切換。

步驟

1. 備份 iRedMail 資料

在 iRedMail 伺服器上備份所有必要資料,以防止資料遺失。

  1. 停止郵件服務(可選)
    • 若短暫停機可接受,停止服務以避免資料不一致:
      systemctl stop postfix dovecot amavisd clamd
  2. 備份郵件資料
    • 郵件儲存路徑通常為 /var/vmail/vmail1
    • 使用 rsync 備份到本地:
      rsync -av /var/vmail/vmail1 /backup/vmail/
  3. 備份資料庫
    • 根據後端類型備份資料庫:
      • 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
  4. 備份設定檔
    • 備份 iRedMail 設定檔(供參考):
      tar -zcvf /backup/iredmail_configs.tar.gz /etc/postfix /etc/dovecot /etc/amavisd /etc/nginx /opt/www
  5. 備份 SSL 憑證
    • 備份憑證(若非 Let's Encrypt):
      tar -zcvf /backup/ssl_certs.tar.gz /etc/pki/tls/certs/iRedMail.crt /etc/pki/tls/private/iRedMail.key
  6. 備份 SOGo 資料(若使用)
    • 若使用 SOGo(行事曆和聯絡人同步),執行備份腳本:
      /var/vmail/backup/backup_sogo.sh
    • 備份檔案儲存在 /var/vmail/backup/sogo/<year>/<month>/

2. 在 Mailu 上設定網域與使用者

在 Mailu 伺服器上建立與 iRedMail 相同的網域和使用者帳號,為郵件同步做準備。

  1. 確認 Mailu 運行
    • 檢查 Docker Compose 服務狀態:
      docker-compose -f /path/to/mailu/docker-compose.yml ps
    • 確保 Web 管理介面(https://mailu_server_ip/admin)可訪問。
  2. 新增網域
    • 登入 Mailu Web 管理介面(預設帳號:admin@domain,密碼在 mailu.env 中)。
    • 在「Domains」選項中新增與 iRedMail 相同的網域(例如 example.com)。
  3. 匯入使用者帳號
    • 從 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 批量匯入(參考 Mailu CLI 文件):
        docker-compose exec admin flask mailu admin user@example.com example.com password
      • 將 iRedMail 的密碼(通常為 SSHA 或 CRYPT 格式)轉換為 Mailu 支援的格式(例如 bcrypt),或重設密碼並通知使用者。
  4. 設定 DKIM
    • 在 Mailu 管理介面中為網域生成 DKIM 密鑰,並更新 DNS 記錄。
    • 若希望重用 iRedMail 的 DKIM 密鑰,需從 /etc/amavisd/dkim/ 複製並配置到 Mailu。

3. 同步郵件資料

使用 imapsync 將 iRedMail 的郵件同步到 Mailu,避免直接複製 Maildir 檔案(因 Mailu 和 iRedMail 的 Maildir 結構可能不同)。

  1. 安裝 imapsync
    • 在中間伺服器(或新舊伺服器之一)安裝 imapsync
      apt update && apt install imapsync
  2. 準備同步指令
    • 針對每個使用者執行 imapsync,範例:
      imapsync --host1 <iredmail_ip> --user1 user@example.com --password1 <iredmail_password> \
               --host2 <mailu_ip> --user2 user@example.com --password2 <mailu_password> \
               --ssl1 --ssl2 --syncinternaldates --allowsizemismatch
    • 參數說明:
      • –host1–host2:iRedMail 和 Mailu 的 IMAP 伺服器 IP 或域名。
      • –ssl1–ssl2:啟用 SSL 連線(IMAP 預設端口 993)。
      • –syncinternaldates:保留郵件的原始日期。
      • –allowsizemismatch:忽略可能的檔案大小差異。
  3. 批量同步
    • 編寫腳本批量同步所有使用者:
      #!/bin/bash
      while IFS=, read -r username password; do
          imapsync --host1 <iredmail_ip> --user1 "$username" --password1 "$password" \
                   --host2 <mailu_ip> --user2 "$username" --password2 "<mailu_password>" \
                   --ssl1 --ssl2 --syncinternaldates --allowsizemismatch
      done < /backup/users.csv
    • 確保 users.csv 格式正確,且 Mailu 的密碼已設定。
  4. 監控同步
    • 檢查 imapsync 日誌,確保無錯誤。
    • 若同步失敗,檢查防火牆(確保 993 端口開放)或帳號密碼。

4. 驗證遷移結果

在新伺服器上測試 Mailu 的功能,確保資料完整。

  1. 啟動 Mailu 服務
    • 確保所有 Docker 容器運行:
      docker-compose -f /path/to/mailu/docker-compose.yml up -d
  2. 測試功能
    • 登入 Mailu Webmail(https://mailu_server_ip/webmail),檢查郵件是否完整。
    • 使用郵件客戶端(例如 Thunderbird)測試 IMAP(端口 993)、SMTP(端口 587)和 POP3(端口 995)。
    • 發送測試郵件,確認 SMTP 和 DKIM 簽章正常。
    • 檢查反垃圾郵件(Rspamd)是否有效。
  3. 檢查日誌
    • 查看 Mailu 日誌:
      docker-compose -f /path/to/mailu/docker-compose.yml logs
    • 檢查 Dovecot 和 Postfix 日誌(位於 Mailu 容器的 /var/log/)。
  4. 驗證 SOGo 資料(若適用)
    • Mailu 不原生支援 SOGo(行事曆和聯絡人同步)。若 iRedMail 使用 SOGo,需額外部署 SOGo 容器並還原資料:
      • 將 iRedMail 的 SOGo 備份(/var/vmail/backup/sogo/)傳輸到新伺服器。
      • 參考 SOGo 文件(SOGo 支持)還原資料庫。

5. 更新 DNS 設定

DNS 記錄指向 Mailu 伺服器,完成遷移。

  1. 更新 DNS
    • 修改網域的 A 記錄,將 mail.example.com 指向 Mailu 伺服器 IP。
    • 更新 MX 記錄,指向 Mailu 的 FQDN。
    • 更新 SPF、DKIM、DMARC 記錄,確保與 Mailu 配置一致。
  2. 等待 DNS 傳播
    • DNS 更新可能需要 24-48 小時。
    • 期間保持 iRedMail 伺服器運行,接收新郵件。
  3. 最終同步
    • DNS 傳播完成前,若 iRedMail 收到新郵件,再次運行 imapsync 同步增量資料。

6. 關閉 iRedMail 伺服器

確認 Mailu 運行正常且無郵件遺失後,關閉 iRedMail 伺服器。

  1. 停止服務
    systemctl stop postfix dovecot amavisd clamd nginx
  2. 備份最終資料
    • 再次備份 iRedMail 資料存檔。
  3. 關閉伺服器
    • 根據需求關閉或重新利用 iRedMail 伺服器。

注意事項

參考資源