delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

13 Feb 2021

采用了基于 isso 的评论系统

上回书 说到从 Movable Type 搬到 Hugo 上之后, 就彻底失去了评论和 pingback 的功能。 因为现时正经写 blog 的人已经越来越少, 因此 pingback 似乎意义不太大了,但是能够收集评论反馈还是有一些意义的。

早前,Movable Type 实现的评论系统与其自身的账户系统有集成,并且还支持包括 Facebook、 Google 在内的一系列其他 OpenID 的系统。这个功能的一个好处是对于经常访问的人来说比较友好, 例如站主可以将某个 ID 设置为受信任的 ID,从而避免先审后发。

与此类似, Disqus 也有同样的功能。不过,对于一个评论人数不多的 blog 来说, 我认为这个功能并不是绝对必须的。特别是考虑到为了实现与这些系统的对接,往往需要接受来自对方的 cookies 或其他追踪(技术上这并不完全正确。 例如, Bruce Schneier 的网站上就采用了一个比较折衷的做法,即用户必须点两下才可以使用 Twitter / Facebook 分享功能),因此既然是整个砍掉重练,那么最开始的时候越干净越好。所以这件事暂时先搁置一下。

isso 是一个相当轻便的,使用 Python 实现的评论系统。 它可以为单一网站提供类似于 Disqus 的评论系统,并在收到评论时发送邮件给管理员供其处理。 除此之外,它还提供了简单的评分系统,甚至可以提供评论的 RSS feed。

安装 isso 可以使用 pip(暂时没做 port)。为了做风险隔离,应为 isso 创建单独的角色账户, 然后以该用户身份安装。

主要的配置如下:

[general]
dbpath = /path/to/isso/sitename.domain.tld.db
host = https://sitename.domain.tld/
notify = smtp    # 以 SMTP 发一封邮件

[moderation]
enabled = true
purge-after = 14d

[server]
listen = unix:///path/to/isso/sitename.domain.tld.sock

[smtp]
host = localhost
port = 25
from = "Comment system" <www@example.com>
to = "Blog author" <me@example.com>
security = none    # 本地的SMTP通讯

[guard]
enabled = true
ratelimit = 2
direct-reply = 5
reply-to-self = false
require-author = false
require-email = false

# 可以不启用,使用邮件来管理
[admin]
enabled = true
password = # 管理用的密码

[hash]
salt = # 一个随机串
algorithm = pbkdf2

注意启动时需要使用正确的 umask,以保证 nginx 能够正常访问该 sock 文件。

nginx 中对应的转发:

location /.comments {
    proxy_pass http://unix:path/to/isso/sitename.domain.tld.sock;
    proxy_set_header X-Script-Name /.comments;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}

然后在 Hugo 模板中加入引入 js/embed.min.js 和对应的 section 代码即可。

目前发现的一些坑:

  1. 如果评论者在 Website 中填写一些非网址内容,评论服务会返回 400 而不是更有信息量的错误信息。
  2. 评论系统采用了一些 Node.js 的模块,这些模块在生产环境并不需要,但由于其版本比较旧,因此可能需要花些时间来审计一下。
  3. 评论系统并不把静态内容做成静态页面直接serve,如果我来做的话大概会直接把某个名字空间的东西用静态文件的方式serve出来,毕竟除了收一下评论之外其他时候并不需要服务器去算一下。
  4. 系统只支持用 SMTP 发信(而不支持直接用 sendmail),而且其 TLS 支持有问题。我认为用 sendmail 至少可以正确生成 Message-Id 以及其他信头。

如果有时间的话我会改改,不过现在暂时先放在一边好了。

(2022年12月更新:目前已经不再使用 isso,换成了 remark42)