NeoValine:一个基于 Valine 开发的支持人工审核的评论系统

终于,我的评论系统开发成功了 🎉🎉🎉 我将其命名为 NeoValine 🥳

项目链接:

简介

NeoValine 是一款基于 Valine 开发的,有后端和控制面板的,支持人工审核(先审核后显示)的快速、简洁且高效的评论系统。

特点

  • 本地化部署
  • 管理员控制面板
  • 先审核后显示的审核方法
  • 免费开源无广告(GPL-2.0 License)
  • 前端基于 Valine 开发,快速、简洁、高效

未来打算支持

  • 使用 Docker 来简化部署
  • 简单的文章访客统计和网站访客统计
  • 更高程度的用户自定义
  • 移除或改进可能造成隐私泄露的功能

开发 NeoValine 的理由

评论系统是博客中很重要的一部分,是网站与访问者沟通交流的重要渠道。有不少开发者都为博客系统开发了好用的评论系统,比如 Valine。这些评论系统可以在无服务器的情况下部署使用。

但是我的网站是在中国大陆注册的,进行了 ICP 备案和公网备案。而根据公网备案的相关要求,我的网站上的评论系统必须具有先审核后显示的功能。

但是我找遍了全网的评论系统,全都难以符合我的要求,所以我决定自己开发一套有先审核后显示功能的评论系统。

为什么我说全网的评论系统都难以符合我的要求呢?

首先一个问题就是这些评论系统的数据都存储在他们的服务器上。假如哪天这些厂商倒闭了或者开发者弃坑了,数据转移是一个很大的问题。

Valine

基于 LeanCloud 的 Server-less 评论系统,界面很漂亮。

官网链接:Valine

其实在 LeanCloud 上部署 Valine-Admin 是可以有人工审核的功能的,但是由于 LeanCloud 的应用无法 24h 提供服务,每天强制停止服务 6 小时(可以正常评论,但是部署的应用无法正常工作),这就导致了在上面部署的应用在某部分时间段里是失效的。

假如每天只在 7:00~23:59 之间服务,则会导致以下问题:

  • 该时间段内的评论会直接通过审核,这应该是一个漏洞。
  • 该时间段内的评论不会及时提醒。

除此之外,Valine-Admin 的评论管理界面对移动端的适配也有点问题。

畅言

有人工审核的功能,但是界面过时,且免费版有广告。

GitHub 系列

包括 gitment,gitalk 和 gitter。

没有人工审核应该是唯一的缺点。

Disqus 系列

使用 Facebook、Tweeter 登录评论不符合国情,没有人工审核的功能,且被墙的可能性很大。

Boom!NeoValine!

Serverless 是近几年前端技术的趋势之一,也是 Valine 坚持的理念之一。但是我仍然坚持自己开发后端程序。

首先是因为费用问题,一些 Serverless 的服务,比如 LeanCloud,无法支持全天 24 小时提供服务,每天必须强制休眠一段时间。

其次是因为没有美观舒服的后台系统。因为经常要进入后台审核评论,后台的功能性(比如对数据的简单筛选)和美观性很难保证。想要实现的话很大程度上还要自己开发应用并在 LeanCloud 部署。

再者,评论数据的后期迁移也是一件不简单的事情。这主要是考虑 LeanCloud 某天可能会停止服务的情况。

最后,我的网站是部署在服务器上的,顺便还可以积累一下从开发到部署的经验。

后端部署方法

实例环境:CentOS 7.8.2003

这里给出的安装策略是:使用 uwsgi 在 localhost 运行 Django 后端程序,使用 Systemd 守护进程,使用 Nginx 反向代理 API 接口。

如果你青睐于使用跨域,感谢 OuYanghaoyue 的贡献,NeoValine 现已支持跨域部署。

Requirements

  • Python >= 3.7
  • pip
  • uwsgi
  • sqlite3
  • nginx
  • systemd

比较老的 Linux 版本可能不支持 Python3.7,需要自己编译安装。这些环境的安装教程网上已有大把文章,这里不再赘述。

部署 Django 程序

首先在服务器上获得项目代码:

git clone https://github.com/UdUklm/NeoValineBackend --depth 1

编辑 NeoValineBackend/NeoValineBackend/hidden_options.py,并按照提示填写参数:

cd  NeoValineBackend/NeoValineBackend/
mv hidden_options.py.example hidden_options.py
vim hidden_options.py

返回项目根目录。

在项目根目录生成数据库:

sqlite3 db.sqlite3

安装 Virtualenv 并创建虚拟环境,安装依赖:

pip install virtualenv
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt

生成数据库表:

python manage.py makemigrations user
python manage.py makemigrations comment
python manage.py makemigrations
python manage.py migrate user
python manage.py migrate comment
python manage.py migrate

生成超级管理员,并填写信息:

python manage.py createsuperuser

生成静态文件夹:

python manage.py collectstatic

到这里程序已经准备完成,如果想检测是否出错,可以将 https://github.com/UdUklm/NeoValineBackend/blob/master/NeoValineBackend/settings.py 中的 DEBUG 置为 True,之后运行 python manage.py runserver 查看效果。注意之后勿忘将 DEBUG 置回 False

使用 uwsgi 部署 Django 程序

生成一个 uwsgi.ini 文件,按照下列提示填入:

[uwsgi]
pid = run_user
chdir = path_to_NeoValineBackend
master = true
processes = 1
threads = 2
http = 127.0.0.1:8080
static-map = /static=path_to_static_folder
vacuum = true
home = path_to_venv
wsgi-file = path_to_/NeoValineBackend/NeoValineBackend/wsgi.py
logto = log_location_you_want

记住该文件的位置

使用 Systemd 守护进程

cd /etc/systemd/system
touch neovaline.servise

编辑 neovaline.servise:

[Unit]
Description=NeoValine Backend Service
After=syslog.target

[Service]
KillSignal=SIGQUIT
ExecStart=/usr/local/python3/bin/uwsgi --ini path_to_uwsgi.ini
Restart=always
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target

相关命令:

systemctl start neovaline  # 开启服务
systemctl enable neovaline  # 开机自启
systemctl stop neovaline  # 关闭服务

开启后可以使用 netstat -ntlp 检测本地 8080 端口运行情况。

使用 Nginx 反向代理

在网站的 Nginx 配置文件中加入:

location /api/ {
    proxy_pass http://127.0.0.1:8080;
    access_log log_location_you_want;
}

即将所有以 /api/ 开头的请求转发到 127.0.0.1:8080

前端使用方法

前端的部署参考 Valine 的部署方法。

但是有些参数不支持,比如 appIdappKey,示例配置如下:

<script>
new Valine({
  el         : '#valine-comments',
  placeholder: '评论在后台人工审核后可见;\n留下邮箱可以接收回复等通知 ~',
  avatar     : 'mm',
  meta       : guest,
  pageSize   : 10,
  visitor    : false,
  lang       : 'zh-cn',
  recordIP   : false
});
</script>

之后把 Valine.min.js 路径引入 html,并把 <div class="comments" id="valine-comments"></div> 放到你网页中想让评论页面出现的地方就行了。

Valine.min.js文件:https://github.com/UdUklm/NeoValine/tree/master/dist

或者你可以使用 CDN:cdn.jsdelivr.net/gh/OuYanghaoyue/NeoValine@0.1/dist/Valine.min.js