Isso 0.14.0 配置参数详解

Isso 0.14.0 全部九个配置节的参数详解:以源码默认值为基线逐项给出实测行为——host 白名单与 CORS、max-age 编辑窗口、moderation 审核闭环、guard 三类 403 拦截实录、SMTP 通知报文、markup 白名单渲染、hash salt 指纹与 rss Feed 开关,附生产配置模板与八则排障清单。

Isso自托管SQLite2026/10/30

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

二、前置条件

  1. 一套运行中的 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}
  1. 已在配置文件中开启管理后台([admin]),便于复核审核类参数:
  2. (可选)本地 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.dbSQLite 库路径。默认值在临时目录,源码注释明言「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-age15m → 15m评论者编辑/删除自己评论的时间窗,同时是评论者 cookie 的寿命(实测新建评论响应 Set-Cookie 的 Max-Age=900 与其一致)。实测:窗口内携 cookie PUT 自己评论返回 200 且 modified 字段刷新;不携 cookie 编辑返回 403(回显:You don't have the permission to access the requested resource.)
notifystdout → stdout, smtp新评论通知渠道,逗号多值。stdout 打到日志;smtp 走 [smtp] 节发邮件(含激活/删除链接)
reply-notificationsfalse → true允许评论者订阅回复通知。实测:父评论作者勾选通知后,子回复触发一封 Subject: Re: New comment posted on Isso ... 的邮件,收件人为父评论作者邮箱(存根日志 rcpt TO:<sunqi@example.com> 实录),邮件带 List-Unsubscribe 退订链接头。官方注释警告:开启它应同时开审核,防止被滥发
gravatarfalse → true响应增加 gravatar_image 字段,实测值形如 https://www.gravatar.com/avatar/<md5>?d=identicon&s=55,公开列表与回复列表均携带
gravatar-url模板 → 默认头像地址模板,占位符替换为邮箱哈希;s=55 即 55px
latest-enabledfalse → true控制 /latest 跨线程最新评论端点。实测关闭时 404 并回显 Unavailable because &#39;latest-enabled&#39; not set by site admin;开启后返回跨线程的已审核评论列表(含 uri 字段)
log-file空 → 未设置日志落盘路径;留空输出到标准输出

5.2 [server] 服务参数

参数默认 → 本文说明与实测
listenhttp://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 / profilefalse → 未设置开发参数:热重载与慢请求剖析,仅对内置 Web 服务生效,官方明确「Do not use in production」。未实测

5.3 [admin] 管理后台参数

参数默认 → 本文说明与实测
enabledfalse → true开启后 /admin 提供管理后台
passwordplease_choose_a_strong_password → q1w2e3r4后台口令(无用户名)。实测登录:错误口令返回 200 登录页;正确口令返回 302 FOUND → Location: http://127.0.0.1:8141/admin/,并下发 admin-session cookie(有效期 24 小时)

5.4 [moderation] 审核策略参数

参数默认 → 本文说明与实测
enabledfalse → true开启后新评论一律待审:POST /new 返回 202 + mode=2,公开列表与 /count 计数均不含待审评论;关闭时 201 + mode=1 发布即上线(两者均有实测)。待审评论须放行后才可见
approve-if-email-previously-approvedfalse → true半年(6 个月)内有「通过记录」的邮箱自动放行:实测李四(此前已审核通过)第二次评论直接返回 201 / mode=1 入库可见。安全注意(源码注释原意):邮箱不经验证,可被猜测冒用,官方建议开启本项时同时开启 SMTP 通知以便知晓自动放行
purge-after30d → 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 实测逐条命中过全部四类):

参数默认 → 本文说明与实测
enabledtrue → true官方推荐生产开启
ratelimit2 → 4同一来源 60 秒滑动窗口内的全部新增评论上限(含待审)。超限回显:10.89.71.0: ratelimit exceeded (5, 6)——括号内是撞限的既有评论 id
direct-reply3 → 3同一来源对同一线程的直评(非回复)上限。重要实测发现:该计数没有时间窗——按「来源 × 线程」终身累计,超限回显 3 direct responses to /index.html。对长期站点意味着同一访客(同网段)在一个帖子下最多直评 3 条,其余只能以回复形式发出
reply-to-selffalse → true是否允许在编辑窗口内回复自己刚发的评论。false 时拦截并回显 edit time frame is still open;true 时实测「自问自答」两条评论成功入库
require-authorfalse → falsetrue 时缺昵称即 403:author address required but not provided(实测)
require-emailfalse → falsetrue 时缺邮箱即 403:email address required but not provided(实测)

来源聚合规则:来源 IP 先经 /24(IPv4)或 /48(IPv6)匿名化再计数——同网段用户共享全部配额。实测:以 X-Forwarded-For 伪造同网段两个地址(.24 与 .30)发评,第二个地址被第一个的计数撞限。经反向代理接入时务必配 [server] trusted-proxies,否则全站共享代理出口的一个桶。

5.6 [smtp] 邮件通知参数

参数默认 → 本文说明
host / portlocalhost / 587 → 10.89.71.1 / 2525SMTP 服务器与端口
securitystarttls → nonenone / starttls / ssl 三选一。本文对本地明文存根用 none;接真实邮箱务必用加密档(未实测真实投递,协议交互以存根逐行验证)
username / password空 → 空认证凭据,可选
to / from空 → admin@example.com / isso@example.com通知收件人与发件人
timeout10 → 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] 渲染参数

参数默认 → 本文说明与实测
renderermistune → mistune0.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']

渲染行为实测三种情形:

  1. 默认(escape 开启):评论中的原始 HTML 整体转义为纯文本——<img ...>、<script>alert(1)</script> 均以转义文本呈现,XSS 注入无效;
  2. 放行图片(本文 allowed-elements=img + allowed-attributes=src, alt):Markdown 图片语法渲染为真元素——实测输出 <p>Markdown 图片:<img src="https://www.gravatar.com/avatar/97a979289edfdf0031359cff31583ef3?d=identicon&amp;s=55" alt="头像"></p>;
  3. 默认白名单内:链接渲染为 <a href="https://isso-comments.de" rel="nofollow noopener">Isso 官网</a>(自动追加 nofollow/noopener),删除线渲染为 <del>不要了</del>。

5.8 [hash] 匿名化指纹参数

参数默认 → 本文说明与实测
saltEech7co8Ohloopo9Ol6baimi → isso-test-salt-2026防彩虹表加盐。默认值全互联网通用(同邮箱跨站同头像);换 salt 会让全站评论者指纹重算——实测同一邮箱(李四)指纹从默认 salt 的 b9ba06cd97d2 变为自定 salt 的 112c6bb9fe79,头像随之全部改变
algorithmpbkdf2 → 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 内容
limit100 → 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 用随机长串且一经上线不再更换;其余与本文实测配置同构。

七、常见问题

  1. 改了配置不生效:必须重启 Isso 服务;重启后先看启动日志(数据库路径、Mistune 引擎行),再用 /config 核对公开开关子集。
  2. 启动 WARNING unable to connect to your website:[general] host 白名单逐项 HEAD 探测全部失败。检查首项是否服务侧可达——实测踩坑:页面服务与 Isso 不同网段时,白名单要写「从服务侧看得到的地址」(如网关地址),写宿主局域网 IP 会一直告警且建线程报 400 Cannot create new thread: URI ... is not accessible and no title was provided。
  3. 提交返回 403 ratelimit exceeded (N, M):60 秒窗口内同来源评论超限。来源按 /24 网段聚合,同网段共享额度;调大 ratelimit 或配好 trusted-proxies 让来源解析落到真实访客。
  4. 提交返回 403 N direct responses to <uri>:同来源对该线程的直评达上限(默认 3,且无时间窗、终身累计)。引导用户以「回复」形式参与,或适度调大。
  5. 待审评论不见了:purge-after 到期自动清理,不可恢复;审核要形成定期处理习惯(管理后台或邮件链接)。
  6. 邮件收不到:确认 notify 含 smtp;用本地明文存根(security=none)验证协议交互后再切真实服务器;security 档位与服务器要求一致;to/from 已填。
  7. 升级/迁移后所有头像变了:[hash] salt 与历史不一致。salt 变更会重算全部指纹,属预期行为;跨迁移应保持 salt 不变。
  8. /feed 返回 404:[rss] base 为空即禁用 Feed,填写页面基地址即恢复。

参考链接

  1. 官方配置参考:https://isso-comments.de/docs/reference/configuration/
  2. 源码内置默认配置(0.14.0):https://github.com/posativ/isso/blob/0.14.0/isso/isso.cfg
  3. 0.14.0 Release 说明(Mistune 引擎、环境变量替换等变更):https://github.com/posativ/isso/releases/tag/0.14.0
  4. GitHub 仓库:https://github.com/posativ/isso