这篇文章会很长(我在写的时候就预感到了),大致分为三大部分:

  • 安装
  • 配置
  • 迁移

前言

为什么搭建自托管的评论系统,对我来说,我将typecho静态化了,所以我没得选,只能依赖第三方服务来实现评论,我用过一段时间的gitalk,这个服务依赖于github issues功能,但是它有两个问题:评论需要登陆,而且api.github.com在中国大陆有些地区无法访问。对那些动态博客用户来说,独立的评论系统也方便在不同的博客系统中使用。

寻求于互联网,isso大概是一个非常不错的选择:

  • 自托管
  • 支援markdown
  • 邮件回复
  • 可从其他博客评论系统迁移

而且它非常轻量,不需要很强性能就可以运行的很流畅。

但是它需要一台vps,国内国外均可,且可以不用管备案限制,因为带端口号使用https不会被拦截。

安装

先安装依赖(本文皆以Debian系为例,请各位灵性代换包管理器):

sudo apt install python-dev sqlite3 build-essential

由于isso是用python编写的,所以从pip安装:

pip install isso

这样就安装好了,安装虽易,但是配置较繁琐。

配置

Server配置文件

随便找个地方新建isso.conf,比如本文的/root/isso.conf

写入如下内容:

;通用配置
[general]
dbpath = /home/isso/db.db ;数据库地址,请确保目录存在,文件不存在会新建
host = https://example.com ;使用isso的博客地址 
notify = smtp ;启用邮件通知

;服务端配置
[server]
listen = http://localhost:43956/ ;在本文使用nginx反代的方式访问,所以只要监听本地端口即可,用0.0.0.0表示对全网开放

;邮件通知服务
[smtp]
username = [email protected] ;发件邮箱
password = ;你的密码
host = smtp.example.com ;smtp服务器
port = 465 ;smtp端口
security = ssl ;smtp加密
to = [email protected] ;收到管理邮件的邮箱
from = "马孔多不下雪评论通知" <[email protected]> ;“邮件标题” <发件邮箱>
timeout = 10

;保镖
[guard]
enabled = true ;启用
ratelimit = 5 ;每分钟评论数
direct-reply = 30
reply-to-self = true ;自我回复
require-author = false ;需要用户名
require-email = true ;需要电邮

;评论审核
[moderation]
enabled = false ;是否开启
purge-after = 30d ;未审核多少天删除

;后台管理地址
[admin]
enabled = true ;是否启用
password = ;设置密码

请按照你的需要配置合理设置,更多设置可以在官网查看

然后输入如下命令即可运行

isso -c /root/isso.conf run

如果遇到ImportError: cannot import name SharedDataMiddleware错误,请输入pip install Werkzeug==0.16.1;{1}

此时你本地回环网络的43956端口就是这个服务器,如果你只监听了localhost,将无法通过外网访问,不过不碍事,毕竟这样没有https,咱们通过nginx反代即可。

nginx反代

新建一个虚拟主机,配置如下:;{2,3,4}

server{
    listen 42362;

    location / {
        proxy_pass http://localhost:43956;
        gunzip on;
    }
}

server{
    listen 42361 ssl http2;
    server_name isso.example.com;

    ssl_certificate /root/key/cert.pem;
    ssl_certificate_key /root/key/key.pem;

    location / {
        proxy_pass http://localhost:42362/;
        
        sub_filter "http://localhost:43956" "https://isso.example.com:42361";
        sub_filter_once off;
        sub_filter_types *;
    }
}

请用自己的域名代换第二个server里面的两个isso.example.com,下面给出解释:

本来以常规方式反代(即写一个proxy_pass)就可以正常评论了,但是,后台admin页面却无法登陆,这样当然很不爽,所以找了找问题发现是http://localhost:43956没有被替换,当时心里想了想,这简单,直接用sub_filter替换就得了,然后加上sub_filter配置。这回总行了吧,但是一登陆还是报错,难道要带cookie么?想了想localhost好像没有cookie才对,一看发现没有替换成功,搜索一下才发现sub_filter不能替换gzip加密的内容,而且isso是强制启用gzip的,淦。

那我反代不就不能用后台了,继续搜索,然后发现一个奇技淫巧,真是神乎其技:

咱们反代两次,第一次转发后将gzip内容解压就好了。

所以上述配置文件中第一个server就是第一次反代,gunzip on;表示将gzip解压。当然因为第一次仅本地访问,所以用http就足够了。

第二个server便是对外开放的端口。

阿里云真好,带端口https可以绕备案,这台学生机终于有点用了,不再用来挂QQ了。

客户端配置

当然仅仅是服务端配置肯定是不够的,客户端只要插入一段html即可:

<div id="comments">
  <section id="isso-thread">
    <script data-isso="https://isso.example.com:42361/" src="https://isso.example.com:42361/js/embed.min.js" type="text/javascript"></script>
  </section>
</div>

当然端口号是可以自己完全定义的,如果你有备案号,用443也可以。

<div>标签只是为了方便控制样式,如果你博客背景是白色的,默认样式也足够好看。

迁移

对于我之前使用的gitalk,并不能迁移评论,而且速度国内超慢的,完全不建议国内使用。

但是这回的isso就可以迁移评论了,当然isso是国外友人开发的,只能迁移wordpress的评论,不过这不碍事,咱们先把typecho数据导出成wordpress的xml就好了,都不用安装wordpress的。

这一步可以使用ByeType实现,无缝迁移。

然后得到wordpress的xml,假设叫做wp.xml并且你已经上传到了vps上,再利用如下命令便可导入isso数据库:

isso -c /root/isso.conf import wp.xml

但是生活总不是一帆风顺的,当你导入过去之后你可能会发现一个小小的问题:你的原来的评论并没有显示出来。

看了下数据,就可以很容易的发现问题所在:

我们可以发现导入时的链接地址和博客的并不一致,所以我们有一个简单的方法修改地址:

cd /home/isso/
sqlite3 db.db

此时我们应该进入到sqlite3数据库里面了,输入SELECT * FROM threads;可以看到整个表,我们需要做的修改也只在这个表内。

还好/?p=数字中的这个数字和我typecho的cid是一致的,所以我们只需要将/?p=数字改为/archives/数字/即可,当然,你的链接格式不一定和我完全一样,请灵性代换。

输入UPDATE threads SET uri = '/archives/数字/' WHERE id = 另一个数字

注意上述id是指图中最左边一列的数字。

因为我只有二十条文章有评论,所以只需要一条一条改就好了。

当然如果你有上百条要改,那也不过如此(柠檬柠檬)。

另外输入.quit可以退出sqlite数据库。

参考链接

  • {1}:https://github.com/posativ/isso/issues/611
  • {2}:https://moe.best/technology/pixiv-proxy.html
  • {3}:https://www.v2ex.com/t/234923#reply17
  • {4}:https://blog.csdn.net/chunyuan314/article/details/55113697
最后修改:2020-03-29 12:18:19