背景
咱最近重整了咱的网站们,而新的网站呢,需要选择一个评论系统,因此有了这篇文章。
静态网站虽然容易部署、几乎不消耗服务器性能,但却无法实现许多对动态网站来说轻而易举的功能,比如评论、反馈、点赞。因此需要一个评论系统作为补充。
目前业内为静态网站添加评论系统的常见方案是使用云开发、Vercel、云数据库等 serverless 平台的免费服务,或者借助 GitHub 等平台托管评论。这些方案门槛低,免费,适合轻度使用。咱也对这些评论系统的名称有所了解,包括 Disqus、Gitalk、Valine、Waline、畅言、LiveRe、utterances、Giscus、Twikoo、Artalk 等等,不过并未使用过其中任何一款。
然而,这些方案也有一些不足之处,比如需要注册各种账号、速度慢、无法完全掌控数据、受到免费额度限制(应该不会用尽)和其他的服务商的限制。
咱也找到了几篇文章对比这些
经过简单分析,综合咱的阅历,咱意识到,评论功能作为交互式的功能,必然需要服务器,无服务器(自己的或者 Vercel 等平台的)的方案要么不安全,要么限制多。所以
- 不使用 Valine 这类不安全的
- 不使用 Gitalk 这类寄生于其他平台的
- 既然已经有了服务器,就使用可独立部署的方案,更简单、可靠,而非托管于 Vercel 等平台
经过筛选,目前剩下三个可供选择:Waline、Twikoo、Artalk,我将进行进一步的调研。
深入
对比表格(简版)
评论系统 | 部署 | 文章表态 | 审核 | 社交登录 | 统计、图片、表情、防刷、通知 | 头像 | 外观 | 文档 |
---|---|---|---|---|---|---|---|---|
Waline | 独立、serverless | 支持多种 | 接口、自定义?、先审后发 | 支持 | 支持 | avatar CDN、QQ | 好 | 乱 |
Twikoo | 独立、serverless | 不支持 | 接口、先审后发 | 不支持 | 支持 | avatar CDN、QQ | 中 | 少 |
Artalk | 独立 | 仅赞同反对 | 接口、关键词、先审后发 | 支持 | 支持 | avatar CDN、自定义 | 中 | 好 |
综合来看 Waline 比较成熟,比较美观,而且有一个功能咱有个网站想用:文章表态。但是文档比较乱,要点分散,大篇幅是都在说那些第三方部署方式。Twikoo 比较简洁,功能少点。而 Artalk 仅支持独立部署,不用兼容五花八门的第三方平台,摆脱了巨大的包袱,功能和可配置项也更多,更加强大。
暂时先看 Artalk。
头像问题
这些评论系统一般都是通过邮箱来获取头像。你只需在一个公共头像服务网站,如 Gravatar,用邮箱注册,上传头像。在这之后,你在其他网站填写邮箱,其他网站就可以根据邮箱,通过这个头像服务网站,得到你的头像。一处上传,多处使用,免去了重复上传的麻烦。Gravatar 最初由 Wordpress 推出,是全世界应用最广泛的公共头像服务提供商。Wordpress 、npm 等平台都在使用它。
但是由于大局域网的缘故,Gravatar 在境内无法访问,此时我们可以使用 libravatar、weavatar 和 cravatar。它们也兼容 Gravatar ,如果那个邮箱没在它上面注册,会尝试返回其 Gravatar 头像和 QQ 头像(QQ数字邮箱)。尚不清楚 weavatar 从上游服务商刷新头像的时间间隔。
账号与安全问题
免登录发评论不可避免地会有被刷评论的风险,业内之前也有过这种事:关于被人恶意冒用身份发送垃圾评论的声明 | 怡红院落。目前上面几个评论系统都有防刷设计,防止频繁提交,还可以使用接口(如 Akismet)鉴定是否是垃圾评论。Artalk 支持手动配置关键词,将被命中的词汇替换或先审后发。
由于免登录发评论不会验证邮箱地址,所以不可避免地会有冒名顶替的风险,为此 Waline、Artalk 有社交登录功能,允许用邮箱或第三方平台登录后发评论。这里暂时不做这个限制。
发邮件
好像云服务商不支持自建邮箱,不开放25
端口,而且自建邮箱非常麻烦。咱也懒得搞其他邮箱服务,就不支持邮件功能好了~回复也不提醒了~
行动
咱的个人站最终选择 Artalk,至于缺少的文章表态功能等以后再说。
后端
咱服务器使用的 1Panel 面板,里面就有 Artalk 的 Docker 镜像,直接安装,

然后创建管理员账户:在【容器】页面找到 artalk
容器,点击右侧的【终端】按钮后,执行以下命令:
artalk admin
再给站点配置反向代理,这样直接请求域名/artalk/
就可以了
location /artalk/ {
proxy_pass http://127.0.0.1:23366/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

简单测试成功。
暂时不搞 Akismet 服务了,仅配置一份敏感词列表,命中就先审后发。
前端
咱的网站框架 Valaxy 已经有了一个 Artalk 插件valaxy-addon-artalk
,咱直接拿来用,简单配置即可启用。
其他
- 待办:配置社交登录
- 反向代理已经设置了 IP 但获取到的 IP 仍然是内网 IP?在 Artalk 设置里面:服务器、代理标头(http.proxy_header)填一下
X-Forwarded-For
- 部分配置修改后需手动重启服务才能生效
- 敏感词分隔符,疑似从面板配置会有 BUG
- 如何确定同一个用户是同一个用户呢?在不登录的情况下,用以实现防止重复点赞等功能。好像这些都是根据
IP
来判定的。可是同一个人同一个设备的 IP 有可能变动,要是让浏览器存储也参与判定就好了。 - 表情包
- 图片评论先审后发
- 多站点区分配置
- 私密评论,强制私密