科技微讯

开源评论系统 isso 部署方法

为什么用 isso

在上一篇文章我写了使用 commento 的方法,commento 界面还算好看,可自定义配置的选项也很多,但似乎不太适合国内用户使用,首先它暂时只支持英文,"匿名" 写成了 "anonimously comment",占了好多空间,有点讨厌,我可能有点强迫症吧。除了匿名,它还支持通过 google、github、twitter、gitlab、邮箱登录评论,这很好,可惜在国内不实用,而且对于小型个人博客的随机访客,有多少人愿意登录评论呢。

isso 没有注册登录的概念,功能简单界面简洁,是我更喜欢的类型。默认就是匿名评论,当然读者也可以提供自己的邮箱地址,如果有必要,博主可通过邮箱联系读者。虽然简单,但也支持评论回复,支持点赞,支持在一定时间内修改或删除自己的评论,也支持 markdown,支持反垃圾,支持评论审核,isso 还提供了一个简单的后台管理系统,如下:

isso1

如何部署 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>

创建 isso image

创建一个名为 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 --from=0 /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 --from=1 /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 .

在本地电脑运行 isso

命令行工具进入 test 目录,然后执行下面这条命令,把 docker-compose.yml 文件的 $PWD 赋值为 PWD:

PWD=$PWD docker-compose up -d

接着执行如下命令,开启一个本地服务器,以访问 index.html 文件:

npx serve

这时你应该在命令行工具看到两个域名,其中一个应该是 http://localhost:5000,在浏览器访问这个域名,你就可以打开 index.html 这个页面了,界面如下:

isso2

评论系统已经出现了。

部署到服务器

通常的做法是,网站和 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 文件夹中,注意备份,这个文件如果丢失了,所有评论数据都会丢失。

暂无评论