采用了基于 isso 的评论系统

• 本文约 1073 字,阅读大致需要 3 分钟 | Cheatsheets | #isso | #Hugo | #作弊条 | #Comments | #Python | #nginx | #Self-hosting | #评论系统

上回书 说到从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创建单独的角色账户,然后以该用户身份安装。

主要的配置如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[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中对应的转发:

1
2
3
4
5
6
7
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)