对于这个静态博客的评论系统,最开始用的是多说,后来用的是disqus。
其实我对于 disqus 没什么不满意,看到有人反映 disqus 会给评论区加广告,反正在我这里我是没有看到的(特意关闭了去广告插件也没有发现),也没发现过别人的 disqus 评论区会有广告。至于 disqus 的功能也符合我对于一个古早经典的评论系统的要求,不强制验证身份的发言,留下邮箱以及网址即可,并不验证其真实性1,既支持匿名也支持其他社交媒体账号登录,功能成熟,UI配色还能和博客匹配。对于一个小站,甚至都没有什么留言,disqus 完全够用好用,那为什么想换掉呢?
有一天我发现 disqus 并不能在大陆正常使用,以前我可能就知道了当时我并不在意,看我 blog 的谁不科学上网呢。以前 blog 还能吸引一点点留言,最近几年真的是一条留言都没有,你说完全不在意吧,也不是,该不会真的是 disqus 评论系统并没有在访问者的页面中工作才一条留言都没有吧,虽然我知道现如今独立博客的流量是越来越少,看的人就少了留评论的机会则更加少。根据网站统计工具发现,访问博客的最大一部分是来自 yandex - 一款来自俄罗斯的搜索引擎(不用科学上网在大陆就可以访问的非国产搜索网站),而且对于一个中文网站,访问者还是主要来自大陆。
所以我决定更换一个评论系统试试看。首选要求能够自部署的工具,那么 go 语言、单个可执行文件、下载下来就可以直接运行的那种软件自然就是我的首选,最终选择了 remark42。
安装教程
remark42 采用了单文件的数据库 boltdb2,也不用额外去安装外部的数据库,和其他 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_ADDRESS
和REMARK_PORT
两个参数,默认是监听 http://0.0.0.0:8080 。
如果你看见了EMOJI
这个参数默认是false
,你可能想不支持 emoji 还行!?得打开这个选项,NO,你理解错了,默认就是支持显示 emoji 的,这个选项只是支持那种 文字emoji语法 比如::smile:
, :beer:
,源自这个 issue。
上面基础的设置只能让 remark42 跑起来,但是目前的配置并不能让访客进行留言及其他功能。
匿名评论
AUTH_ANON=true
即可开启匿名评论,与传统的提供一个邮箱(并不验证)的匿名不同,这里的匿名只需要一个用户名即可。
文档里提到对于匿名用户名的限制。
- 仅通过填写一个用户名,即可登录评论。用户名至少有三个字符,
- 必须以字母开头,并且只能包含字母、数字、下划线和空格
但是我发现“456”也可以作为匿名用户名,顺便提交了相应的issue
第三方账号登录
支持很多第三账号登录,但是我只使用了 github 和 telegram,根据文档也很顺利的完成了,具体过程我就不赘述了,只展示需要设置的相关参数,以免遗漏。
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的邮件服务为例3。(不推荐使用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 邮箱。
总之,登录账号和回复通知是两个独立的功能,与使用什么样的账户登录无关。如果一个人期望收到对自己帖子的回复的通知,则必须手动订阅4。
设定管理员
ADMIN_SHARED_ID=[id1],[id2]
需要已经登录的用户,点击用户的用户名,在网页右侧弹出的内容中可以找到用户的ID。
email_7cd4c7380abac012f16584e9ff47e58926ce8012
类似上面的内容就是ID,可以设定多个ID为管理员。
限制 hosts/sources
ALLOWED_HOSTS=example.site
默认是无限制。以及如何在不同站点使用一套评论系统
不足之处
虽然 remark42 提供了明暗两套主题,但是都感觉和我blog主题不搭配,但是又不知道如何修改配色,这是个问题!默认的深绿色和我 blog 的亮橙色感觉有点分割。
参考:
- 如何部署一个支持关键词过滤的评论服务
- 更换博客评论系统
- New server and Remark42 comments
- 家庭数据中心系列 使用cloudflare+resend+gmail打造免费的个人级企业邮箱
- 通过配置反向代理来自定义remark42
-
jandan.net 煎蛋网的评论就是随便填而已,一个称呼一个邮箱,也不验证是否是你的邮箱。 ↩