【Mail Server 系列文:第 13 篇】
前面 1~12 篇已逐步建立完整郵件系統:
- Postfix + Dovecot
- MariaDB + PostfixAdmin
- SpamAssassin(SQL Bayes + TxRep + Remote Learn)
- Amavis + ClamAV + DKIM
- Piler + Manticore CJK
- Webmail(Roundcube)
- Apache SSL (SNI) + Let’s Encrypt
- HA / Monitoring / SOAR(第 12 篇)
第 13 篇的目標:
讓你擁有一份可以「從 0 建起整套郵件系統」、「交接給接手者」、「出狀況可快速排除」的完整 SOP。
🔶 1. 系統部署架構總表(完整服務清單)
以下是完整 mail stack 的容器節點:
| 服務 | 角色 | 埠口 | 容器名稱 |
|---|---|---|---|
| Postfix | SMTP / submission | 25 / 587 | postfix |
| Dovecot | IMAP / LMTP / Sieve | 143 / 993 / 24 / 4190 | dovecot |
| MariaDB | PostfixAdmin / SpamAssassin / Piler DB | 3306 | maildb |
| PostfixAdmin | domain / mailbox 管理 | 80/443 (proxied) | postfixadmin |
| SpamAssassin | spam 過濾 + Bayes SQL | 783 | spamassassin |
| ClamAV | 病毒掃描 | 3310 | clamav |
| Amavis | content filter + DKIM | 10024/10026 | amavis |
| Piler | 郵件歸檔系統 | 25 (proxy inbox) | piler |
| Manticore | 全文搜索 + CJK | 9306/9307 | manticore |
| Piler milter | 加入 X-Envelope-To | 33333 | pilermilter |
| Roundcube | webmail | 8000 (proxied) | webmail |
| Apache | SSL / SNI / reverse proxy | 80/443 | wwwapp |
🔶 2. 部署順序(最安全、最不會踩雷的順序)
建議部署順序如下(由底層 → 應用):
✔ Step 1:部署 MariaDB(maildb)
建立資料庫:postfix、sa40、piler
建立使用者後存成密碼檔。
✔ Step 2:部署 PostfixAdmin
建立 domain / mailbox
建立 postfix 用的 SQL maps
建立 dovecot 用的 SQL 檔案
✔ Step 3:部署 SpamAssassin
配置內容:
- SQL Bayes
- TxRep
- sa-update + sa-compile
- Remote Learn(SA-remote)
- mysql schema 自動修正(entrypoint)
確保:
docker logs spamassassin
→ No ERROR
✔ Step 4:部署 ClamAV + Amavis
注意:
- 建置 DKIM keys
- dkim_key() 加入 amavisd.conf
- spamd-local.cf 版本一致
- clamav socket 連通
測試:
echo test | swaks --to [email protected] --server 127.0.0.1
docker logs amavis
✔ Step 5:部署 Piler + Manticore
關鍵設定:
- extra_to_field = X-Envelope-To
- CJK search = ngram_len=2, morphology=icu_chinese
- Reverse proxy header 處理
- manticore schema 初始化
✔ Step 6:部署 Dovecot(SQL / SNI / quota / IMAPSieve)
注意:
- passdb / userdb
- lmtp 至 24 port
- imapsieve + remote learn
- quota-warning.sh
測試收信:
openssl s_client -connect mail:993
doveadm auth user@domain
✔ Step 7:部署 Postfix(完整 SNI + Amavis Filter + Milter)
內容包括:
- SASL → dovecot
- Server SNI → lmdb
- Milter → piler milter
- Amavis inbound/outbound → 10024/10026
- always_bcc → piler@archive.local
- transport → archive.local smtp:[piler]:25
檢查:
postfix check
✔ Step 8:部署 Webmail(Roundcube)
務必測試:
- TLS IMAP (993)
- TLS SMTP (587)
- managesieve (4190)
✔ Step 9:部署 Apache(SNI + Reverse Proxy)
Domain:
- webmail.domain
- archive.domain
Let’s Encrypt 自動 renew 後執行:
docker exec postfix postfix reload
docker exec dovecot dovecot reload
✔ Step 10:防火牆與路由設定
建議規則:
# mail subnet → gateway
iptables -I DOCKER-USER 1 -s 172.18.0.0/16 -d 172.18.0.1 -j ACCEPT
其他 inbound:
25, 587, 993, 80, 443 from WAN
🔶 3. 一鍵部署腳本:installer.sh(可直接使用)
這是一個可落地、可交接的部署腳本骨架:
#!/bin/bash
set -e
echo "[1] Create networks"
docker network create intranet-net || true
echo "[2] Deploy MariaDB"
cd maildb
./db.sh
echo "[3] Deploy PostfixAdmin"
cd ../postfixadmin
./postfixadmin.sh
echo "[4] Deploy SpamAssassin"
cd ../spamassassin
./spamd.sh
echo "[5] Deploy ClamAV + Amavis"
cd ../clamav
./clamav.sh
cd ../amavis
./amavis.sh
echo "[6] Deploy Piler + Manticore"
cd ../piler
docker compose up -d
echo "[7] Deploy Dovecot"
cd ../dovecot
./dovecot.sh
echo "[8] Deploy Postfix"
cd ../postfix
./postfix.sh
echo "[9] Deploy Webmail"
cd ../roundcube
./webmail.sh
echo "[10] Deploy Apache"
cd ../../wwwapp
./wwwapp.sh
echo "=== Mail System Deployment Completed ==="
可直接放 /opt/docker/mail/install/installer.sh
🔶 4. 維運 SOP(Standard Operating Procedures)
以下是企業級 SOP,可做為交接文件。
4.1 每日巡檢(Daily Routine)
檢查 spamassassin:
docker logs spamassassin | grep -i error
檢查 amavis:
docker logs amavis | grep -i 'panic'
檢查 postfix queue:
docker exec postfix mailq
檢查 dovecot:
docker logs dovecot
檢查 manticore:
mysql -h manticore -P 9306 -e "show tables"
4.2 每週維運(Weekly)
- sa-update 是否成功
- clamav freshclam signatures
- piler store disk usage
- SSL 憑證過期時間
- postfix logs 異常寄件行為
4.3 每月維運(Monthly)
- Docker images 更新
- Config Git commit
- MariaDB backup
- piler archive backup
- 制服全系統 TLS 檢查
- HA 連線測試(若有部署 Keepalived / HAProxy)
4.4 災難復原(Disaster Recovery)
按優先順序:
- Postfix + Dovecot(使用者能收發)
- MariaDB(帳號 / 設定)
- SpamAssassin / Amavis(過濾)
- Piler(可後補,先讓 mail 正常運作)
🔶 5. 最常見三大問題與排除流程
問題 1:IMAP 無法登入
檢查:
docker logs dovecot | grep auth
doveadm auth user@domain
通常原因:
- SQL 密碼錯誤
- dovecot.conf 手誤
- SSL 憑證 domain mismatch
問題 2:Postfix 無法寄出(Queue card stuck)
檢查:
mailq
postqueue -p
postfix flush
常見原因:
- DNS resolve 不通
- port 25 被防火牆阻擋
- amavis 10026 無反應
問題 3:Webmail 無法連 IMAP/SMTP
原因通常是:
- 網址錯(peer_name)
- gateway INPUT / DOCKER-USER 被擋
- SNI mismatch
🔶 6. 建議加入公司 IT 維運手冊的文件
我建議備存以下文件:
- network topology 圖
- mail 系統流程圖
- 每個 container 的 version
- 密碼 vault(使用 pass / vaultwarden)
- SSL renew 流程
- 新增 domain 流程(含 DKIM)
- 新增使用者流程(PostfixAdmin)
- piler search 教學
🔶 7. 結語:從第 1 到第 13 篇,你已完成企業級 Email Platform
到第 13 篇,你已經擁有一份:
✔ 可「一次部署」
✔ 可「交接給下一位維運人員」
✔ 遇到異常能快速排除
✔ 可長期維護(SOP 完整)
✔ 可擴展(支援 HA / 多區)
你的郵件系統不只是自架 mail server,
而是一個 完整的企業郵件平台(Enterprise Messaging Platform)。