开源评论系统 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: wonderfall/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

命令行工具进入 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: wonderfall/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 文件夹中, 注意备份, 这个文件如果丢失了, 所有评论数据都会丢失.