最近收到了 Disqus 要在评论区投放广告的邮件 , 刚开始觉得没啥,毕竟免费用了这么久,放点广告而已。然而当我看到 Disqus 这猎奇的广告内容巨长的篇幅后,我还是决定给它换了! 对比了多个评论系统,最终选择了 Waline。

对比

看了几个开源的评论系统,稍微总结下。

Waline

image-20241219214946155

  • 项目地址: https://github.com/walinejs/waline
  • 特点: 轻量;免费;易于部署;强大Markdown支持;安全;流量统计;支持三方登陆;迁移方便;…
  • Github Start: 2.4k
  • 更新频率:写这篇博客的时候是3天前更新的,main分支累计2916个Commit,更新很频繁👍

Valine

image-20241219220349138

  • 项目地址:https://github.com/xCss/Valine
  • 特点: 快速;免费;易用;Markdown全语法支持;安全;流量统计; …
  • Github Start: 2.2k
  • 更新频率:写这篇博客的时候是4天前更新的,master 分支累计536个Commit。

Artalk

image-20241219222852711

  • 项目地址:https://github.com/ArtalkJS/Artalk
  • 特点: 轻量;快捷;免费;安全;多语言;插件扩展;第三方登陆;后台管理;OpenAPI; …
  • Github Start: 1.7k
  • 更新频率:写这篇博客的时候是一周前更新的,master 分支累计1591个Commit。

Cudis

image-20241219223616768

  • 项目地址:https://github.com/djyde/cusdis

  • 特点: 开源;清亮;disqus平替;安全;易用;自建;支持购买托管服务;

  • Github Start: 2.6k

  • 更新频率:写这篇博客的时候是8个月前更新的,master 分支累计507个Commit。

Twikoo

image-20241219224155765

  • 项目地址:https://github.com/twikoojs/twikoo

  • 特点: 简洁;安全;免费;简单;易用;安全;即使;个性;便捷管理;…

  • Github Start: 2.6k

  • 更新频率:写这篇博客的时候是8个月前更新的,master 分支累计507个Commit。

Gitalk

image-20241219224614583

  • 项目地址:https://github.com/gitalk/gitalk
  • 特点: 开源;无服务(使用Github issues存评论);多语言;…
  • Github Start: 7k
  • 更新频率:写这篇博客的时候是5个月前更新的,master 分支累计181个Commit。

其实几个看下来评论系统大家的核心功能基本都差不多,而且都主打轻量,安全,易部署。不过其中个人觉得 Waline 是最好看,功能最全的,而且文档做也比较全面,最后我也是用了这个。但不得不提其中 Gitalk 是最有特色的,无需任何数据库配置,直接使用Github issues 存评论,作者想法很赞。

搭建 Waline

官方使用 LeanCloud + Vercel 的流程还是比较完备的,但我使用准备使用 docker + sqlite 来搭建,并迁移原来的 disqus 数据,官方的流程还是缺了点意思,这里记录分享一下。

1. sqlite 数据库

官方准备了一个数据库模版 waline.sqlite , 可以直接点击去下载。里面已经帮你建好了三张表,直接用这个库就好了。

image-20241220231825992

2. 迁移 disqus 数据

  • 先登陆 disqus 后台,点击右上角头像,选择Admin 。选择评论栏目的Export,导出。

image-20241220233925315

导出的文件会发到邮箱,是一个压缩的 xml,解压后就可以得到一个xml。

image-20241220234228656

  • 使用数据库工具,将CSV数据导入到准备好的 waline.sqlite中。

数据库工具有很多,如 DataGrip, Navicat 等等。在工具中打开下载的 waline.sqlite, 使用工具的导入功能导入数据,如我用DataGrip导入,需要注意选中第一行为头,然后他会自动给你匹配好字段,对应导入。

image-20241220235905659

这样,sqlite 数据库就准备好了。

3. 搭建后端

直接使用 docker-compsoe.yml 启动服务 和 Nginx , 并在Nginx中配置好转发和证书。

  • docker-compose.yml
version: '3.5'
services:
  nginx:
    image: nginx
    container_name: nginx
    restart: always
    ports:
    	- 443:443
    volumes:
      -  ${PWD}/certs:/etc/nginx/ssl
      -  ${PWD}/waline.conf:/etc/nginx/conf.d/waline.conf
    depends_on:
    	- waline
  waline:
    container_name: waline
    image: lizheming/waline:latest
    restart: always
    volumes:
      - ${PWD}:/app/data
    environment:
      TZ: 'Asia/Shanghai'                          # 时区
      SQLITE_PATH: '/app/data'                     # sqlite数据控路径
      JWT_TOKEN: 'xxxxx'  
      SITE_NAME: 'Razeen`s Blog'                   # 站点名称
      SITE_URL: 'https://razeen.me'                # 站点URL
      SECURE_DOMAINS: 'razeen.me,waline.razeen.me' # 安全域名(博客和评论的域名)
      AUTHOR_EMAIL: 'xxxx@xxx.com'                 # 作者的邮箱    
      SMTP_SERVICE: 'QQ'                           # 邮件通知,我用的QQ
      SMTP_USER: 'xxx@qq.com'
      SMTP_PASS: 'xxxxxx'
      SMTP_SECURE: true
      IPQPS: 20                                    # 评论限速 一个IP 20s一次
      DISABLE_REGION: true                         # 隐藏评论归宿地

这里主要注意一下这些环境变量,更多的环境变量可看官方文档。我这里主要放开了一点限速IPQPS,和配置了邮件作为我评论的通知渠道。

  • 配置好Nginx转发的配置 waline.conf

    下面是我的配置供参考,其中需要申请证书,可以去FreeSSL申请。

server {
    listen                       443 ssl;
    server_name                  waline.razeen.me;
    server_tokens                off;
		http2 on;

    ssl_certificate              /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key          /etc/nginx/ssl/key.pem;

    ssl_prefer_server_ciphers    on;
    ssl_ciphers                  EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    ssl_protocols                TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_session_cache            shared:SSL:50m;
    ssl_session_timeout          1d;
    ssl_session_tickets          on;

  #  ssl_trusted_certificate      /etc/nginx/ssl/ca.pem;
  #  ssl_stapling                 on;
  #  ssl_stapling_verify          on;

    access_log  /var/log/nginx/access_waline.log  main;
    error_log   /var/log/nginx/error_waline.log;

    location / {
        proxy_pass http://waline:8360;

        proxy_set_header Host $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;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        # cache
        add_header Cache-Control no-cache;
        expires 12h;
    }
}

然后把数据库放在配置目录下,就可以启动了。做好域名解析后,访问评论站点就可以看到评论框了。

4. 注册后台管理

进入 url + ‘/ui’, 如我的 https://waline.razeen.me/ui 会自动跳转后台,注册账户即可,第一个账户就是管理员了。后台可以用来管理评论和用户。

image-20241221002110441

5. 修改博客评论

像 hugo 找到主题的评论模版(如comments.html),加入如下代码, 更新即可(我把图片和梗图表情的关了)。

<!-- 样式文件 -->
<link
  rel="stylesheet"
  href="https://unpkg.com/@waline/client@v3/dist/waline.css"
/>

<div id="tcomment"></div>

<!-- 脚本文件 -->
<script type="module">
  import { init } from 'https://unpkg.com/@waline/client@v3/dist/waline.js';

  init({
    el: '#tcomment',
    serverURL: 'https://waline.razeen.me/',
    search: false,  // 关闭梗图搜索
    reaction: true,  
    // emoji: false,
    imageUploader: false  // 关闭图片上传
  });
</script>

这样自建的 waline 就准备就绪啦,又愉快的折腾了一下~