Isso 0.14.0 配置参数详解
Isso 0.14.0 全部九个配置节的参数详解:以源码默认值为基线逐项给出实测行为——host 白名单与 CORS、max-age 编辑窗口、moderation 审核闭环、guard 三类 403 拦截实录、SMTP 通知报文、markup 白名单渲染、hash salt 指纹与 rss Feed 开关,附生产配置模板与八则排障清单。
Isso 0.14.0 配置参数详解
本文对 Isso 0.14.0 的全部九个配置节做参数级详解:以源码内置默认值为基线,逐项给出「默认值 → 本文取值 → 实测行为」。全部行为均在真实服务器上以 curl 驱动 JSON API 实测并留存逐行回显(实测日期 2026-10-30),403 拦截原因、通知邮件报文、渲染结果等关键输出均照抄实录。
部署过程见《Isso Docker Compose 部署指南》,接口级用法见《Isso 0.14.0 API 使用详解》,组件定位见《Isso 0.14.0 介绍与选型指南》。
一、环境信息
| 项目 | 内容 |
|---|---|
| 组件版本 | Isso 0.14.0(/info 实测确认,上游最新稳定版) |
| 服务地址 | http://127.0.0.1:8141(API 与管理后台);演示页 http://127.0.0.1:8142 |
| 配置文件 | /opt/data/quzuo/tmp/isso/config/isso.cfg(服务侧经 ISSO_SETTINGS=/config/isso.cfg 读取) |
| 默认值基线 | 上游 0.14.0 源码包内置 isso/isso.cfg |
| 实测方法 | 每项参数改动后重启服务生效,以 curl 复核行为:403 拦截原因逐条比对、/config 公开开关、本地 SMTP 存根收件日志、渲染输出逐字比对 |
| 实测日期 | 2026-10-30 |
二、前置条件
- 一套运行中的 Isso 0.14.0(部署步骤见本系列部署指南),版本确认:
curl -s http://127.0.0.1:8141/info
实测回显:
{"version": "0.14.0", "host": "http://127.0.0.1:8141", "origin": "http://10.89.71.1:8142", "moderation": true}
- 已在配置文件中开启管理后台(
[admin]),便于复核审核类参数: - (可选)本地 SMTP 测试存根(本文用约 30 行 Python 脚本在 2525 端口收信并落日志),用于逐行观察通知邮件报文——生产接真实邮箱前建议先用同法演练。
三、参数查看与修改方式
3.1 配置文件的定位与生效
- Isso 启动时先加载内置默认值,再用
ISSO_SETTINGS环境变量指定的主配置覆盖。发行环境已内置ISSO_SETTINGS=/config/isso.cfg,因此只需维护/config下的isso.cfg; - 该变量优先级高于命令行
-c参数(源码isso/__init__.py注释原文:ISSO_SETTINGS env var takes precedence over -c flag); - 修改流程固定为三步:编辑
isso.cfg→ 重启 Isso 服务 → 复核(启动日志 +/config开关 + 行为实测)。不重启不生效。
3.2 运行时只读视图:/config 公开开关
/config 只暴露嵌入页需要的公开子集,不是全量配置:
curl -s http://127.0.0.1:8141/config
实测回显:
{"config": {"reply-to-self": true, "require-email": false, "require-author": false, "reply-notifications": true, "gravatar": true, "avatar": false, "feed": true}}
七个键与配置项的映射:reply-to-self ← [guard] reply-to-self;require-email / require-author ← [guard] 同名项;reply-notifications ← [general] reply-notifications;gravatar / avatar ← [general] gravatar(及头像开关);feed ← [rss] base 是否非空。改完配置用该端点做第一层复核最方便。
3.3 配置语法要点
- INI 风格。缩进的连续行表示多值列表(如
[general] host、[server] trusted-proxies,源码IssoParser.getiter按行切分); - 时长值支持人类可读单位组合,如
15m、30d、3h45m12s(解析时统一换算成秒,源码IssoParser.getint); - 布尔值用
true/false; - 0.14.0 起配置值支持环境变量替换(官方 CHANGES #1037,实现于
IssoParser.get),口令类敏感项可留在宿主环境而非写入文件。
四、参数总览
| 配置节 | 参数(默认值) | 本文取值 |
|---|---|---|
[general] | dbpath(/tmp/comments.db)、name(空)、host(空)、max-age(15m)、notify(stdout)、reply-notifications(false)、log-file(空)、gravatar(false)、gravatar-url(模板)、latest-enabled(false) | dbpath=/db/comments.db;host 三来源;max-age=15m;notify=stdout, smtp;reply-notifications/gravatar/latest-enabled=true |
[server] | listen(http://localhost:8080)、public-endpoint(空)、reload(false)、profile(false)、trusted-proxies(空)、samesite(空) | listen=http://0.0.0.0:8080/;trusted-proxies=10.89.71.1;samesite=Lax |
[admin] | enabled(false)、password(please_choose_a_strong_password) | enabled=true;password=q1w2e3r4 |
[moderation] | enabled(false)、approve-if-email-previously-approved(false)、purge-after(30d) | 全开:true / true / 30d |
[guard] | enabled(true)、ratelimit(2)、direct-reply(3)、reply-to-self(false)、require-author(false)、require-email(false) | ratelimit=4、direct-reply=3、reply-to-self=true,其余默认 |
[smtp] | username/password(空)、host(localhost)、port(587)、security(starttls)、to/from(空)、timeout(10) | 指向本地明文存根 10.89.71.1:2525、security=none |
[markup] | renderer(mistune)、allowed-elements(空)、allowed-attributes(空) | allowed-elements=img、allowed-attributes=src, alt |
[markup.mistune] | plugins(strikethrough, subscript, superscript)、parameters(escape, hard_wrap) | 未改,走默认 |
[markup.misaka] | options / flags(misaka 专用) | 未启用(misaka 已弃用) |
[hash] | salt(Eech7co8Ohloopo9Ol6baimi)、algorithm(pbkdf2) | salt=isso-test-salt-2026 |
[rss] | base(空)、limit(100) | base=http://127.0.0.1:8142/、limit=100 |
五、核心参数分类详解
5.1 [general] 全局参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
dbpath | /tmp/comments.db → /db/comments.db | SQLite 库路径。默认值在临时目录,源码注释明言「highly recommended to change this location to a non-temporary location!」,生产必改;启动日志会回显 Using database at '/db/comments.db' |
name | 空 → 未设置 | 多站点分发时的站点标识,单站点留空。多站点分发(isso.dispatch 入口 + ISSO_SETTINGS 目录扫描)本文未实测,口径来自官方文档与源码 |
host | 空 → 三个来源 | 站点白名单,缩进多值。作用有三:① 跨域响应头 Access-Control-Allow-Origin 只回显白名单来源;② 无 title 建线程时服务端按白名单抓取页面标题;③ 启动时逐项 HEAD 探测,全部不可达输出 WARNING。实测踩坑:白名单首项必须从服务侧可达,否则建线程报 400(排障见第七节第 2 条) |
max-age | 15m → 15m | 评论者编辑/删除自己评论的时间窗,同时是评论者 cookie 的寿命(实测新建评论响应 Set-Cookie 的 Max-Age=900 与其一致)。实测:窗口内携 cookie PUT 自己评论返回 200 且 modified 字段刷新;不携 cookie 编辑返回 403(回显:You don't have the permission to access the requested resource.) |
notify | stdout → stdout, smtp | 新评论通知渠道,逗号多值。stdout 打到日志;smtp 走 [smtp] 节发邮件(含激活/删除链接) |
reply-notifications | false → true | 允许评论者订阅回复通知。实测:父评论作者勾选通知后,子回复触发一封 Subject: Re: New comment posted on Isso ... 的邮件,收件人为父评论作者邮箱(存根日志 rcpt TO:<sunqi@example.com> 实录),邮件带 List-Unsubscribe 退订链接头。官方注释警告:开启它应同时开审核,防止被滥发 |
gravatar | false → true | 响应增加 gravatar_image 字段,实测值形如 https://www.gravatar.com/avatar/<md5>?d=identicon&s=55,公开列表与回复列表均携带 |
gravatar-url | 模板 → 默认 | 头像地址模板,占位符替换为邮箱哈希;s=55 即 55px |
latest-enabled | false → true | 控制 /latest 跨线程最新评论端点。实测关闭时 404 并回显 Unavailable because 'latest-enabled' not set by site admin;开启后返回跨线程的已审核评论列表(含 uri 字段) |
log-file | 空 → 未设置 | 日志落盘路径;留空输出到标准输出 |
5.2 [server] 服务参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
listen | http://localhost:8080 → http://0.0.0.0:8080/ | 监听地址,支持 TCP 与 Unix 域套接字(unix:///path/isso.sock)。默认仅本机可访问,对外服务需改 0.0.0.0 或反代地址 |
public-endpoint | 空 → 未设置 | 对外公布的完整服务地址,用于管理/通知邮件里拼接评论链接。实测佐证:通知邮件正文的 Link to comment 沿用了请求 origin(http://127.0.0.1:8141),即未配置时以实际请求为准;固定域名接入时设置它可让邮件链接与真实站点一致 |
trusted-proxies | 空 → 10.89.71.1 | 信任的反向代理地址列表。设置后真实来源取 X-Forwarded-For 链上最后一个非信任地址(源码 _remote_addr);不设置时所有用户共享代理出口地址的反垃圾配额。实测:多评论者模拟即依赖本项 + XFF 头 |
samesite | 空(http→Lax,https→None)→ Lax | 评论者 cookie 的 SameSite 策略。评论服务与站点不同域部署时需关注 |
reload / profile | false → 未设置 | 开发参数:热重载与慢请求剖析,仅对内置 Web 服务生效,官方明确「Do not use in production」。未实测 |
5.3 [admin] 管理后台参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
enabled | false → true | 开启后 /admin 提供管理后台 |
password | please_choose_a_strong_password → q1w2e3r4 | 后台口令(无用户名)。实测登录:错误口令返回 200 登录页;正确口令返回 302 FOUND → Location: http://127.0.0.1:8141/admin/,并下发 admin-session cookie(有效期 24 小时) |
5.4 [moderation] 审核策略参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
enabled | false → true | 开启后新评论一律待审:POST /new 返回 202 + mode=2,公开列表与 /count 计数均不含待审评论;关闭时 201 + mode=1 发布即上线(两者均有实测)。待审评论须放行后才可见 |
approve-if-email-previously-approved | false → true | 半年(6 个月)内有「通过记录」的邮箱自动放行:实测李四(此前已审核通过)第二次评论直接返回 201 / mode=1 入库可见。安全注意(源码注释原意):邮箱不经验证,可被猜测冒用,官方建议开启本项时同时开启 SMTP 通知以便知晓自动放行 |
purge-after | 30d → 30d | 待审评论超期自动清理。实测用 1m 演练:重启后管理后台待审队列从 Pending (5) 清空为 Pending (0),且回显公开计数 [3];单条待审评论约 2 分钟后自行消失——审核要及时,超期不可恢复 |
审核闭环实测(enabled=true 全流程):管理口令 POST /login/ 取得会话 → GET /admin/?mode=2 列出待审(页面内嵌每条的签名 key,形如 send_edit(5, 'NQ.auR_RQ.Rwrj_i5AkLiwQuLHKXUoIdfazHQ')→ POST /id/<id>/activate/<key> 放行、POST /id/<id>/delete/<key> 删除(均返回 200)→ 放行后 GET /?uri= 公开可见(实测 total_replies 从 0 变 2)。SMTP 通知邮件正文同样携带 Activate/Delete 链接(GET 形态先出确认页、POST 才执行);本文实测按邮件文本直接还原链接访问返回 403——链接经邮件 quoted-printable 编码,手工还原不精确即签名校验失败,生产上请直接使用邮件原链或管理后台。
5.5 [guard] 反垃圾参数
guard 在新评论入库前做拦截,命中即 403 且原因写明(POST /new 实测逐条命中过全部四类):
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
enabled | true → true | 官方推荐生产开启 |
ratelimit | 2 → 4 | 同一来源 60 秒滑动窗口内的全部新增评论上限(含待审)。超限回显:10.89.71.0: ratelimit exceeded (5, 6)——括号内是撞限的既有评论 id |
direct-reply | 3 → 3 | 同一来源对同一线程的直评(非回复)上限。重要实测发现:该计数没有时间窗——按「来源 × 线程」终身累计,超限回显 3 direct responses to /index.html。对长期站点意味着同一访客(同网段)在一个帖子下最多直评 3 条,其余只能以回复形式发出 |
reply-to-self | false → true | 是否允许在编辑窗口内回复自己刚发的评论。false 时拦截并回显 edit time frame is still open;true 时实测「自问自答」两条评论成功入库 |
require-author | false → false | true 时缺昵称即 403:author address required but not provided(实测) |
require-email | false → false | true 时缺邮箱即 403:email address required but not provided(实测) |
来源聚合规则:来源 IP 先经 /24(IPv4)或 /48(IPv6)匿名化再计数——同网段用户共享全部配额。实测:以 X-Forwarded-For 伪造同网段两个地址(.24 与 .30)发评,第二个地址被第一个的计数撞限。经反向代理接入时务必配 [server] trusted-proxies,否则全站共享代理出口的一个桶。
5.6 [smtp] 邮件通知参数
| 参数 | 默认 → 本文 | 说明 |
|---|---|---|
host / port | localhost / 587 → 10.89.71.1 / 2525 | SMTP 服务器与端口 |
security | starttls → none | none / starttls / ssl 三选一。本文对本地明文存根用 none;接真实邮箱务必用加密档(未实测真实投递,协议交互以存根逐行验证) |
username / password | 空 → 空 | 认证凭据,可选 |
to / from | 空 → admin@example.com / isso@example.com | 通知收件人与发件人 |
timeout | 10 → 10 | 连接类阻塞操作超时秒数 |
通知报文实测(存根日志逐行):管理员通知 From: Ich schrei sonst! <isso@example.com>(发件人显示名硬编码),Subject: New comment posted on Isso <线程标题>(中文标题走 UTF-8 base64 编码),正文 base64 编码,含评论内容、IP address、Link to comment、Delete comment 与 Activate comment 链接;回复通知如 5.1 所述发往父评论作者邮箱并带退订链接。SMTP 会话本身为标准流程(ehlo → mail FROM → rcpt TO → data → quit)。
5.7 [markup] 渲染参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
renderer | mistune → mistune | 0.14.0 新默认引擎(官方 CHANGES #1079);misaka 为弃用旧引擎,未来移除 |
allowed-elements | 空 → img | 在默认白名单外追加放行的 HTML 元素,逗号分隔。默认白名单(源码注释):a、blockquote、br、code、del、em、h1~h6、hr、ins、li、ol、p、pre、strong、table、tbody、td、th、thead、ul |
allowed-attributes | 空 → src, alt | 追加放行的属性,与元素独立。默认仅 align、href |
[markup.mistune] | plugins=strikethrough, subscript, superscript;parameters=escape, hard_wrap | 启动日志实录:Loading Mistune with plugins: ['strikethrough', 'subscript', 'superscript'] and parameters: ['escape', 'hard_wrap'] |
渲染行为实测三种情形:
- 默认(escape 开启):评论中的原始 HTML 整体转义为纯文本——
<img ...>、<script>alert(1)</script>均以转义文本呈现,XSS 注入无效; - 放行图片(本文
allowed-elements=img+allowed-attributes=src, alt):Markdown 图片语法渲染为真元素——实测输出<p>Markdown 图片:<img src="https://www.gravatar.com/avatar/97a979289edfdf0031359cff31583ef3?d=identicon&s=55" alt="头像"></p>; - 默认白名单内:链接渲染为
<a href="https://isso-comments.de" rel="nofollow noopener">Isso 官网</a>(自动追加 nofollow/noopener),删除线渲染为<del>不要了</del>。
5.8 [hash] 匿名化指纹参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
salt | Eech7co8Ohloopo9Ol6baimi → isso-test-salt-2026 | 防彩虹表加盐。默认值全互联网通用(同邮箱跨站同头像);换 salt 会让全站评论者指纹重算——实测同一邮箱(李四)指纹从默认 salt 的 b9ba06cd97d2 变为自定 salt 的 112c6bb9fe79,头像随之全部改变 |
algorithm | pbkdf2 → pbkdf2 | 也支持 hashlib 系列算法;pbkdf2 可带参数 pbkdf2:1000:6:sha1(迭代次数:输出字节:伪随机族),可只覆盖迭代次数如 pbkdf2:4096 |
指纹出现在响应的 hash 字段(邮箱优先,未留邮箱用来源 IP),是前端生成 identicon 的输入。
5.9 [rss] 订阅参数
| 参数 | 默认 → 本文 | 说明与实测 |
|---|---|---|
base | 空 → http://127.0.0.1:8142/ | 页面基地址,与线程 URI 拼出完整页面链接。留空即整体禁用 /feed:实测 404。设置后 GET /feed?uri=<线程> 返回 Atom XML,实测 <id>tag:127.0.0.1:8142,2018:/isso/thread/index.html</id>,每条 entry 含作者、评论页内锚点链接与 HTML 内容 |
limit | 100 → 100 | 每条线程 Feed 的条数上限 |
5.10 未实测参数如实说明
以下参数本文未实测,口径来自官方文档与源码,引用时请注意:[general] name 多站点分发;[server] reload / profile(仅内置服务器生效的开发参数);[smtp] security=starttls/ssl 与真实外部邮箱投递;回复通知邮件中的退订(unsubscribe)闭环(链接形态已从邮件头确认,完整流程未走通);[markup.misaka](misaka 渲染器,0.14.0 已弃用)。
六、生产配置模板
以下模板整合本文全部实测结论,可直接作为生产起点(值按站点替换;演示后台口令务必换强口令):
[general]
dbpath = /var/lib/isso/comments.db
host =
https://comments.example.com/
http://comments.example.com/
max-age = 15m
notify = stdout, smtp
reply-notifications = true
gravatar = true
latest-enabled = true
[server]
listen = http://0.0.0.0:8080/
trusted-proxies =
127.0.0.1
samesite = Lax
[admin]
enabled = true
password = please_choose_a_strong_password
[moderation]
enabled = true
approve-if-email-previously-approved = true
purge-after = 30d
[guard]
enabled = true
ratelimit = 4
direct-reply = 3
reply-to-self = true
require-author = false
require-email = false
[smtp]
host = smtp.example.com
port = 587
security = starttls
username = isso-notifier@example.com
password = please_choose_a_strong_password
to = admin@example.com
from = isso@example.com
timeout = 10
[markup]
renderer = mistune
allowed-elements = img
allowed-attributes = src, alt
[hash]
salt = please_generate_a_random_salt_string
algorithm = pbkdf2
[rss]
base = https://comments.example.com/
limit = 100
要点:dbpath 移出临时目录;host 白名单写真实域名(首项须服务侧可达);trusted-proxies 写紧贴服务的代理地址;salt 用随机长串且一经上线不再更换;其余与本文实测配置同构。
七、常见问题
- 改了配置不生效:必须重启 Isso 服务;重启后先看启动日志(数据库路径、Mistune 引擎行),再用
/config核对公开开关子集。 - 启动 WARNING
unable to connect to your website:[general] host白名单逐项 HEAD 探测全部失败。检查首项是否服务侧可达——实测踩坑:页面服务与 Isso 不同网段时,白名单要写「从服务侧看得到的地址」(如网关地址),写宿主局域网 IP 会一直告警且建线程报 400Cannot create new thread: URI ... is not accessible and no title was provided。 - 提交返回 403
ratelimit exceeded (N, M):60 秒窗口内同来源评论超限。来源按 /24 网段聚合,同网段共享额度;调大ratelimit或配好trusted-proxies让来源解析落到真实访客。 - 提交返回 403
N direct responses to <uri>:同来源对该线程的直评达上限(默认 3,且无时间窗、终身累计)。引导用户以「回复」形式参与,或适度调大。 - 待审评论不见了:
purge-after到期自动清理,不可恢复;审核要形成定期处理习惯(管理后台或邮件链接)。 - 邮件收不到:确认
notify含smtp;用本地明文存根(security=none)验证协议交互后再切真实服务器;security档位与服务器要求一致;to/from已填。 - 升级/迁移后所有头像变了:
[hash] salt与历史不一致。salt 变更会重算全部指纹,属预期行为;跨迁移应保持 salt 不变。 /feed返回 404:[rss] base为空即禁用 Feed,填写页面基地址即恢复。
参考链接
- 官方配置参考:https://isso-comments.de/docs/reference/configuration/
- 源码内置默认配置(0.14.0):https://github.com/posativ/isso/blob/0.14.0/isso/isso.cfg
- 0.14.0 Release 说明(Mistune 引擎、环境变量替换等变更):https://github.com/posativ/isso/releases/tag/0.14.0
- GitHub 仓库:https://github.com/posativ/isso