✅ 修復 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,即可完全修復。