博客评论系统
选型
- Disqus,需要翻墙,不过我不觉得是什么问题。
- 来必力,韩国的评论系统,自带中文,无需翻墙。感觉比Disqus要友好。
- Valine,开源的前端评论框架,数据保存在leancloud里。leancloud貌似是国内服务,注册需要手机,告辞。
- utterances、gitalk、gitment、vssue等issue系,利用github的issue实现的评论系统。数据难以备份和迁移,对于每一页的博文都要手动去初始化,略有麻烦。然后看到手记4:谈谈Gitment中泄露secret的前因后果与解决方法一文,说了一句卧槽,告辞。
- commento,开源的评论系统,服务端可以自己部署,不过依赖于PostgreSQL数据库,太小题大做了,管理麻烦,下一个。
- Statiman,开源的评论系统,服务端可以自己部署,将评论保存在yaml或者json文件,然后保存到github库上。很方便对数据进行备份迁移,看来一下部署教程有点复杂,自己部署服务数据还不在自己手上,作罢。
- Isso,也是个开源的评论系统,服务端好像是用php写的,占几十m内存,数据库用sqlite,docker部署,备份管理简单。
最后我还是选择了Isso。由于Disqus被墙,也不是很好看,所以本来我是想用来必力的了。但是基于能不注册就不注册,数据能在自己手里就在自己手里的原则,最后还是选择了自己搭建,也就几十M内存,还过得去。
Isso的配置文件
Isso的配置文件默认叫isso.conf
,这是我的配置
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53[general]
# SQLite3数据库位置
dbpath = /db/comments.db
name = isso
# 您的网站。如果Isso无法连接到至少一个站点,则您将启动过程中收到警告,注释很可能无法正常运行。
# 我建议第一个值是用作回退的非SSL网站
host =
http://localhost/
https://domain.com/
# 时间范围,允许用户编辑/删除自己的评论。
max-age = 15m
[admin]
enabled = true
# 管理员访问密码
password = password
[server]
# 监听的地址
listen = http://0.0.0.0:8080/
# 管理页面的url前缀
public-endpoint=//domain.com/isso
[moderation]
# 开启评论审核
enabled = true
# 30日未审核的评论字段删除
purge-after = 30d
[guard]
# 启用基本的垃圾邮件防护功能,例如每个IP地址的速率限制
# 启用防护,在生产中建议使用。对于调试目的没有用。
enabled = true
# 每分钟最多只能有N条新评论。
ratelimit = 10
# 直接对线程进行多少注释 ,防止简单而 while true; do curl ...; done.
direct-reply = 1
# 允许评论者在仍然可以编辑评论时回复自己的评论。 编辑时间段结束后,评论者仍然可以回复自己的评论。 不要忘记配置客户端。
reply-to-self = false
# 强制评论者在“作者”字段中输入值。 不对提供的值执行验证。 不要忘记相应地配置客户端。
require-author = true
# 要求评论者输入电子邮件地址(注意:未对提供的地址进行验证)。 不要忘记配置客户端。
require-email = false
安装Isso
Isso可以使用docker安装,就很方便了,我是用的是wonderfall/isso。不过我试过在windows安装,windows下会报错,貌似不支持。/db
目录下保存着sqlite文件,配置文件在/config
下。
1
2docker volume create isso_data
docker run -d --name isso --restart=always -p 8080:8080 -v isso_data:/db -v /config:/config wonderfall/isso
caddy反代
其中transparent会传递请求来源的ip等头信息,会影响评论频率的限制。然后就可以进https://domain.com/isso/admin管理后台里。
1
2
3
4
5
6
7
8domain.com {
gzip
proxy / http://127.0.0.1/
proxy /isso http://127.0.0.1:8080 {
without /isso
transparent
}
}
坑
如果你在本地用http://localhost/测试,或者直接进http://domain.com:8080/admin,应该会一切正常,但是进https://domain.com/isso/admin,或者在博文页面检查评论组件是否加载成功,就会发现失败。isso默认http协议,js和css会加载不出来,和导致405 Method Not Allowed。
解决方案有两个,第一个是在caddy里加一个响应头Content-Security-Policy: upgrade-insecure-requests
。浏览器收到这个响应头后会把页面中所有的http请求自动升级为https请求,如果https资源不存在也不会fallback直接报错。方案二是在isso的配置文件里指定public-endpoint,这样子isso就会在url前以public-endpoint的值为开头,推荐这种方法。
客户端代码
在需要放置评论组件的地方插入这个html,id="isso-thread"是必须的,貌似被写死了。
1
<section id="isso-thread"></section>
然后加载一个js。其中js的url一开始我以为是从cdn里加载的,搞了好久之后我查发现可以直接从isso服务端里加载!!!而data-isso
是isso的api的地址。所以在caddy的isso路径下进行反代的话,其实就是下面这样。
1
<script data-isso="/isso/" src="/isso/js/embed.min.js"></script>
其余的详看官网https://posativ.org/isso/
参考文章:
手记4:谈谈Gitment中泄露secret的前因后果与解决方法