一個中型 Mailcow Server 的備份反思與重建之路

前言

這篇文章不是教學文。

我不打算講操作步驟,也不會列出指令。

我想記錄的,是一段關於失敗、責任、重建,以及備份理念轉變的過程。

背景是一台中型規模的 Mailcow 郵件伺服器:

  • 約 400–800 個電子郵件帳戶
  • 約 1.5TB 郵件資料
  • 運行於 VPS 環境

這樣的規模,已經不能再用「簡單備份」去處理。


為什麼我對 Email 備份如此執著?

因為我曾經失敗過。

由於管理不善與判斷失誤,我曾經遺失客戶大約 70% 的郵件資料。

無論責任是否完全在我身上,我都不應該容許這件事發生。

那段時間,我每天承受客戶的質疑與投訴。
我失去了大部分客戶的信任。

那是我職業生涯中最大的污點。

從那一天開始,我對備份的理解徹底改變。

備份不再是技術流程。
而是一種責任。


第一個現實:傳統備份方式行不通

1.5TB 的郵件容量,在 VPS 環境下意味著:

  • 備份時間極長
  • I/O 壓力巨大
  • 官方 backup / restore 並不穩定
  • Restore 成本過高

更關鍵的是:

備份是否真的成功?

很多技術人員都經歷過這種情況——
真正需要備份的時候,才發現備份早已失敗。

而我使用的是自動化備份。
不是人手操作。

如果沒有驗證機制,「備份成功」只是心理安慰。


第二個問題:備份系統本身是否安全?

我曾經使用 NAS 作為備份伺服器。

但我開始問自己:

  • 公司自購硬體是否可靠?
  • RAID 是否等於安全?
  • NAS 本身會否成為單點故障?

如果主機與 NAS 同時出事,我還剩下什麼?

於是我決定把備份移往雲端。


Restic + S3:備份思維的第一次轉變

我開始研究 Restic,並將備份目標改為 S3 Object Storage。

Restic 的 Snapshot 機制令我非常欣賞:

  • 全程加密
  • 去重儲存
  • 支援 S3
  • 備份速度非常快

於是我產生一個重要想法:

我是否可以利用 Restic 這個機制,去建立一台可隨時重建的後備 Email Server?

這個想法的核心不是「不要後備伺服器」。

而是:

我是否可以不長期維持一台閒置後備機,而是在需要時,從雲端完整重建一台?

理論上流程是:

  1. 主伺服器使用 Restic 備份至 S3
  2. 發生災難
  3. 在新 VPS 上 Restore
  4. 重建 Mailcow 環境
  5. 重新上線

這是一種「可重建型備援」概念。

我為此寫了一整套 Backup / Restore Script,
一度覺得這是接近完美的方案。


第二次現實衝擊:Restore 的限制

Restic 備份非常快。

但 Restore 是完整還原。

這不是缺點,而是設計理念。

問題在於:

如果我希望後備機保持接近同步狀態,
就意味著頻繁 Restore。

大量、持續的完整還原,
會造成極高 SSD 寫入量。

長遠而言,硬碟壽命會急速消耗。

於是我明白:

Restic 非常適合作為 Disaster Recovery 工具
但不適合作為「高頻同步型備援」。


策略調整:分層備份思維

我保留 Restic + S3:

  • 每日一次完整備份
  • Restore 改為手動
  • 作為最終保險

即使主機、NAS、整個公司設備全部毀滅,
我仍然可以在雲端取回完整數據。

這給了我最基本的安全感。

但我仍然需要一種「高速同步型備援」。


回到基礎:rsync 的重新定位

我開始重新審視 rsync。

過去我避免使用它,因為:

  • Mailcow 結構複雜
  • 郵件為加密格式
  • 緩衝與暫存檔案混亂
  • 資料庫同步難度高

整體看起來幾乎無法處理。


AI 帶來的突破

這一次,我沒有單打獨鬥。

我開始利用 AI 協助我思考架構:

  • 如何處理憑證?
  • 如何安全同步 Maildir?
  • 如何排除不必要的緩衝檔?
  • 如何由主機觸發備份機自行恢復資料庫?
  • 如何確保資料一致性?

經過多次測試與調整,
整個流程終於穩定下來。

同步時間只需幾分鐘。
可高頻執行。
速度快。
可靠。

這才是真正符合我需求的方案。


最終架構:雙層設計

第一層:Restic + S3

  • 每日完整備份
  • 災難恢復
  • 可重建後備機

第二層:rsync 備援同步

  • 高頻同步
  • 快速切換
  • 低 SSD 壓力
  • 接近即時可用

這不是替代關係。

而是分層策略。


結語

我曾經失敗。

那段經歷讓我明白:

備份不是「技術是否正確」。
而是「當事情發生時,你是否對得起客戶」。

今天我最重要的改變,不是學會 Restic。
不是寫好 Script。
不是架好 S3。

而是我不再依賴運氣。
也不再依賴別人替我承擔責任。

備份,從來不是工具問題。

而是態度問題。