两个月前我重新使用 Ghost 系统搭建了现在的博客,用到现在,除了头部图片添加无法共用图片等奇葩事情之外整体上还算满意,不过始终有一个蛋疼的地方就是 Ghost 博客默认是不带评论系统的,感觉很奇葩。貌似 Ghost 一开始定位是博客系统,慢慢的向 CMS 系统过度,现在又搞订阅付费的那一套,至始至终貌似也没有添加评论功能的打算,也许是因为国外的第三方评论系统比较给力吧,国内的基本上死的死,残的残,再加上长城的存在,想添加一个好用的第三方评论系统简直比生孩子都难……

我一开始准备造一个轮子,但是想起来涉及前端 CSS 之类的东西,我萎了,转手研究目前的所有可用的评论系统,发现开源的评论系统还是很多的,随便选了一个 Python 版本的,名字叫做 ISSO,打着轻量级 Disqus 的称号,本地测试了一下,发现除了配置麻烦一点,一般评论系统需要的功能都有,这篇文章就是 ISSO 系统配置的详细流程,以供其它 Ghost 博主想要自建评论系统的参考。

1. 准备

上面其实一直在提及 Ghost 博主,原因是 Ghost 博主一般都是自己购买 VPS 搭建的,对系统有绝对的自主权,而想要搭建 ISSO 评论系统,你需要有自己的服务器,因为 ISSO 使用的 Python 编写的,所以你需要安装 Python 环境,不过我这里推荐直接使用 Docker 版本,尽量避免污染你现有的环境,类似的,你也需要安装 Docker 环境。

除此之外,最好还需要一个二级域名,用来访问你评论系统的后台。如果你的博客已经设置了 HTTPS,那么推荐你也将准备指向评论系统的域名同样申请一个证书,虽然这不是必须的,但是网站下所有链接都设置为 HTTPS 应该更好一点。

还有一点,如果你以后想要收到评论的邮件提醒,你需要找一个支持 SMTP 协议的邮件发送服务,可以使用腾讯邮箱,也可以使用 Gmail 之类的国外邮箱,这些邮箱在使用 SMTP 协议之前都需要你去邮箱设置里面开启 SMTP 功能,否则 ISSO 是无法发送邮件的。

1.1 安装 Docker

如果你的服务器已经安装了 Docker 环境,那么可以跳过这一步,否则需要访问 Docker 的官方文档,查看具体的安装步骤,这里以 Ubuntu 为例:

先更新包索引:

sudo apt-get update

在安装一些包,让 apt 支持 https 的访问:

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

加入 Docker's 官方 GPG Key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

加入源:

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

更新:

sudo apt-get update

安装:

sudo apt-get install docker-ce docker-ce-cli containerd.io

查看当前 Docker 版本,验证是否安装成功:

docker version

正常情况下输出类似下面的信息:

 Version:           19.03.6
 API version:       1.40
 Go version:        go1.12.16
 Git commit:        369ce74a3c
 Built:             Thu Feb 13 01:27:49 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.16
  Git commit:       369ce74a3c
  Built:            Thu Feb 13 01:26:21 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1.2 配置域名

如果你知道怎样配置域名,可以跳过本节。域名配置非常简单,只需购买域名的服务商那里,设置 DNS,新建一个二级域名,指向想要部署评论系统的服务器,这里以阿里云为例。

直接登陆控制台,打开云解析 DNS 模块,增加新记录:

增加记录

主机记录填写你想要的二级域名,记录值填写对应的服务器 IP 地址。添加好后,等一会,尝试 ping 这个二级域名看看是否生效。

有了域名之后,我们申请域名证书。推荐申请 TrutAsia 免费证书,主要是它可以免费一年,不用像 Let's Encrypt 证书一样三个月就要续期一次。具体可以访问 FreeSSL.cn 网站,流程这里就不演示了,最后你可以下载到自己的域名证书,包括私钥和公钥,将它们上传到服务器,留作备用。

接着登陆服务器,查看现有的 Nginx 配置,增加我们刚刚设置的二级域名访问策略,推荐直接反向代理指向本地 8080 端口,该端口用于配置 ISSO,当然你也可以使用其它的端口。

/etc/nginx/sites-available 文件夹下(Ubuntu 系统,其它系统可能位置不同),增加配置文件:

server {
    #in the following lines, replace example.com with your domain name.
    server_name isso.wangzhechao.com;  # the URL you want to redirect from
    root /var/www/ghost/system/nginx-root;
    location / {
        return 301 https://isso.wangzhechao.com$request_uri; # the URL you want to redirect to
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    #in the following lines, replace example.com with your domain name.
    server_name isso.wangzhechao.com; # the URL you want to redirect from
    root /var/www/ghost/system/nginx-root; # replace /var/www/example with the location of your ghost installation

    ssl_certificate /etc/isso/full_chain.pem;
    ssl_certificate_key /etc/isso/private.key;
    include /etc/nginx/snippets/ssl-params.conf;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8080;

    }

    client_max_body_size 50m;
}

这里主要是配置二级域名为 HTTPS,并将这个访问连接以反向代理的形式指向本地 8080 端口,注意配置中的域名证书的位置,这个证书就是刚刚你申请并上传到服务器的路径。

配置好后,去同级的 sites-enabled 目录做软连接,让该配置生效。

ln -s /etc/nginx/sites-available/isso.wangzhechao.com.conf .

上面这些配置中的所有 isso.wangzhechao.com 文本都需要替换成你前面添加的二级域名。

搞定后重启 Nginx:

service nginx restart

尝试访问你的二级域名看看是否返回 502。

1.3 开启 SMTP

开启 SMTP 的步骤每个邮箱都不相同,这里以 QQ 邮箱为例。登陆 QQ 邮箱,进入设置界面:

QQ 邮箱设置界面

选择账户面板。在中间部分可以看到 POP3/SMTP 服务的选项,选择开启:

开启 SMTP

开启后,会有一个授权码,这个是邮件发送时候需要的密码,记下来,等下 ISSO 系统配置的时候需要使用。

到此为止,准备工作基本完成,接下来就是开始配置 ISSO 系统本身了。

2. 配置 ISSO 服务

ISSO 评论系统分为前后台,这里讲解一下如何搭建 ISSO 的后台服务。在开始搭建服务之前,我们先找一个地方创建两个目录,一个用来放 ISSO 的服务器配置,路径为 /etc/isso/conf ,另一个用来放 ISSO 的评论数据,路径为 /etc/isso/db

建好目录后,我们按照 ISSO 官方的文档新建一个配置文件:

[general]
dbpath = /etc/isso/db/comments.db
# 使用评论的网站
host = https://wangzhechao.com/
notify = smtp
reply-notifications = true
gravatar = true
gravatar-url = https://cn.gravatar.com/avatar/{}?d=identicon&s=48
[moderation]
enabled = true
purge-after = 180d
[server]
listen = http://0.0.0.0:8080/
[smtp]
#邮箱地址
username = 
#邮箱密码/邮箱授权码
password = 
host = smtp.qq.com
port = 465
security = ssl
#接收通知邮件的邮箱
to = recvmail@live.com  
#发送邮件的邮箱,有些 SMTP 服务需要和 username 的邮箱一致
from = "ISSO Comment System" <no-reply@isso.com>   
timeout = 10
[guard]
enabled = true
ratelimit = 3
direct-reply = 30
reply-to-self = true
require-author = true
require-email = true
[admin]
enabled = true
# 管理评论后台的登陆密码
password = xxxxxxxxxxxxxxxxxxxxx

配置文件中需要注意的有几点:

  • host,用来配置使用评论系统的网站,防止出现跨域问题。
  • listen,ISSO 对外服务的端口,也是刚刚配置 Nginx 反向代理对应的端口。
  • username,邮箱的登陆用户名或者邮箱的全名,不同的邮箱服务商设置不同。
  • password,邮箱的登陆密码,或者邮箱授权码。
  • to,用来接收评论通知的邮箱,别人在你博客评论,username 那个邮箱会向这个邮箱发送提示邮件。
  • from,发送邮件中提到的发送人,有一些邮箱对此有限制,必须和真正发送的邮箱(username的邮箱)一致。

将配置文件保存到 /etc/isso/config 目录下后,下载 ISSO 的 Docker 镜像,我在 Hub 上找到别人封装好的镜像文件。这里直接下载使用:

docker run --name isso -d --restart unless-stopped -p 127.0.0.1:8080:8080 -v /etc/isso/config:/config -v /etc/isso/db:/db schnouki/isso

下载好会自动运行,可以使用 docker logs isso 查看 ISSO 系统日志,并且可以使用 docker ps -a 查看容器运行状态。

因为这个镜像使用的是 Python3 ,所以可能在运行中遇见如下的错误:

2020-03-04 07:11:44,178 ERROR: POST /new
Traceback (most recent call last):
  File "/usr/lib/python3.8/site-packages/isso-0.12.2-py3.8.egg/isso/__init__.py", line 141, in dispatch
    response = handler(request.environ, request, **values)
  File "/usr/lib/python3.8/site-packages/isso-0.12.2-py3.8.egg/isso/views/comments.py", line 92, in dec
    return func(self, env, req, *args, **kwargs)
  File "/usr/lib/python3.8/site-packages/isso-0.12.2-py3.8.egg/isso/views/__init__.py", line 46, in dec
    return func(cls, env, req, *args, **kwargs)
  File "/usr/lib/python3.8/site-packages/isso-0.12.2-py3.8.egg/isso/views/comments.py", line 263, in new
    data[field] = cgi.escape(data[field])
AttributeError: module 'cgi' has no attribute 'escape'

这里的原因是 Python 已经将 cgi.escape 这个接口废弃掉了,需要替换为 html.escape 。

这时候可以修改 ISSO 的代码,使用下面的命令直接进入运行的 ISSO 容器内部:

docker exec -it isso sh

然后进入isso/views 目录:

cd /usr/lib/python3.8/site-packages/isso-0.12.2-py3.8.egg/isso/views

修改 comments 文件:

vi comments.py

在文件的头部导入 html 包:

# import cgi
import html

然后找到 cgi.escape 这个函数,替换为 html.escape 即可。修改成功后,退出容器,重启。

docker restart isso

当然你也可以直接修改后运行 docker commit 生成新的改进版镜像。

3. 配置 ISSO 客户端

配置客户端比较简单,只需要在博客想要放置评论的地方添加下面的代码即可:

<section id="isso-thread" data-title="{{title}}" data-isso-id="{{comment_id}}"></section>

<script 
    data-isso="https://disqus.wangzhechao.com" 
    data-isso-css="true" data-isso-lang="zh"
    data-isso-reply-to-self="true" 
    data-isso-require-author="true" 
    data-isso-require-email="true"
    data-isso-reply-notifications="true" 
    data-isso-max-comments-top="10" 
    data-isso-max-comments-nested="5"
    data-isso-reveal-on-click="5" 
    data-isso-avatar="false" 
    data-isso-gravatar="true" 
    data-isso-vote="false"
    data-isso-feed="false" 
    src="https://disqus.wangzhechao.com/js/embed.min.js">
</script>

当然,ISSO 默认的主题样式 low 的一逼,你可以自己替换给力的样式。不过相对于麻烦的样式编写,我觉得默认的样式也不是不可以接受……😂