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。

Postorius2026/10/26

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.pyPostorius(Django 主体,与 HyperKitty 共用)安全、数据库、与 core 的 REST 集成、账号体系、本地化
/etc/mailman3/mailman.cfg([webservice] 段)Mailman coreREST API 监听地址与凭据(Postorius 的数据通道对端)
/etc/uwsgi/mailman-web.iniuwsgiWSGI 应用承载参数
/etc/nginx/sites-available/mailman-webnginx反代与静态资源
  • 配置装载机制(实测验证):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.pyuwsgi 与所有 mailman-web 命令restart mailman-web
core REST 对端/etc/mailman3/mailman.cfg [webservice]core 启动时restart mailman3 与 mailman-web(成对改)
应用承载/etc/uwsgi/mailman-web.iniuwsgirestart mailman-web
入口反代nginx 站点nginxreload 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_URLhttp://localhost:8001(mailman.py)同默认core REST 地址,Postorius 所有列表数据的数据源;core 只绑 127.0.0.1 时本机直连即可,跨机部署改 core 主机地址并同步 core 侧 [webservice]
MAILMAN_REST_API_USER / PASSrestadmin/restpass(mailman.py)restadmin/restpassREST 凭据,与 mailman.cfg [webservice] 的 admin_user/admin_pass 成对修改;不一致时 Postorius 全站报「Mailman REST API 暂不可用」类错误(FAQ Q1);生产务必改掉默认口令
POSTORIUS_TEMPLATE_BASE_URLhttp://localhost:8000(mailman.py)同默认Postorius 渲染列表页模板时的回源基址,必须指向有 HTTP 应答的地址(uwsgi http-socket 或 nginx);指向错误端口时列表页渲染 500(FAQ Q2)
POSTORIUS_API_DEBUGFalse(源码 example_project)False开发期调试 Postorius→core 的 API 调用(配合 APICountingMiddleware 统计);生产恒 False,仅 DEBUG=True 时生效

安全类

参数默认值实测值说明与生产建议
SECRET_KEYbase 内置固定串演示串Django 会话/CSRF/密码重置令牌的签名密钥。生产必须换 ≥50 位随机串(python3 -c "import secrets; print(secrets.token_urlsafe(50))");更换后全部登录会话失效(FAQ Q3)
DEBUGFalse(base)False调试页会暴露配置与栈信息,生产恒 False
ALLOWED_HOSTSbase 预置 localhost 等pm1.example.com, localhost, 127.0.0.1Host 头白名单;只放真实对外域名,遗漏会得到 400(FAQ Q4);多域名逗号分隔
ACCOUNT_DEFAULT_HTTP_PROTOCOLhttp(base;example_project 示例为 https)httpdjango-allauth 生成的账号链接协议;上 HTTPS 后必须同步改 https,否则找回密码等链接走错协议

数据库类

参数说明与生产建议
DATABASES.defaultPostorius 独立库。实测 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_ROOTbase 内置/opt/mailman/mm/staticcollectstatic 汇集目录,nginx alias 指向它;权限需 uwsgi 运行用户可写
MEDIA_ROOTbase 内置/opt/mailman/mm/media用户上传文件目录
STATIC_URL / MEDIA_URL/static/、/media/同默认URL 前缀,与 nginx location 一一对应,勿单独改动其一
HAYSTACK_CONNECTIONS.default.PATHbase 内置/opt/mailman/mm/fulltext_indexWhoosh 全文索引目录(HyperKitty 搜索用,同栈共用);纳入备份

邮件类

参数默认值实测值说明与生产建议
EMAIL_BACKENDconsole(base)console演示用控制台后端;生产换 django.core.mail.backends.smtp.EmailBackend 并补 EMAIL_HOST/PORT 等参数,否则用户收不到订阅确认/密码重置邮件
DEFAULT_FROM_EMAILpostorius@localhost.local(example_project)postorius@example.comPostorius 发出邮件(地址确认等)的发件人,应使用真实可回信地址
SERVER_EMAILroot@localhost.local(example_project)postorius@example.com发给管理员的系统邮件发件人
TIME_ZONE / USE_TZbase 默认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

逐项详解:

参数实测值说明与生产建议
pluginspython3加载 Debian/Ubuntu 打包的 Python3 插件,缺失会报 -- unavailable modifier requested
socket/opt/mailman/mm/uwsgi.sockuwsgi 二进制协议 unix socket,供 nginx uwsgi_pass 使用;nginx→uwsgi 全站 502 的第一排查点(FAQ Q5)
chmod-socket666让 nginx 运行用户(www-data)可读写该 sock;权限不对同样是 502
http-socket127.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应用运行环境隔离,与安装环境一致
envMAILMAN_WEB_CONFIG=/etc/mailman3/settings.pysettings 装载总开关(见第一章),漏写则应用落到内置默认配置、数据库连不上
processes / threads4 / 2worker×线程池;Postorius 页面多为 REST 聚合渲染(列表页要拼订阅数/Held 数),2C4G 建议从 4×2 起步观察
harakiri60单请求 60 秒强杀,防 REST 卡死拖垮 worker
max-requests500每 500 请求回收 worker,抑制内存泄漏
vacuum / uid / gidtrue / 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 20mnginx 默认 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/200Postorius 列表索引(官方别名前缀)
/postorius/lists/200Postorius 原生前缀,同一套视图
/postorius/lists/testlist.example.com/200列表详情(订阅者/设置/Held Message 入口)
/accounts/login/200django-allauth 登录页(LOGIN_URL 指向的路由)
/hyperkitty/200HyperKitty 归档前端(同栈部署时)
/static/django-mailman3/css/main.css200nginx 直接托管的静态资源样例

改后生效与验证:

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-webuwsgi 短暂重启,约 1–2 秒闪断
SECRET_KEYrestart mailman-web全体用户重新登录
MAILMAN_REST_API_USER/PASS两端成对改:mailman.cfg [webservice] → restart mailman3 → settings.py → restart mailman-web先改一端会出现 REST 401,Postorius 全站报数据源不可用,按顺序两端都在秒级恢复
MAILMAN_REST_API_URLrestart mailman-web(core 跨机迁移时连 core 侧 [webservice] host 一起改)切换间隙列表页数据为空
POSTORIUS_TEMPLATE_BASE_URLrestart mailman-web指向错误端口时列表页 500
uwsgi.inirestart 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 若含路径需一并核对。官方不建议子路径部署,优先用独立子域名。

九、参考链接

(实测环境:Ubuntu 22.04 + Postorius 1.3.13,配置文件与全部回显采集日期 2026-10-26)