【Mail Server 系列文:第 3 篇】
在上一回(第 2 篇)我們完成了 架構導入動機 與 整體架構佈局 的說明。
從這一篇開始,我們將逐步進入實作,本篇將介紹本郵件系統的核心管理組件:
- MariaDB(資料庫)
- PostfixAdmin(網頁化帳號管理介面)
這兩個元件負責管理:
- 虛擬網域(virtual domains)
- 信箱帳號(mailbox)
- 別名信箱(alias)
- 網域別名(alias domain)
- 密碼修改
- 管理者後台
也就是 Postfix + Dovecot 完整運作不可或缺的基礎。
🧩 一、架構角色說明
| 元件 | 作用 | 為什麼需要? |
|---|---|---|
| MariaDB | 儲存網域、帳號、密碼、轉寄設定 | 讓 Postfix / Dovecot 以「虛擬帳號」模式運作,不依賴系統帳號 |
| PostfixAdmin | 一個 PHP Web 介面,讓管理者新增/刪除帳號、重設密碼 | 不需要手動管理 SQL,不需登入主機即可管理 |
這一層建立之後,任何帳號/密碼/轉寄設定都在 Web UI 進行,安全又直覺。
🏗 二、MariaDB 容器建置
建立資料目錄:
mkdir -p /opt/docker/mail/maildb/data
mkdir -p /opt/docker/mail/maildb/log
啟動 MariaDB 容器(含每日備份):
docker run -dit --name maildb \
--restart=always \
--network intranet-net \
-e MARIADB_ROOT_PASSWORD=123456 \
-e MARIADB_DATABASE=postfix \
-e MARIADB_USER=postfix \
-e MARIADB_PASSWORD=postfix1230 \
-v $PWD/data:/var/lib/mysql \
-v $PWD/log:/var/log/mysql \
mariadb:10.11
MariaDB 啟動後,建立 postfix 所需的資料表:
USE postfix;
SOURCE /opt/docker/mail/maildb/sql/create_mysql.sql;
SOURCE /opt/docker/mail/maildb/sql/addition_mysql.sql;
這兩個 SQL 檔負責建立:
- domains
- mailboxes
- aliases
- alias_domains
- quota tables
🖥 三、部署 PostfixAdmin 容器
建立必要目錄:
mkdir -p /opt/docker/mail/mailsetup/config
mkdir -p /opt/docker/mail/mailsetup/log
下載 PostfixAdmin image:
docker pull postfixadmin
第一次啟動(含 setup.php):
docker run -dit --name mailsetup \
--restart=always \
--network intranet-net \
-e TZ=Asia/Taipei \
-e VIRTUAL_HOST=mailsetup.it.demo.tw \
-p 8082:80 \
-v $PWD/config:/var/www/html/config \
postfixadmin
然而 PostfixAdmin 的「初始化流程」需要:
- 執行 setup.php
- 產生
$config['setup_password'] - 完成後 必須移除 setup.php
- 避免暴露後門
因此第一次啟動流程如下:
🛠 四、PostfixAdmin 初始設定流程(安全版)
➤ 第 1 步:產生 setup_password
編輯 config.local.php:
$CONF['setup_password'] = '請填入 setup.php 產生結果';
$CONF['default_aliases'] = array();
$CONF['encrypt'] = 'dovecot:SHA512-CRYPT';
前往瀏覽器開啟:
http://mailsetup.it.demo.tw/setup.php
輸入一組密碼,取得 $CONF['setup_password'] 的 hash。
➤ 第 2 步:建立 PostfixAdmin 管理員
在 setup.php 介面建立 admin 帳號,例如:
admin@it.demo.tw
接著登入後即可管理:
- domain
- mailbox
- alias
- alias domain
- quota
➤ 第 3 步:移除 setup.php(強制)
非常重要:
docker exec -it mailsetup rm -f /var/www/html/setup.php
或封鎖:
Deny from all
🔧 五、PostfixAdmin + MariaDB 完整整合
PostfixAdmin 實際會寫入 MariaDB 的表格包括:
domainmailboxaliasalias_domain
Postfix / Dovecot 透過 MySQL maps 查詢它們:
Postfix 查詢 mailbox:
SELECT 1 FROM mailbox WHERE username='%s' AND active='1';
Postfix 查詢 alias:
SELECT goto FROM alias WHERE address='%s' AND active='1';
所有查詢由下列設定指向:
/etc/postfix/sql/*.cf
例如:
virtual_mailbox_maps = mysql:/etc/postfix/sql/virtual_mailboxes.cf
這就是帳號可被 Postfix 正確收信的關鍵。
🧪 六、初始化後的完整測試流程
✔ 建立 domain
在 PostfixAdmin 建立:
it.demo.tw
✔ 建立一組信箱:
user1@it.demo.tw
Dovecot 會依 lookup 傳回:
maildir = /var/mail/it.demo.tw/user1/
✔ 使用 Roundcube 登入驗證
Roundcube 透過 IMAP → Dovecot → MySQL → PostfixAdmin 資料。
✔ 寄信驗證
Postfix → (Amavis → SpamAssassin → ClamAV) → Dovecot LMTP
確認 alias、forward 正常。
🧾 七、FAQ / 常見問題
Q1. 信箱無法登入?
- 檢查 mailbox.active 是否為 1
- 是否啟動了 alias domain?
- 密碼是否為 dovecot hash?
Q2. 刪除 domain 後信箱仍存在?
- PostfixAdmin 不會自動刪信箱目錄,你需自行清除:
rm -rf /var/mail/it.demo.tw/user1/
Q3. 多網域是否共用一套帳號?
- 不會
- 每個網域獨立帳號空間
🔚 結語:為後續 Postfix / Dovecot 奠定基礎
本篇完成了集中帳號管理架構:
- MariaDB
- PostfixAdmin
- 虛擬網域
- 信箱 / 別名
- 加密密碼
- 初始 Web UI
1 thought on “MariaDB + PostfixAdmin:虛擬網域與信箱帳號管理核心”
Comments are closed.