Mail-in-a-Box v77 配置参数详解
Mail-in-a-Box v77 配置体系实测详解:mailinabox.conf 八个全局参数逐项解析、/home/user-data 数据根目录逐目录说明、备份/配额/反垃圾参数与重跑回填机制,全部参数值来自实测。
Mail-in-a-Box v77 配置参数详解
目标:讲清 Mail-in-a-Box v77 的配置体系——8 个全局参数的真实值与生效机制、数据根目录逐目录用途、备份/配额/反垃圾等运行参数的查看与修改方法,以及"生成物与可持久编辑物"的边界(哪些文件改了会被重写、哪些能长久生效)。本文为配置篇:所有参数值、文件内容与修改效果均来自本站实测(2026-10-21),安装过程见 《Ubuntu 22.04 安装 Mail-in-a-Box 指南》。
一、环境信息
| 项目 | 值 |
|---|---|
| 组件版本 | Mail-in-a-Box v77(安装日期 2026-10-21) |
| 操作系统 | Ubuntu 22.04 LTS (jammy),x86_64 |
| 主机名 / 邮箱域名 | box.example.com / example.com |
| 公网 IP / 内网 IP | 182.54.113.29 / 10.0.0.3 |
| 数据根目录 | /home/user-data(STORAGE_ROOT 默认值) |
| 示例账号 | me@example.com(管理员,示例密码 q1w2e3r4) |
二、配置体系总览
Mail-in-a-Box 的配置分三层,理解"谁是生成物"是改配置不翻车的前提:
| 层 | 位置 | 性质 | 改动方式 |
|---|---|---|---|
| 全局参数 | /etc/mailinabox.conf | 生成物(每次重跑 sudo mailinabox 会整体重写) | 改后必须重跑,重跑时旧值经 DEFAULT_* 变量回载(见第六节实测) |
| 数据与状态 | /home/user-data/ | 持久物(账号、证书、DNSSEC 密钥、备份都在这里) | 面板/API/CLI 正常操作,或按官方路径迁移 |
| 服务配置 | /etc/postfix/main.cf、/etc/dovecot/conf.d/*、/etc/nsd/zones/* 等 | 生成物或受管物(重跑会被脚本按固定值回填) | 用官方工具改,改后重跑生效;想持久的改动要避开重跑回填点 |
一句话结论:数据(/home/user-data)是你要备份的一切;/etc/mailinabox.conf 与服务配置文件是脚本产物,重跑即按声明值重建。
三、/etc/mailinabox.conf 全局参数(共 8 个)
实测全文(cat /etc/mailinabox.conf):
STORAGE_USER=user-data
STORAGE_ROOT=/home/user-data
PRIMARY_HOSTNAME=box.example.com
PUBLIC_IP=182.54.113.29
PUBLIC_IPV6=
PRIVATE_IP=10.0.0.3
PRIVATE_IPV6=
MTA_STS_MODE=enforce
逐项解析:
| 参数 | 实测值 | 作用 | 谁在消费它 |
|---|---|---|---|
STORAGE_USER | user-data | 数据根目录属主的系统用户名(脚本自动创建该用户) | 权限管理:/home/user-data 及其下邮件数据的属主 |
STORAGE_ROOT | /home/user-data | 数据根目录:邮件账号库、证书、DNSSEC、备份、Nextcloud 数据全在此 | 几乎所有脚本与守护进程;整机迁移=迁移这个目录 |
PRIMARY_HOSTNAME | box.example.com | 服务器正式主机名:TLS 证书 CN、Postfix myhostname、DNS 的 MX、面板地址都由它派生 | 系统主机名(/etc/hostname)、Postfix、nginx、nsd、certbot |
PUBLIC_IP | 182.54.113.29 | 本机公网 IPv4 | DNS 区域文件(A 记录)、fail2ban 白名单变量、状态检查的 DNS 一致性比对 |
PUBLIC_IPV6 | 空 | 本机公网 IPv6(AAAA 记录),未启用为空 | 同上(IPv6 侧) |
PRIVATE_IP | 10.0.0.3 | 内网 IPv4 | nsd 监听地址(权威 DNS 绑在内网网卡)、内网服务绑定 |
PRIVATE_IPV6 | 空 | 内网 IPv6,未启用为空 | 同上 |
MTA_STS_MODE | enforce | MTA-STS 策略模式(RFC 8460:none/testing/enforce 三值),决定 /var/lib/mailinabox/mta-sts.txt 策略文件的 mode: 与 _mta-sts TXT 记录的发布 | web.sh(生成策略文件)、dns_update.py(生成 DNS 记录) |
💡 关于
PUBLIC_IP与PRIVATE_IP的关系:云主机 NAT 场景下两者不同(公网入口 IP ≠ 内网网卡 IP),脚本靠icanhazip.com探测公网值。如果公网 IP 变了(换机器/换弹性 IP),更新此文件后重跑sudo mailinabox,DNS 记录与状态检查即修正。
四、数据根目录 /home/user-data 逐目录解析
实测目录树(ls -F /home/user-data/):
backup/ dns/ mail/ mailinabox.version owncloud/ owncloud-backup/ ssl/ www/
| 目录/文件 | 实测内容 | 说明 |
|---|---|---|
mail/ | users.sqlite、dkim/、mailboxes/、postgrey/、roundcube/、sieve/、spamassassin/ | 邮件核心数据:users.sqlite 存全部账号/别名/权限(SQLite 单文件);mailboxes/ 是真实邮件存储(Maildir);dkim/ 存 DKIM 签名密钥;postgrey/db 存灰名单库;sieve/ 存用户过滤规则 |
ssl/ | ssl_certificate.pem@、ssl_private_key.pem、dh2048.pem、box.example.com-selfsigned-20261021.pem、lets_encrypt/ | 证书中枢:lets_encrypt/ 是 certbot 的完整配置目录(账号、待签证书);当前生效证书用符号链接切换(自签→Let's Encrypt 自动换链);dh2048.pem 为安装时实测生成的 2048 位 DH 参数 |
dns/ | custom.yaml、dnssec/ | custom.yaml 存面板/API 添加的自定义 DNS 记录(实测初始为 {});dnssec/ 存区域签名密钥(丢失=全网 DNSSEC 作废,务必备份) |
backup/ | cache/、encrypted/、secret_key.txt | 备份体系:encrypted/ 是默认本地备份目标;secret_key.txt 是 duplicity 的 GPG 加密密钥(丢了它备份就是乱码) |
owncloud/ | Nextcloud 数据目录(含 config.php、数据文件、owncloud.db) | 日历/联系人/文件数据(组件名沿用 owncloud 目录名,实际跑的是 Nextcloud 27.1.11) |
owncloud-backup/ | 升级 Nextcloud 时的自动快照 | 每次升级前自动创建,可手动清理旧版本 |
www/ | 各域名静态站点根目录 | 面板中为域名开启"静态网站"后的网页文件 |
mailinabox.version | 15 | 数据库结构版本号(schema migration 版本,非组件版本 v77),由 setup/migrate.py 维护 |
五、运行参数详解
5.1 备份参数
查看(curl --user "$(cat /var/lib/mailinabox/api.key):" http://127.0.0.1:10222/system/backup/config,实测):
{
"enc_pw_file": "/home/user-data/backup/secret_key.txt",
"file_target_directory": "/home/user-data/backup/encrypted",
"min_age_in_days": 3,
"ssh_pub_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB... root@box.example.com\n",
"target": "file:///home/user-data/backup/encrypted"
}
| 参数 | 默认值 | 说明 |
|---|---|---|
target | file:///home/user-data/backup/encrypted | 备份目标。支持 rsync://、S3(s3://)、Backblaze B2(b2://)等 duplicity 目标,改后每日备份自动上传 |
min_age_in_days | 3 | 备份保留天数下限,超出后清理旧备份 |
enc_pw_file | /home/user-data/backup/secret_key.txt | 加密口令文件路径(自动生成,勿动勿删) |
ssh_pub_key | 自动生成 RSA 密钥 | 若 target 是远程 SSH 主机,把该公钥加到对端 authorized_keys 实现免密推送 |
修改方式:面板 System → Backups,或 POST /system/backup/config。执行时机:每日 cron(实测 /etc/cron.d/mailinabox-nightly):
21 1 * * * root (cd /root/mailinabox && management/daily_tasks.sh)
即每天 01:21 执行 daily_tasks.sh:跑 management/backup.py(结果邮件发管理员);每周一额外跑 management/mail_log.py -t week 发送使用报告。
5.2 邮箱配额(quota)
实测(CLI 与 API 等价):
$ management/cli.py user quota me@example.com
0 # 0 = 不限额
$ management/cli.py user quota me@example.com 2G
OK # 设置为 2GB
配额作用于 Dovecot(邮箱容量),值支持 1G/500M 等后缀,0 为不限。Dovecot 侧由用户库的 quota 字段驱动,无需改配置文件。
5.3 反垃圾链路参数(按邮件流经顺序)
| 环节 | 参数位置 | 实测关键值 |
|---|---|---|
| 收件 RBL 黑名单 | /etc/postfix/main.cf(smtpd_recipient_restrictions) | reject_rbl_client zen.spamhaus.org=127.0.0.[2..11]——命中 Spamhaus ZEN 即拒收 |
| 灰名单 postgrey | /etc/default/postgrey(POSTGREY_OPTS) | --inet=127.0.0.1:10023 --delay=180 --dbdir=/home/user-data/mail/postgrey/db——首次发件延迟 180 秒 |
| 内容过滤 SpamAssassin | /etc/spamassassin/local.cf | report_safe 0、评分头注入(add_header all Score _SCORE_)、pyzor 集成 |
| 出站签名 OpenDKIM | /home/user-data/mail/dkim/(密钥)+ DNS TXT 记录 | 密钥由脚本生成,DNS 记录自动发布 |
| 策略服务 | postfix 调用 127.0.0.1:12340 | Mail-in-a-Box 自带的发信策略守护(限额/速率控制) |
| 单信大小上限 | /etc/postfix/main.cf(message_size_limit) | 实测 134217728(128MB;nginx 侧同步配置,webmail/Z-Push 提交路径同限) |
自定义追加规则的正确姿势:SpamAssassin 规则追加到 /etc/spamassassin/local.cf(脚本只回填固定行,不删追加内容);postgrey 的延迟/白名单走 /etc/default/postgrey 与 /etc/cron.daily/mailinabox-postgrey-whitelist(每日自动拉取大厂白名单)。
5.4 自定义 DNS 记录
面板 DNS → Custom Records 与 API 落盘到 /home/user-data/dns/custom.yaml(实测初始 {})。添加后自动并入区域文件 /etc/nsd/zones/example.com.txt(实测同目录有 .ds、.signed 后缀文件——区域是 DNSSEC 签名的,手工改区域文件会被下次 dns_update 覆盖,永远走 API/面板)。
5.5 面板与守护进程参数
| 项 | 值 | 说明 |
|---|---|---|
| 守护进程监听 | 127.0.0.1:10222(实测 ss 输出) | 仅本机;对外经 nginx /admin/ 反代(/etc/nginx/conf.d/local.conf) |
| 服务单元 | /lib/systemd/system/mailinabox.service | gunicorn 承载,开机自启 |
| API 密钥文件 | /var/lib/mailinabox/api.key | 守护进程每次重启重新生成(详见 API 篇) |
| 状态检查 | management/status_checks.py | 每日随 cron 执行,结果推送管理员邮箱 |
六、生效机制实测:重跑会重写什么
Mail-in-a-Box 的配置生效机制是声明式重放:sudo mailinabox(重跑 setup/start.sh)按脚本里的固定值重新写配置。本站做了两组实测:
实测 1:/etc/mailinabox.conf 的回载与持久化。 把 MTA_STS_MODE=enforce 改为 testing 后重跑,重跑完成时该值保持 testing,且 /var/lib/mailinabox/mta-sts.txt 的 mode: 同步变为 testing。机制:重跑时旧配置被备份到 /tmp/mailinabox.prev.conf 并以 DEFAULT_ 前缀回载(DEFAULT_MTA_STS_MODE=testing),重写 conf 时取 MTA_STS_MODE=${DEFAULT_MTA_STS_MODE:-enforce}——旧值经 DEFAULT_ 变量传递,所以改 conf 是有效的持久化方式*。
实测 2:服务参数被脚本回填。 同一轮实验中把 /etc/postfix/main.cf 的 message_size_limit 改为 26214400(25MB),重跑后被 setup/mail-postfix.sh 回填为 134217728(128MB)——Postfix/Dovecot 等服务配置是"受管物",脚本按声明值覆盖。
两条由此而来的纪律:
- 编辑
mailinabox.conf要保持KEY=VALUE干净格式。实测中用工具编辑后在文件里残留了一行注释格式的旧值,重跑时回载器把该行前缀化为DEFAULT_#MTA_STS_MODE=...触发解析错误,直接让重跑静默失败——set -e+ 回载的组合对格式零容忍。 - 改服务参数后想持久:优先用组件自身机制(如 postgrey 走
/etc/default/postgrey),或在重跑后再改(接受下次重跑回填),或确认该参数不在脚本声明清单里。
顺带实测到的编辑工具:官方自带 tools/editconf.py(修改 KEY=VALUE 类配置文件的瑞士军刀):
python3 tools/editconf.py /etc/postfix/main.cf message_size_limit=26214400
以及配置变更后的统一生效按钮:重跑 sudo mailinabox。本站实测重跑三次:全部完成配置重写(幂等提示如 Nextcloud is already latest version),但有两次在收尾的首用户检查处提前退出——重跑会先重启管理守护进程,若脚本在该窗口期调用 management/cli.py user 拿到空结果,会误判"还没有任何用户"而尝试重建管理员:重跑环境带 EMAIL_ADDR 且账号已存在时脚本以退出码 1 终止;不带时则会真的创建 me@<主机名> 的新账号(实测即多出一个,需手动移除)。重跑前清空 EMAIL_ADDR/EMAIL_PW 环境变量、并确认守护进程已在运行(systemctl is-active mailinabox),可避开该窗口;即便踩中,前序配置重写均已生效,损失仅是退出码。
七、常见问题
Q1:改了 /etc/mailinabox.conf 但没生效? 该文件只是参数载体,生效靠重跑 sudo mailinabox。另注意公网 IP 类参数会被状态检查持续比对,改完重跑即对齐。
Q2:mailinabox.version 里的 15 和版本号 v77 什么关系? 15 是数据结构(schema)迁移版本,由 setup/migrate.py 管理账号库/配置的结构升级;v77 是组件版本。升级 Mail-in-a-Box 的方式就是重跑官方安装脚本(自动拉取新 TAG),迁移版本号随之推进。
Q3:换服务器怎么迁移? 数据全在 /home/user-data(含账号库、邮件、证书、DNSSEC 与备份加密密钥):新机器装好同版本 Mail-in-a-Box 后停服务、同步该目录、改 PRIMARY_HOSTNAME/IP 相关参数、重跑即可。务必带上 backup/secret_key.txt 与 dns/dnssec/。
Q4:MTA-STS 该用哪个模式? 新机器建议 testing 观察报告(TLSRPT),确认无兼容问题后切 enforce。切换方式即第六节实测路径:改 conf → 重跑。
八、参考链接
- 本站部署篇:《Ubuntu 22.04 安装 Mail-in-a-Box 指南》
- 官方仓库(setup/ 脚本即配置声明源):https://github.com/mail-in-a-box/mailinabox
- MTA-STS 标准:https://datatracker.ietf.org/doc/html/rfc8460
- duplicity 备份后端:https://duplicity.gitlab.io/