在上一篇文章我写了使用 commento 的方法,commento 界面还算好看,可自定义配置的选项也很多,但似乎不太适合国内用户使用,首先它暂时只支持英文,"匿名" 写成了 "anonimously comment",占了好多空间,有点讨厌,我可能有点强迫症吧。除了匿名,它还支持通过 google、github、twitter、gitlab、邮箱登录评论,这很好,可惜在国内不实用,而且对于小型个人博客的随机访客,有多少人愿意登录评论呢。
isso 没有注册登录的概念,功能简单界面简洁,是我更喜欢的类型。默认就是匿名评论,当然读者也可以提供自己的邮箱地址,如果有必要,博主可通过邮箱联系读者。虽然简单,但也支持评论回复,支持点赞,支持在一定时间内修改或删除自己的评论,也支持 markdown,支持反垃圾,支持评论审核,isso 还提供了一个简单的后台管理系统,如下:
记录一下我部署 isso 评论系统的方法,和部署 commento 一样,我也是通过 isso 的 docker 镜像部署的,建议先了解 docker 怎么用,也可以先看我之前写的这篇文章:《如何把 gatsbyjs 网站通过 docker 部署到云服务器》。
新建一个叫 test 的文件夹,在里面添加 docker-compose.yml 以及 index.html 文件,再添加 isso 文件夹,接着在这个文件夹创建两个子文件夹,分别是 config 和 db,config 文件夹再创建一个叫 isso.config 的文件,最后 test 的目录结构如下:
test
├── docker-compose.yml
├── index.html
└── isso
├── config
│ └── isso.conf
└── db
└── comments.db
把下面的内容复制到 docker-compose.yml 文件:
version: "3.7"
services:
isso:
image: isso
environment:
- GID=1000
- UID=1000
volumes:
- config:/config
- db:/db
ports:
- "8080:8080"
volumes:
config:
driver: local
driver_opts:
type: none
device: $PWD/isso/config
o: bind
db:
driver: local
driver_opts:
type: none
device: $PWD/isso/db
o: bind
$PWD
表示当前目录,等一下你就明白它有什么用了。通过 volumes 把 test/isso/config 映射到容器的 config 文件夹,把 test/isso/db 映射到容器的 db 文件夹,isso 内部的 8080 端口映射到宿主(即你的电脑或云服务器)的 8080 端口。
把下面的内容复制到 isso.conf 文件中:
[general]
dbpath = /db/comments.db
host =
http://localhost:5000/
localhost
https://kejiweixun.com
http://kejiweixun.com
[server]
listen = http://0.0.0.0:8080
public-endpoint = http://localhost:8080
[admin]
enabled = true
password = password
其中 dbpath 定义了数据库相对于 test/isso 文件夹的位置,host 定义了允许哪些网站使用 isso,这里我填了多个,前面两个在本地测试使用。listen 定义了 isso 的域名,似乎一定要写成 0.0.0.0
,可以加 public-endpoint
明确具体的域名。admin 开启后可通过 isso 域名后加 admin 的方式访问后台,在这个例子就是通过 localhost:8080/admin
访问。
接着把下面的内容复制到 index.html,其中 data-isso 就是 isso 的域名了。
<html>
<body>
<h1>科技微讯</h1>
<script
data-isso="//localhost:8080/"
src="//localhost:8080/js/embed.min.js"
></script>
<section id="isso-thread"></section>
</body>
</html>
创建一个名为 Dockerfile 的文件,把以下内容复制过去,以下内容来自 isso 的 github repo,但是倒数第二行要从官方的 ENV ISSO_SETTINGS /config/isso.cfg
改为 ENV ISSO_SETTINGS /config/isso.conf
。
# First,compile JS stuff
FROM node:dubnium-buster
WORKDIR /src/
COPY . .
RUN npm install -g requirejs uglify-js jade bower \
&& make init js
# Second,create virtualenv
FROM python:3.8-buster
WORKDIR /src/
COPY /src .
RUN python3 -m venv /isso \
&& . /isso/bin/activate \
&& pip3 install --no-cache-dir --upgrade pip \
&& pip3 install --no-cache-dir gunicorn cffi flask \
&& python setup.py install \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Third,create final repository
FROM python:3.8-slim-buster
WORKDIR /isso/
COPY /isso .
# Configuration
VOLUME /db /config
EXPOSE 8080
ENV ISSO_SETTINGS /config/isso.conf
CMD ["/isso/bin/gunicorn","-b","0.0.0.0:8080","-w","4","--preload","isso.run","--worker-tmp-dir","/dev/shm"]
根据这个 Dockerfile 创建一个名叫 isso 的 docker image:
docker build -t isso .
命令行工具进入 test 目录,然后执行下面这条命令,把 docker-compose.yml 文件的 $PWD 赋值为 PWD:
PWD=$PWD docker-compose up -d
接着执行如下命令,开启一个本地服务器,以访问 index.html 文件:
npx serve
这时你应该在命令行工具看到两个域名,其中一个应该是 http://localhost:5000
,在浏览器访问这个域名,你就可以打开 index.html 这个页面了,界面如下:
评论系统已经出现了。
通常的做法是,网站和 isso 都部署在同一个服务器,分别通过不同的域名访问,比如科技微讯这个网站,网站本身的域名是 kejiweixun.com,isso 的域名是 comment.kejiweixun.com,这两个域名都解析到同一个服务器的 ip 地址。
这就需要通过 nginx 这样的代理服务器把流量根据域名转发给相应的程序执行,kejiweixun.com 就转向 kejiweixun.com 背后的程序执行,comment.kejiweixun.com 就转向 isso 执行。
网上有一些配置好了的 nginx 镜像可供选择,我用的是 jwilder/nginx-proxy,当然不一定选择镜像,也不一定用 nginx-proxy 这个版本的 nginx。
关于 jwilder/nginx-proxy 的用法,可以参考我这篇文章:《如何同时运行多个 docker 容器,并通过不同的域名访问》。
下面给出我部署到服务器的 docker-compose.yml 文件:
version: "3.7"
services:
kejiweixun.com: #镜像一
image: kejiweixun/kejiweixun.com
container_name: kejiweixun.com
environment:
- VIRTUAL_HOST=kejiweixun.com,www.kejiweixun.com
expose:
- "80"
networks:
- nginx-proxy
restart: always
isso: #镜像二
image: isso
container_name: isso
networks:
- nginx-proxy
environment:
- GID=1000
- UID=1000
- VIRTUAL_HOST=comment.kejiweixun.com
volumes:
- isso_config:/config
- isso_db:/db
expose:
- "8080"
nginx: #镜像三
image: nginx
container_name: nginx
networks:
- nginx-proxy
ports:
- "80:80"
- "443:443"
restart: always
volumes:
- data:/etc/nginx/conf.d
- certs:/etc/nginx/certs
dockergen: #镜像四
image: jwilder/docker-gen
container_name: docker-gen
command: -notify-sighup nginx -watch /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
networks:
- nginx-proxy
restart: always
volumes:
- certs:/etc/nginx/certs
- data:/etc/nginx/conf.d
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl
volumes:
data:
certs:
driver: local
driver_opts:
type: none
device: $PWD/docker/ssl_certs
o: bind
isso_config:
driver: local
driver_opts:
type: none
device: $PWD/docker/isso/config
o: bind
isso_db:
driver: local
driver_opts:
type: none
device: $PWD/docker/isso/db
o: bind
networks:
nginx-proxy:
name: nginx-proxy
$PWD/docker/isso/config
表明我把 isso 文件夹放在了 docker 这个文件夹中。
下面是 isso.config 的内容:
[general]
dbpath = /db/comments.db
host = https://kejiweixun.com/
[server]
listen = http://0.0.0.0:8080/
public-endpoint = https://comment.kejiweixun.com
[admin]
enabled = true
password = some_password
[guard]
enabled = true
isso 的数据库文件保存在宿主本地,即服务器或你的电脑,在我的例子中,保存在我的腾讯云服务器的 ~/docker/isso/db
文件夹中,注意备份,这个文件如果丢失了,所有评论数据都会丢失。