评论功能一直是 Hugo、Hexo 等静态博客的一个痛点,我观察到的不少站长都会选择 Disqus 引入评论功能,但由于这是个 404 网站,大陆用户的体验会很差,而且会收集各种隐私数据,自然不是一个很好的选择。

我另一个 Hugo 搭建的网站一直在纠结要不要添加一个评论功能,添加了貌似也没人评论,而且说不定会有很多 Spam 信息,但是不添加总觉得缺少点什么,没有互动性,最后还是准备加一个提升 5 点功能分。Hugo 官网推荐的几个评论程序我都看了一遍,发现其中的 Isso(可以点击去官网看看效果)非常符合我的需求,而且是自托管的,速度和连接性有保证,不需要注册就可以评论,同时界面十分简洁美观,自然得好好折腾一下。

isso-comment

Isso 是一个用 Python 语言编写的开源(基于 MIT 协议)评论系统,数据库使用的是轻量级的 SQLite,这点十分好评,部署起来也比较简单。虽然我最搭建的时候遇到了个小问题,用的是二级域名反代,可是一启动 Isso,二级域名就会自动跳转到根域名导致 js 文件 404,折腾一晚上也没有解决,最后不得不搭建在二级目录下。

环境准备

Isso 有多种搭建方式,从 Pypi 安装、构建 Docker 镜像安装或者从源文件安装等,具体信息你可以从官网文档了解,这里我选择了最简单的直接使用 Python 的 Pip 安装。

我的系统环境是 Debian 11,默认带有 Python 3.9 版本(如果你想升级到 Debian 11 的话,可以参考这篇文章),以下操作用 root 用户展示,请根据自己的情况修改命令。

建议用 useradd 为 Isso 创建一个用户并使用虚拟环境安装,方便管理,首先安装 pip3:

apt install python3-pip sqlite3 build-essential

安装 Virtualenv:

pip3 install virtualenv

在合适的位置创建工程目录:

cd /home/isso
virtualenv venv

激活 Virtualenv 环境:

source venv/bin/activate

接下来的依赖就会安装到虚拟环境中,要退出环境的话使用 deactivate 命令。

安装 Isso

在 venv 环境中运行:

pip3 install isso

会自动安装好 isso 所需的模块,接下来写一个配置文件:

vim /home/isso/isso.cfg

下面是一个示例:

[general]
# 数据库文件位置
dbpath = /home/isso/comments.db

# 你准备部署的主机域名,多个域名用换行隔开,例如
# host = 
#   http://example.com
#   https://example.com
#   https://example.org
host = https://example.com/

# 部署多个 isso 需要用到,不然可以删除
name = isso

# 允许用户修改/删除评论的最长时间
max-age = 5m

# 新评论提醒方式,默认为 stdout,我这里选择通过邮件提醒,后面需要设置 smtp 信息
notify = smtp

# 日志文件,可以不开启
log-file = 

# 使用 Gravatar 头像,如果评论者没有设置邮箱会随机生成
gravatar = true
gravatar-url = https://cn.gravatar.com/avatar/{}?d=identicon

[moderation]
# 是否开始评论审核,以及多少天未审核的评论自动删除
enabled = false
purge-after = 30d

[server]
# 需要监听的地址
listen = http://localhost:8080/

[smtp]
# smtp 设置,如果前面未选择可以删除
username = 
password = 
host = 
port = 
security = 
to = 
from = 
timeout = 

[guard]
# 开启 Spam 过滤
enabled = true

# 每分钟最多评论数
ratelimit = 2

# 评论最多回复次数
direct-reply = 3

# 能否回复自己的评论
reply-to-self = false

# 评论必须输入用户名
require-author = true

# 评论必须输入邮箱
require-email = true

[hash]
# 加密邮箱地址的方式
salt = Eech7co8Ohloopo9Ol6baimi
algorithm = pbkdf2

[admin]
# 是否开启后台管理,开启后通过 your-url/admin 访问
enabled = true
password = secret

另外还有 [markup][rss] 等选择我没有写上,完整的功能设置请参考官方文档

运行一次进行测试,检查有没有报错:

isso -c /home/isso/isso.cfg run

Nginx 反代

下面是一个使用 Nginx 反代部署到二级目录的示例:

server {
    listen 443 ssl http2 ; 
    listen [::]:443 ssl http2 ; 
    server_name example.com; 

    ...

    location /isso {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Script-Name /isso;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://localhost:8080;
    }
}

记得不要忘了 proxy_set_header X-Script-Name /isso; 这一行,接下来就可以访问 https://example/isso 管理后台,如果你看到 400 Bad Request,说明部署成功,如果是其它错误请自行检查配置和错误信息。

在网站上引入 Isso

引入很简单,只需要一段 script 代码和一段 html 代码即可。

首先是引入 script 代码,这里的部分参数需要和前面的配置文件一致,如果你直接用了我前面的配置,直接复制并修改网址即可即可,否则请根据自己的情况修改,具体的参数介绍请参考官方文档

<script data-isso="https://exapmle.com/isso/"
        data-isso-id="thread-id"
        data-isso-css="true"
        data-isso-lang="zh"
        data-isso-reply-to-self="false"
        data-isso-require-author="true"
        data-isso-require-email="true"
        data-isso-max-comments-top="10"
        data-isso-max-comments-nested="5"
        data-isso-reveal-on-click="5"
        data-isso-avatar="true"
        data-isso-avatar-bg="#f0f0f0"
        data-isso-avatar-fg="#9abf88 #5698c4 #e279a3 #9163b6 ..."
        data-isso-vote="true"
        data-isso-vote-levels=""
        src="https://exapmle.com/isso/js/embed.js"></script>

然后在你想要添加评论功能的地方加入下面的 html 代码:

<section id="isso-thread"></section>

接下来就可以去你的网站看到效果了。

守护进程

花了半天功夫搭建好,自然都投入生产使用了,这里就需要设置守护进程。

Python 守护进程工具不少,如 Supervisor、PM2 等,我个人一直习惯用 systemd 的方式,首先创建一个运行脚本:

vim /home/isso/run.sh

输入以下内容,请根据自己环境目录情况修改:

#!/bin/bash

set -e
source /home/isso/venv/bin/activate
ISSO_CFG=/home/isso/isso.cfg
isso -c $ISSO_CFG

授予脚本权限:

chmod u+x run.sh

添加一个 Isso 服务:

vim /etc/systemd/system/isso.service

输入以下内容,同样需要根据自己的情况修改:

[Unit]
Description=Isso Comment Server

[Service]
Type=simple
User=isso
workingDirectory=/home/isso
ExecStart=/home/isso/run.sh
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

接下来设置开机自启并运行就可以了:

chown -R isso /home/isso/
systemctl daemon-reload
systemctl enable isso
systemctl start isso

从这几天的体验来看(其实没人评论,都是我自己在测试 QWQ),Isso 在各个方面的表现都非常不错,特别喜欢它的简洁,当然你也可以在前面的引入脚本中设置 css 为 false,通过自定义的 css 样式进行美化。

<script src="..." data-isso-css="false"></script>

总的来说,对于静态网站有评论需求的朋友来说,Isso 是一款十分值得推荐使用的评论程序。

如果你认为这篇文章还不错,可以考虑为我充电 ⚡️