更换博客的评论系统为 Remark42

对于这个静态博客的评论系统,最开始用的是多说,后来用的是disqus

其实我对于 disqus 没什么不满意,看到有人反映 disqus 会给评论区加广告,反正在我这里我是没有看到的(特意关闭了去广告插件也没有发现),也没发现过别人的 disqus 评论区会有广告。至于 disqus 的功能也符合我对于一个古早经典的评论系统的要求,不强制验证身份的发言,留下邮箱以及网址即可,并不验证其真实性1,既支持匿名也支持其他社交媒体账号登录,功能成熟,UI配色还能和博客匹配。对于一个小站,甚至都没有什么留言,disqus 完全够用好用,那为什么想换掉呢?

有一天我发现 disqus 并不能在大陆正常使用,以前我可能就知道了当时我并不在意,看我 blog 的谁不科学上网呢。以前 blog 还能吸引一点点留言,最近几年真的是一条留言都没有,你说完全不在意吧,也不是,该不会真的是 disqus 评论系统并没有在访问者的页面中工作才一条留言都没有吧,虽然我知道现如今独立博客的流量是越来越少,看的人就少了留评论的机会则更加少。根据网站统计工具发现,访问博客的最大一部分是来自 yandex - 一款来自俄罗斯的搜索引擎(不用科学上网在大陆就可以访问的非国产搜索网站),而且对于一个中文网站,访问者还是主要来自大陆。

所以我决定更换一个评论系统试试看。首选要求能够自部署的工具,那么 go 语言、单个可执行文件、下载下来就可以直接运行的那种软件自然就是我的首选,最终选择了 remark42

安装教程

remark42 采用了单文件的数据库 boltdb,也不用额外去安装外部的数据库,和其他 go 语言写的程序一样,只要将编译好的程序下载下来就可以直接执行运行即可。你只需要在 systemd 中添加相应的服务保证程序能够持续自动运行,再调整你的 web 服务器配置使得你的评论系统对外提供 https 访问,最后在你的网页前端调用即可,你可以参考官方的安装教程或者此安装配置教程。(下面的内容中不包含从其他评论系统导入数据的部分)

systemd 服务

$ cat /etc/systemd/system/remark42.service
[Unit]
Description=remark42
After=syslog.target
After=network.target

[Service]
Type=simple
User=<your username>
WorkingDirectory=<path to>
EnvironmentFile=<path to>/remark42.conf
ExecStart=<path to>/remark42 server
Restart=on-failure

[Install]
WantedBy=multi-user.target

systemd 服务文件如上所示,./remark42 server 是执行的命令,各种参数通过 EnvironmentFile 设定的环境变量来配置。

nginx 配置

我没有将 remark42 运行在一个独立的域名下,而是在某个域名的路径下。参考官方的文档的配置部分如下:

$ cat nginx_site/example.site.conf
server {
    server_name example.site;
    listen 443 ssl http2;
    ...
    # remark42
    location /remark42/ {
        rewrite /remark42/(.*) /$1 break;
        proxy_pass http://127.0.0.1:1042/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    ...

前端设置

最后就可以配置你的前端页面了。参考官方的文档

<div id="remark42"></div>
<script>
var remark_config = {
        host: 'https://example.site/remark42',
        site_id: 'site_id',
        locale: 'zh',
        no_footer: 'true'
};
!function(e,n){for(var o=0;o<e.length;o++){var r=n.createElement("script"),c=".js",d=n.head||n.body;"noModule"in r?(r.type="module",c=".mjs"):r.async=!0,r.defer=!0,r.src=remark_config.host+"/web/"+e[o]+c,d.appendChild(r)}}(remark_config.components||["embed"],document);
</script>

按照官方教程还是能很顺利的安装下来的,但是达到相应的功能还需要一系列的配置,这么多的配置选项看起来无从下手。

功能配置

让我们看一下EnvironmentFile该如何配置,先从几个基础且必须的参数开始。

REMARK_URL=https://example.site/remark42
SECRET=e83bdab1b341bd8c6df08181d34d9ae5
SITE=blog,project

REMARK_URL 就是访问 remark42 的url,取决于前面 nginx 反向代理的配置,与前端配置host选项一致。

SECRET 用于加密、验证用途的一段随机字符串,需要自行生成。可以通过python -c 'import os; print(os.urandom(16).hex())'来生成。

SITE 站点的名称,默认为 remark,你可以给不同的站点使用一套 remark42 评论系统,同时通过不同的 id 来区分,这个 id 就是前端设置中的site_id,当使用多个 id 时在环境变量中使用英文逗号,分隔。remark42 采用单文件作为后端数据库,根据文档里提到的内容,不同 site 的数据保存在不同的数据文件中,这些数据文件的名称就是site_id,默认的数据保存位置在WorkingDirectory./var目录下。

还有一些默认的参数需要修改。

REMARK_ADDRESS=127.0.0.1
REMARK_PORT=1042

上面我们使用 nginx 来反向代理 remark42 评论服务的地址是http://127.0.0.1:1042/,所以我们需要修改REMARK_ADDRESSREMARK_PORT两个参数,默认是监听 http://0.0.0.0:8080 。

如果你看见了EMOJI这个参数默认是false,你可能想不支持 emoji 还行!?得打开这个选项,NO,你理解错了,默认就是支持显示 emoji 的,这个选项只是支持那种 文字emoji语法 比如::smile::beer:,源自这个 issue

上面基础的设置只能让 remark42 跑起来,但是目前的配置并不能让访客进行留言及其他功能。

匿名评论

AUTH_ANON=true

即可开启匿名评论,与传统的提供一个邮箱(并不验证)的匿名不同,这里的匿名只需要一个用户名即可。

文档里提到对于匿名用户名的限制。

  • 仅通过填写一个用户名,即可登录评论。用户名至少有三个字符,
  • 必须以字母开头,并且只能包含字母、数字、下划线和空格

但是我发现“456”也可以作为匿名用户名,顺便提交了相应的issue

第三方账号登录

支持很多第三账号登录,但是我只使用了 githubtelegram,根据文档也很顺利的完成了,具体过程我就不赘述了,只展示需要设置的相关参数,以免遗漏。

github
AUTH_GITHUB_CID=[your github cid]
AUTH_GITHUB_CSEC=[your github csec]
telegram
AUTH_TELEGRAM=true
TELEGRAM_TOKEN=[your telegram token]

如果已经创建过 telegram bot ,用现有的 token 也可以。这里的配置只是作为用户登录的验证作用,如果想用 telegram 作为消息提醒功能,将在下面的内容中介绍。

邮箱登录

在设定任何关于邮箱的功能之前,都必须要先设定好 SMTP 服务器的相关设定

SMTP

下面我以 resend的邮件服务为例2。(不推荐使用gmail代发

SMTP_HOST=smtp.resend.com
SMTP_PORT=465
SMTP_TLS=true
SMTP_USERNAME=resend
SMTP_PASSWORD=[your resend api]
邮箱验证
AUTH_EMAIL_ENABLE=true
AUTH_EMAIL_FROM=[your email from]

如果你只是将邮箱作为登录验证手段,那么上面的设定就可以了。如果你想将邮件作为回复提醒的手段,其设定将在下面的内容中介绍。

上面是用户留言的功能,既可以匿名,也可以第三方登录,也可以通过邮件登录。

留言通知

通知分为两类,一种是给管理员的通知,另外一种是给用户的通知,比如你的评论得到了回复,那么你可能需要得到通知。

给管理员的通知就是,每受到一条新回复即发送一条通知,我选择用 telegram 的方式。

管理员通知
NOTIFY_ADMINS=telegram
NOTIFY_TELEGRAM_CHAN=[your telegram channel ID]

按照官方文档的方式,除了在上面我们已经创建好的 bot 和 得到的 token,你还需要创建一个 channel,你的 bot 将在此频道中发送通知,你还需得到此 channel 的 ID

用户通知
NOTIFY_USERS=email,telegram
NOTIFY_EMAIL_FROM=[your email from]

用户通知有两个渠道,一个是 telegram 另一个是邮件,在上面的内容在我们已将 email 和 telegram 功能设定成功。

这个通知功能可能和你想的有所不同,你的想法可能是我通过 email 登录的账号,那么就可以通过某个选项订阅回复,且通知发给你的邮箱,telegram 同理。但这个通知功能是独立的,也就是说你通过验证登录回复后,如果想订阅回复,你需要再验证一遍你的 email 或者 telegram 账号,也就是说你通过 A 邮箱登录留言,同时你可以通过 telegram 的账号来订阅回复,也可以通过 B 邮箱来订阅回复,这一切和你登录的账号毫无关系,就算你想通过 A 邮箱接收回复通知,那也要再验证一遍 A 邮箱。

总之,登录账号和回复通知是两个独立的功能,与使用什么样的账户登录无关。如果一个人期望收到对自己帖子的回复的通知,则必须手动订阅3

设定管理员

ADMIN_SHARED_ID=[id1],[id2]

需要已经登录的用户,点击用户的用户名,在网页右侧弹出的内容中可以找到用户的ID。

email_7cd4c7380abac012f16584e9ff47e58926ce8012

类似上面的内容就是ID,可以设定多个ID为管理员。

限制 hosts/sources

ALLOWED_HOSTS=example.site

默认是无限制。以及如何在不同站点使用一套评论系统

不足之处

虽然 remark42 提供了明暗两套主题,但是都感觉和我blog主题不搭配,但是又不知道如何修改配色,这是个问题!默认的深绿色和我 blog 的亮橙色感觉有点分割。

参考:

  1. jandan.net 煎蛋网的评论就是随便填而已,一个称呼一个邮箱,也不验证是否是你的邮箱。 

  2. 我从这个项目知道的这个邮件服务,支持域名邮箱,免费配额每天一百封邮件。 

  3. 相关 issue及讨论 

Tag:blog Published under (CC) BY-NC-SA