✅ Mailcow Restore 後郵件無法讀取

✅ 修復 Dovecot mail_crypt 加密金鑰步驟


📌 問題現象

在將 Mailcow 從 Server A 還原到 Server B 後出現:

  • SOGo 郵件列表空白
  • doveadm index 出現錯誤:
Decryption error: no private key available

📌 問題原因

Mailcow 預設啟用 Dovecot mail_crypt 功能。

郵件在寫入時會被加密(at-rest encryption)。

加密金鑰儲存在 Docker volume:

mailcowdockerized_crypt-vol-1

如果 restore 時沒有包含這個 volume:

郵件會存在
但無法解密
導致 SOGo 空白


✅ 解決方案總覽

Server A 的 crypt volume 複製到 Server B。


🟢 步驟一:在 Server A 打包 crypt volume

進入 mailcow 目錄:

bash

cd /opt/mailcow-dockerized

執行:

bash

docker run --rm \
  -v mailcowdockerized_crypt-vol-1:/data \
  -v $(pwd):/backup \
  busybox \
  tar czf /backup/crypt_backup.tar.gz -C /data .

確認檔案存在:

bash

ls -lh /opt/mailcow-dockerized/crypt_backup.tar.gz

🟢 步驟二:將備份檔傳送到 Server B

例如:

bash

scp /opt/mailcow-dockerized/crypt_backup.tar.gz root@ServerB:/root/

🟢 步驟三:在 Server B 停止 Dovecot

bash

cd /opt/mailcow-dockerized
docker compose stop dovecot-mailcow

🟢 步驟四:清空 Server B 原有 crypt volume

⚠️ 必須先清空,避免舊金鑰干擾

bash

docker run --rm \
  -v mailcowdockerized_crypt-vol-1:/data \
  busybox \
  rm -rf /data/*

🟢 步驟五:還原正確金鑰

bash

docker run --rm \
  -v mailcowdockerized_crypt-vol-1:/data \
  -v /root:/backup \
  busybox \
  tar xzf /backup/crypt_backup.tar.gz -C /data

🟢 步驟六:重新啟動服務

bash

docker compose start dovecot-mailcow
docker compose restart sogo-mailcow

🟢 (建議)重建 Index

為了避免使用者第一次登入很慢,建議執行:

bash

docker compose exec dovecot-mailcow doveadm index -A INBOX

✅ 驗證方式

確認不再出現:

Decryption error: no private key available

登入 SOGo 應可正常讀取郵件。


📌 重要備註

未來進行 Mailcow 備份時,必須包含以下 Docker volumes:

mailcowdockerized_vmail-vol-1
mailcowdockerized_vmail-index-vol-1
mailcowdockerized_crypt-vol-1   ✅ 必須包含

若缺少 crypt-vol-1

郵件將永久無法解密


✅ 技術補充

mail_crypt 使用:

  • 公鑰加密郵件
  • 私鑰解密郵件

若金鑰不匹配,即使 Maildir 完整:

郵件仍然無法讀取

✅ 結論

當 Mailcow restore 後出現:

Decryption error: no private key available

這不是郵件損壞問題,而是:

Dovecot mail_crypt 金鑰未同步

只需還原 crypt volume,即可完全修復。