Postorius 1.3.13 配置参数详解
Postorius 1.3.13 配置体系逐项详解:settings.py 的 MAILMAN_REST_API_* 数据通道与 POSTORIUS_TEMPLATE_BASE_URL 等核心参数表解,core 侧 [webservice] 对端配置与 mailmanclient 实测验证,uwsgi 双协议 socket 与 nginx 逐指令说明,附配置生效矩阵、URL 挂载地图与 8 条真实 FAQ。
Postorius 1.3.13 配置参数详解
目标:逐项讲透 Postorius 1.3.13 的配置体系——Django 主体 settings.py(重点是与 Mailman core 的 REST 集成参数)、uwsgi + nginx 服务承载、配置生效矩阵与验证序列。每个参数给出默认值、实测语义与生产建议,配置示例全部来自真实安装环境(Ubuntu 22.04 + Postorius 1.3.13,实测日期 2026-10-26)。安装过程见 《Ubuntu 22.04 安装 Postorius 1.3.13 指南》。
一、环境信息
- 软件版本:Postorius 1.3.13、mailman-web 0.0.9(Django 工程模板包)、django-mailman3 1.3.15、Mailman core 3.3.10、mailmanclient 3.3.5、Django 4.2.30、uwsgi 2.0.20、nginx 1.18.0、PostgreSQL 14.24
- 本篇涉及的配置文件清单(实测环境中的真实路径):
| 文件 | 归属 | 职责 |
|---|---|---|
| /etc/mailman3/settings.py | Postorius(Django 主体,与 HyperKitty 共用) | 安全、数据库、与 core 的 REST 集成、账号体系、本地化 |
| /etc/mailman3/mailman.cfg([webservice] 段) | Mailman core | REST API 监听地址与凭据(Postorius 的数据通道对端) |
| /etc/uwsgi/mailman-web.ini | uwsgi | WSGI 应用承载参数 |
| /etc/nginx/sites-available/mailman-web | nginx | 反代与静态资源 |
- 配置装载机制(实测验证):mailman-web 0.0.9 的 wsgi 与管理命令入口先执行
mailman_web.manage.setup(),读取环境变量MAILMAN_WEB_CONFIG(缺省/etc/mailman3/settings.py),将该文件所在目录加入sys.path并把DJANGO_SETTINGS_MODULE指向它——因此 uwsgi 与 systemd 单元里的env = MAILMAN_WEB_CONFIG=/etc/mailman3/settings.py是配置生效的总开关。 - 生效方式:settings.py 与 uwsgi.ini 改后
systemctl restart mailman-web;mailman.cfg 的[webservice]改后systemctl restart mailman3 mailman-web(两端成对改);nginx 站点改后nginx -t && systemctl reload nginx。所有回显均实测采集。
二、配置体系总览
Postorius 是纯 REST 客户端形态的 Django 应用:它不收邮件、不直接读库里的列表数据,一切列表数据都经 MAILMAN_REST_API_* 指向的 core REST API 获取。理解这条数据通道是配置管理的核心:
浏览器/nginx
│
▼
uwsgi(/etc/uwsgi/mailman-web.ini)
│ env: MAILMAN_WEB_CONFIG=/etc/mailman3/settings.py
▼
Postorius Django 应用(/etc/mailman3/settings.py 覆盖 mailman_web.settings 默认值)
│
│ MAILMAN_REST_API_URL/USER/PASS ──▶ Mailman core REST(mailman.cfg [webservice],127.0.0.1:8001)
│ ▲ 列表/域/订阅者/Held Message 全部数据来自这里
│ POSTORIUS_TEMPLATE_BASE_URL ──▶ 本机 uwsgi http-socket(127.0.0.1:8000,模板渲染回源)
▼
(同一 settings.py 还装载 HyperKitty——归档推送链路属 HyperKitty,见文末交叉引用)
| 层次 | 文件 | 加载方 | 改后生效动作 |
|---|---|---|---|
| Django 主体 | /etc/mailman3/settings.py | uwsgi 与所有 mailman-web 命令 | restart mailman-web |
| core REST 对端 | /etc/mailman3/mailman.cfg [webservice] | core 启动时 | restart mailman3 与 mailman-web(成对改) |
| 应用承载 | /etc/uwsgi/mailman-web.ini | uwsgi | restart mailman-web |
| 入口反代 | nginx 站点 | nginx | reload nginx |
优先级关系:settings.py 逐行 from mailman_web.settings.base import *、from mailman_web.settings.mailman import * 之后写覆盖项,后写的值生效。MAILMAN_REST_API_* 与 POSTORIUS_TEMPLATE_BASE_URL 的缺省值正来自 mailman.py 模块(实测源码:MAILMAN_REST_API_URL = 'http://localhost:8001'、POSTORIUS_TEMPLATE_BASE_URL = 'http://localhost:8000');Postorius 源码自带的 example_project/settings.py 展示了全部可覆盖项(POSTORIUS_API_DEBUG、LOGIN_REDIRECT_URL 等),生产环境以「mailman-web 基座 + 少量覆盖行」为标准形态。
三、settings.py 核心参数详解
3.1 实测配置全文
(来自实测环境 /etc/mailman3/settings.py,生产可直接套用后按 3.2 的表逐项核对)
from mailman_web.settings.base import *
from mailman_web.settings.mailman import *
SECRET_KEY = "pm3-prod-secret-key-change-me-0123456789abcdef"
DEBUG = False
ALLOWED_HOSTS = ["pm1.example.com", "localhost", "127.0.0.1"]
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": "mailmanweb",
"USER": "mailman",
"PASSWORD": "q1w2e3r4",
"HOST": "localhost",
"PORT": "5432",
}
}
TIME_ZONE = "Asia/Shanghai"
USE_TZ = True
STATIC_ROOT = "/opt/mailman/mm/static"
MEDIA_ROOT = "/opt/mailman/mm/media"
STATIC_URL = "/static/"
MEDIA_URL = "/media/"
MAILMAN_REST_API_URL = "http://localhost:8001"
MAILMAN_REST_API_USER = "restadmin"
MAILMAN_REST_API_PASS = "restpass"
MAILMAN_ARCHIVER_KEY = "SecretArchiverAPIKey"
MAILMAN_ARCHIVER_FROM = ("127.0.0.1", "::1")
POSTORIUS_TEMPLATE_BASE_URL = "http://localhost:8000"
DEFAULT_FROM_EMAIL = "postorius@example.com"
SERVER_EMAIL = "postorius@example.com"
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "http"
HAYSTACK_CONNECTIONS = {
"default": {
"ENGINE": "haystack.backends.whoosh_backend.WhooshEngine",
"PATH": "/opt/mailman/mm/fulltext_index",
}
}
3.2 参数逐项详解
与 Mailman core 集成类(本组是 Postorius 配置的灵魂)
| 参数 | 默认值 | 实测值 | 说明与生产建议 |
|---|---|---|---|
| MAILMAN_REST_API_URL | http://localhost:8001(mailman.py) | 同默认 | core REST 地址,Postorius 所有列表数据的数据源;core 只绑 127.0.0.1 时本机直连即可,跨机部署改 core 主机地址并同步 core 侧 [webservice] |
| MAILMAN_REST_API_USER / PASS | restadmin/restpass(mailman.py) | restadmin/restpass | REST 凭据,与 mailman.cfg [webservice] 的 admin_user/admin_pass 成对修改;不一致时 Postorius 全站报「Mailman REST API 暂不可用」类错误(FAQ Q1);生产务必改掉默认口令 |
| POSTORIUS_TEMPLATE_BASE_URL | http://localhost:8000(mailman.py) | 同默认 | Postorius 渲染列表页模板时的回源基址,必须指向有 HTTP 应答的地址(uwsgi http-socket 或 nginx);指向错误端口时列表页渲染 500(FAQ Q2) |
| POSTORIUS_API_DEBUG | False(源码 example_project) | False | 开发期调试 Postorius→core 的 API 调用(配合 APICountingMiddleware 统计);生产恒 False,仅 DEBUG=True 时生效 |
安全类
| 参数 | 默认值 | 实测值 | 说明与生产建议 |
|---|---|---|---|
| SECRET_KEY | base 内置固定串 | 演示串 | Django 会话/CSRF/密码重置令牌的签名密钥。生产必须换 ≥50 位随机串(python3 -c "import secrets; print(secrets.token_urlsafe(50))");更换后全部登录会话失效(FAQ Q3) |
| DEBUG | False(base) | False | 调试页会暴露配置与栈信息,生产恒 False |
| ALLOWED_HOSTS | base 预置 localhost 等 | pm1.example.com, localhost, 127.0.0.1 | Host 头白名单;只放真实对外域名,遗漏会得到 400(FAQ Q4);多域名逗号分隔 |
| ACCOUNT_DEFAULT_HTTP_PROTOCOL | http(base;example_project 示例为 https) | http | django-allauth 生成的账号链接协议;上 HTTPS 后必须同步改 https,否则找回密码等链接走错协议 |
数据库类
| 参数 | 说明与生产建议 |
|---|---|
| DATABASES.default | Postorius 独立库。实测 mailmanweb,与 core 的 mailman 库分离——Postorius 自身只存用户/会话/站点配置等 Django 数据,列表数据不在此库(在 core 的 mailman 库,经 REST 读取);ENGINE 按需换 mysql/sqlite(官方支持,生产推荐 postgresql) |
| HOST/PORT | 实测 localhost:5432 走 TCP+密码;改动后仅需 restart mailman-web |
账号与跳转类(Postorius 的登录体验)
| 参数 | 默认值 | 实测值 | 说明与生产建议 |
|---|---|---|---|
| LOGIN_URL | 'account_login'(example_project 同值) | 同默认 | django-allauth 登录路由名,未登录访问管理页时跳这里(实测 /accounts/login/ 200) |
| LOGIN_REDIRECT_URL | 'list_index'(base 源码) | 同默认 | 登录成功后的落地页——Postorius 列表索引,实测根路径 301 的 /mailman3/lists/ 即该路由别名前缀 |
| ACCOUNT_EMAIL_VERIFICATION | 'mandatory'(example_project) | base 默认 | 'mandatory' 强制邮箱验证(生产推荐);演示环境可改 'none' 免验证直接登录 |
| ACCOUNT_LOGIN_METHODS | {'email','username'} | base 默认 | 允许用户名或邮箱登录;新 allauth 版本用此键取代旧 ACCOUNT_AUTHENTICATION_METHOD(首启 migrate 时的 deprecated 告警即源于 mailman-web 0.0.9 预置旧键,不影响功能) |
路径与静态资源类
| 参数 | 默认值 | 实测值 | 说明与生产建议 |
|---|---|---|---|
| STATIC_ROOT | base 内置 | /opt/mailman/mm/static | collectstatic 汇集目录,nginx alias 指向它;权限需 uwsgi 运行用户可写 |
| MEDIA_ROOT | base 内置 | /opt/mailman/mm/media | 用户上传文件目录 |
| STATIC_URL / MEDIA_URL | /static/、/media/ | 同默认 | URL 前缀,与 nginx location 一一对应,勿单独改动其一 |
| HAYSTACK_CONNECTIONS.default.PATH | base 内置 | /opt/mailman/mm/fulltext_index | Whoosh 全文索引目录(HyperKitty 搜索用,同栈共用);纳入备份 |
邮件类
| 参数 | 默认值 | 实测值 | 说明与生产建议 |
|---|---|---|---|
| EMAIL_BACKEND | console(base) | console | 演示用控制台后端;生产换 django.core.mail.backends.smtp.EmailBackend 并补 EMAIL_HOST/PORT 等参数,否则用户收不到订阅确认/密码重置邮件 |
| DEFAULT_FROM_EMAIL | postorius@localhost.local(example_project) | postorius@example.com | Postorius 发出邮件(地址确认等)的发件人,应使用真实可回信地址 |
| SERVER_EMAIL | root@localhost.local(example_project) | postorius@example.com | 发给管理员的系统邮件发件人 |
| TIME_ZONE / USE_TZ | base 默认 | Asia/Shanghai / True | 页面时间戳显示;USE_TZ=True 保持不改 |
四、core 侧对端配置与 REST 集成验证
Postorius 的 REST 凭据在 core 侧的落点是 mailman.cfg 的 [webservice] 段(属 Mailman core 配置体系,完整解析见 《Mailman 3.3.10 配置参数详解》,此处列与 Postorius 相关的四行):
[webservice]
host: 127.0.0.1
port: 8001
admin_user: restadmin
admin_pass: restpass
host/port:REST 监听地址,Postorius 的MAILMAN_REST_API_URL必须可达这里;只绑 127.0.0.1 即不对公网暴露管理 API;admin_user/admin_pass:与 settings.py 的MAILMAN_REST_API_USER/PASS成对,改必须两端同时改。
验证集成链路是否就绪(实测回显——用 Postorius 同款客户端库 mailmanclient 走一遍真实调用):
su -s /bin/bash mailman -c 'echo "
from mailmanclient import Client
c = Client(\"http://localhost:8001/3.0\", \"restadmin\", \"restpass\")
print(\"REST lists:\", [l.fqdn_listname for l in c.lists])
print(\"REST domains:\", [d.mail_host for d in c.domains])
" | /opt/mailman/venv/bin/mailman-web shell'
REST lists: ['testlist@example.com']
REST domains: ['example.com']
(能列出域与列表即 URL+凭据双通过——这正是 Postorius 列表页背后发生的事。)
模板回源地址与 REST 地址的连通性(实测回显):
curl -s -o /dev/null -w 'POSTORIUS_TEMPLATE_BASE_URL: %{http_code}\n' http://localhost:8000/
curl -s -o /dev/null -w 'REST from web host: %{http_code}\n' -u restadmin:restpass http://localhost:8001/3.0/system/versions
POSTORIUS_TEMPLATE_BASE_URL: 301
REST from web host: 200
(301 是根路径到列表页的正常重定向;200 即 REST 凭据有效。)
📌 同一 settings.py 还承载同栈部署的 HyperKitty:
MAILMAN_ARCHIVER_KEY/MAILMAN_ARCHIVER_FROM归档令牌与来源白名单、以及 core 侧mailman-hyperkitty.cfg推送配置的逐项详解见 《HyperKitty 1.3.12 配置参数详解》第四章——Postorius 本身不参与归档链路,但在 mailman-web 一体化部署中共用这套配置。
五、uwsgi 承载配置详解
/etc/uwsgi/mailman-web.ini(实测全文):
[uwsgi]
plugins = python3
socket = /opt/mailman/mm/uwsgi.sock
chmod-socket = 666
http-socket = 127.0.0.1:8000
chdir = /opt/mailman/web
virtualenv = /opt/mailman/venv
module = mailman_web.wsgi:application
env = MAILMAN_WEB_CONFIG=/etc/mailman3/settings.py
master = true
processes = 4
threads = 2
harakiri = 60
max-requests = 500
vacuum = true
uid = mailman
gid = mailman
logto = /opt/mailman/mm/var/log/uwsgi.log
逐项详解:
| 参数 | 实测值 | 说明与生产建议 |
|---|---|---|
| plugins | python3 | 加载 Debian/Ubuntu 打包的 Python3 插件,缺失会报 -- unavailable modifier requested |
| socket | /opt/mailman/mm/uwsgi.sock | uwsgi 二进制协议 unix socket,供 nginx uwsgi_pass 使用;nginx→uwsgi 全站 502 的第一排查点(FAQ Q5) |
| chmod-socket | 666 | 让 nginx 运行用户(www-data)可读写该 sock;权限不对同样是 502 |
| http-socket | 127.0.0.1:8000 | 原生 HTTP 监听,供 POSTORIUS_TEMPLATE_BASE_URL 回源与归档插件推送(都是 HTTP 客户端,说不了 uwsgi 协议);与 socket 行并存、各服务其主——只留一行必踩 502 或 500 二选一(FAQ Q2/Q5) |
| chdir / module | /opt/mailman/web / mailman_web.wsgi:application | 直接使用 mailman-web 包内置工程,无需自建 Django 项目 |
| virtualenv | /opt/mailman/venv | 应用运行环境隔离,与安装环境一致 |
| env | MAILMAN_WEB_CONFIG=/etc/mailman3/settings.py | settings 装载总开关(见第一章),漏写则应用落到内置默认配置、数据库连不上 |
| processes / threads | 4 / 2 | worker×线程池;Postorius 页面多为 REST 聚合渲染(列表页要拼订阅数/Held 数),2C4G 建议从 4×2 起步观察 |
| harakiri | 60 | 单请求 60 秒强杀,防 REST 卡死拖垮 worker |
| max-requests | 500 | 每 500 请求回收 worker,抑制内存泄漏 |
| vacuum / uid / gid | true / mailman / mailman | 退出自清理 sock 与 pid;以专用系统用户运行 |
| logto | …/var/log/uwsgi.log | 应用日志落盘,排障第一现场 |
六、nginx 反代配置详解
/etc/nginx/sites-available/mailman-web(实测全文):
server {
listen 80;
server_name pm1.example.com;
access_log /var/log/nginx/mailman-web.access.log;
error_log /var/log/nginx/mailman-web.error.log;
client_max_body_size 20m;
location /static/ {
alias /opt/mailman/mm/static/;
expires 30d;
}
location /media/ {
alias /opt/mailman/mm/media/;
expires 7d;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/opt/mailman/mm/uwsgi.sock;
uwsgi_read_timeout 300;
}
}
逐项详解:
| 指令 | 说明与生产建议 |
|---|---|
| server_name | 与 settings.py 的 ALLOWED_HOSTS 一致;两者不一致时 Django 直接 400 |
| client_max_body_size 20m | nginx 默认 1m 会拦掉大文件上传场景,按业务放宽 |
| location /static/ | alias 指向 STATIC_ROOT,动静分离;expires 30d 带版本指纹的静态资源可长缓存 |
| location /media/ | 用户文件目录,注意目录权限与敏感文件泄露(不允许目录索引) |
| uwsgi_pass unix:… | uwsgi 二进制协议走 unix socket(对应 uwsgi.ini 的 socket 行);这是与一般 HTTP 反代最大的差异点 |
| uwsgi_read_timeout 300 | 慢请求(批量订阅者操作)容忍上限,与 harakiri 配合观察 |
Postorius URL 挂载地图(mailman-web 0.0.9 实测行为,配置 nginx 后自检用):
| 路径 | 实测状态码 | 说明 |
|---|---|---|
/ | 301 → /mailman3/lists/ | 根路径落到 Postorius 列表索引 |
/mailman3/lists/ | 200 | Postorius 列表索引(官方别名前缀) |
/postorius/lists/ | 200 | Postorius 原生前缀,同一套视图 |
/postorius/lists/testlist.example.com/ | 200 | 列表详情(订阅者/设置/Held Message 入口) |
/accounts/login/ | 200 | django-allauth 登录页(LOGIN_URL 指向的路由) |
/hyperkitty/ | 200 | HyperKitty 归档前端(同栈部署时) |
/static/django-mailman3/css/main.css | 200 | nginx 直接托管的静态资源样例 |
改后生效与验证:
nginx -t && systemctl reload nginx
curl -sI http://127.0.0.1/ | grep -iE 'HTTP|Location'
HTTP/1.1 301 Moved Permanently
Location: /mailman3/lists/
(301 落到 Postorius 列表索引即入口正常。)
七、配置变更生效矩阵与验证
| 改动 | 需要的动作 | 连带影响 |
|---|---|---|
| settings.py 任意参数 | systemctl restart mailman-web | uwsgi 短暂重启,约 1–2 秒闪断 |
| SECRET_KEY | restart mailman-web | 全体用户重新登录 |
| MAILMAN_REST_API_USER/PASS | 两端成对改:mailman.cfg [webservice] → restart mailman3 → settings.py → restart mailman-web | 先改一端会出现 REST 401,Postorius 全站报数据源不可用,按顺序两端都在秒级恢复 |
| MAILMAN_REST_API_URL | restart mailman-web(core 跨机迁移时连 core 侧 [webservice] host 一起改) | 切换间隙列表页数据为空 |
| POSTORIUS_TEMPLATE_BASE_URL | restart mailman-web | 指向错误端口时列表页 500 |
| uwsgi.ini | restart mailman-web | 同 settings.py |
| nginx 站点 | nginx -t && reload nginx | 无感热加载 |
变更后的标准验证序列(全部实测通过):① systemctl is-active mailman3 mailman-web nginx postgresql postfix 五服务全 active;② mailmanclient 实测 REST 列表/域可读(第四章回显);③ POSTORIUS_TEMPLATE_BASE_URL 回源 301(第四章回显);④ curl -o /dev/null -w '%{http_code}' http://127.0.0.1/postorius/lists/ 得 200;⑤ 浏览器登录 admin 后列表详情页可开(/postorius/lists/testlist.example.com/ 200)。
八、常见问题(FAQ)
Q1:Postorius 页面打开报「Mailman REST API is not available / 暂不可用」,但网站其他页正常?
这是 Postorius 最典型的故障:MAILMAN_REST_API_URL/USER/PASS 与 core 侧 [webservice] 不匹配(改过一端口令、或 URL 端口写错)。先用第四章的 mailmanclient 一行验证(列出列表即通);不通时核对两端四行配置,成对修改后 systemctl restart mailman3 mailman-web。另外确认 core 在跑:systemctl is-active mailman3。
Q2:列表索引页 500,uwsgi 日志见模板渲染异常?
POSTORIUS_TEMPLATE_BASE_URL 指向了无 HTTP 应答的地址(典型:误指 nginx 80 之外的端口、或误删 uwsgi.ini 的 http-socket 行——该地址必须是纯 HTTP 端点)。用第四章的 curl 自检恢复 301/200 后 restart mailman-web。
Q3:换了 SECRET_KEY 之后发生什么? 所有已签发会话立即失效,用户需重新登录;密码重置链接作废。账号与已做的列表配置不受影响。生产建议在首次上线前就定好强随机值并纳入配置备份。
Q4:页面报 400(Bad Request)?
请求 Host 头不在 ALLOWED_HOSTS 白名单。补上真实访问域名(nginx server_name 同步核对)后 restart mailman-web。
Q5:nginx 全站 502,sock 文件也在?
uwsgi.ini 缺 socket = 行(只写了 http-socket)。nginx 的 uwsgi_pass 需要uwsgi 二进制协议,socket 与 http-socket 必须并存(第五章)。同时核对 chmod-socket 666 是否被改过——权限收窄后 www-data 打不开 sock 同样 502。
Q6:登录成功后跳回登录页或落错页面?
登录落点由 LOGIN_REDIRECT_URL 控制(默认 'list_index' 落列表索引);跳回登录页一般是会话问题:SECRET_KEY 刚换过(Q3)或多 worker 间时区/时钟不一致。检查 uwsgi 所在机器时间同步即可。
Q7:想统计/调试 Postorius 对 core 发出的 REST 调用?
源码预留了调试开关:settings.py 里 DEBUG = True 且 POSTORIUS_API_DEBUG = True 时启用 APICountingMiddleware(见 example_project 源码)。仅限开发环境临时用,排障后立即关回 False。
Q8:想把 Postorius 挂到 / 前缀以外的子路径?
需要同时改:nginx location 加路径前缀、settings.py 的 STATIC_URL/MEDIA_URL 前缀;POSTORIUS_TEMPLATE_BASE_URL 若含路径需一并核对。官方不建议子路径部署,优先用独立子域名。
九、参考链接
- Postorius 官方配置文档:https://postorius.readthedocs.io/en/latest/
- Postorius example_project/settings.py(全部可覆盖项的官方示例):https://gitlab.com/mailman/postorius/-/blob/master/example_project/settings.py
- mailman-web 包 settings 基座(base/mailman 模块源码):https://gitlab.com/mailman/mailman-web
- Django Settings 官方手册:https://docs.djangoproject.com/en/stable/ref/settings/
- uwsgi 官方文档(socket 与 http-socket):https://uwsgi-docs.readthedocs.io/en/latest/
- 站内参考:《Postorius 1.3.13 介绍与选型指南》、《Ubuntu 22.04 安装 Postorius 1.3.13 指南》、《Mailman 3.3.10 配置参数详解》、《HyperKitty 1.3.12 配置参数详解》
(实测环境:Ubuntu 22.04 + Postorius 1.3.13,配置文件与全部回显采集日期 2026-10-26)