使用 Docker 在 Nginx 下部署 Isso 评论系统

伊索 是一个开源评论软件,可以作为专有的替代品 迪克斯.

您可以使用它为您的博客或网站添加评论系统。

由于嵌入了 JavaScript,它可以与 WordPress、Ghost 和许多其他框架一起使用。 在这里,我用过 作为示范 example.

使用带有混合容器化的 Docker 安装 Isso

本文档重点介绍在 Nginx 容器下部署 Isso 的要点,并采用 Docker Compose 的方式进行简化。 该配置使用通过构建由 GitHub 上的开发人员提供的官方 Dockerfile 生成的图像。

官方指南确实提到 Nginx 用法,这是基于主机端安装。 在这里,和往常一样,我使用了基于 Docker 的 Nginx 配置。

官方文档提供了一个基本的 一条线 example 对于 Docker. 但是,如果考虑到生产用途,则需要对其进行广泛的阐述。

因此,我在同一个基础上定制了一个 Docker Compose 版本 example 和一个 基于 Docker Compose 的 Isso 自定义设置. 后者不再维护,但仍然是一个有用的参考。

使用本指南,您可以在每次发布 Isso 更新时重建 Dockerfile 并创建新映像。

先决条件

这不是强制性的,但如果您具备以下条件,本教程将更容易理解:

  • Docker的一些知识
  • 对 Docker Compose 的理解

您将在反向代理容器后面部署 Isso,并启用 SSL 子域。

除了上述主题知识外,您还需要以下基础架构要求:

  • 面向公众 Ubuntu Linux 服务器. 您可以使用云服务提供商,例如 锂节点. 具有 1 GB RAM 的 Nano 服务器足以进行此部署。
  • 访问域及其 DNS 设置
  • Docker 和 Docker Compose 安装在您的 Linux 服务器上。
  • Nginx 反向代理已经设置 (Docker Compose 文件已包含在本教程中)

如果您需要帮助,可以按照我们的指南进行操作:

  • 在 Ubuntu 上安装 Docker
  • 在 Ubuntu 上安装 Docker compose
  • 反向代理 docker 设置

我会用 isso.domain.com 作为一个 example 获取 Ghost 博客,网址为 domain.com. 根据需要适当更改它们。 我在 Docker Compose 上使用以下 Nginx 配置:

version: '3.7'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./dhparam:/etc/nginx/dhparam
      - ./vhost:/etc/nginx/vhost.d
      - ./certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    restart: always
    networks:
      - net

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-proxy-companion
    environment:
      DEFAULT_EMAIL: "[email protected]"
    depends_on:
      - nginx-proxy
    volumes:
      - ./certs:/etc/nginx/certs:rw
      - ./vhost:/etc/nginx/vhost.d
      - ./html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always
    networks:
      - net

networks:
  net:
    external: true

使用创建外部网络 docker create network net 并使用 docker-compose up -d 从相应的目录。 请查看上面链接的 Nginx Docker 文章以获取完整的详细信息。

步骤 1:更改 DNS 设置

在您的 DNS 提供商的控制面板上,确保您的域的 A/AAAA 记录指向您的 Linux 服务器的 IP 地址。

假设您想在 isso.domain.com 为托管在 domain.com 的 Ghost 博客托管 Isso,您应该添加以下 A 记录,将 xxx.xxx.xxx.xxx 替换为您服务器的 IP 地址。

类型主持人价值TTL
一个记录伊索xxx.xxx.xxx.xxx5分钟。

第 2 步:下载 Isso

在为 Nginx 容器准备 compose 文件之前,您必须使用 Git 下载 Isso。

让我们在 /opt/isso.

采用 git 下载 Isso 并将其放在 /opt 目录下:

sudo git clone https://github.com/posativ/isso /opt/isso

现在切换到这个目录:

cd /opt/isso

现在您已准备好构建官方 Dockerfile 以通过 Docker Compose 生成 Isso 的必要映像:

步骤 3:编辑配置值

在构建映像之前,最好使用生产使用所需的最低限度参数设置配置文件。

sudo nano isso.cfg

配置文件的分段设置:

[general] 部分:

  • 采用 dbpath 设置从要部署的容器内部看到的数据库路径。
  • 设置域名为 host 参数,这将是您想要在博客文章中嵌入 Isso 评论框的博客或网站。 请注意,如果您为博客使用非 www 到 www 重定向,请设置 www.domain.com 作为主机而不是 domain.com 因为那是最终发布评论的终点。
  • max-age,您可以设置一个时间范围,允许用户在 15 分钟内编辑/删除自己的评论(默认)。
  • 我用 smtp 作为在博客上发布新评论时的通知方法(通过电子邮件)。

[moderation] 部分:

将此值设置为 "true" 启用对您网站上发布的所有评论的审核。

[guard] 部分:

将此值设置为 "true" 为所有发布的评论启用基本的垃圾邮件保护。

[server] 部分:

  • listen,您指定要侦听的服务器。 Isso 支持 TCP/IP 和 unix 域套接字。

[smtp] 部分:

也许是最重要的部分,您根据您的 SMTP 服务提供商在此处设置基本凭据。 使用此设置,每次访问者发布新评论时,您都会收到标题为“发布新评论”的电子邮件通知。 这使您可以直接从邮箱中收到有关新评论的通知并轻松地对其进行审核。 参数为 发送网格 是:

  • username 从字面上看 apikey 作为值(所有 SendGrid 用户通用)。
  • password 是你独一无二的 API 密钥 特定于您的 API 密钥 ID。
  • host 将会 smtp.sendgrid.net
  • port 应该 587
  • to 是您希望收到新评论通知的电子邮件地址。
  • from 是您将在收件箱中看到的姓名和地址。 为方便起见,我已将发件人名称设置为“新评论者”和电子邮件地址 [email protected].

如果您使用的不是 SendGrid 而是其他一些 SMTP 服务提供商,则必须根据相应的值相应地更改用户名、密码、主机和端口指标。

总而言之,这是帮助您入门的完整配置文件:

[general]
dbpath = /db/comments.db
host = https://domain.com/
max-age = 15m
notify = smtp
[moderation]
enabled = true
[guard]
enabled = true
[server]
listen = https://0.0.0.0:8080/
[smtp]
username = apikey
password = replace-me-with-sendgrid-apikey
host = smtp.sendgrid.net
port = 587
to = [email protected]
from = New Commenter <[email protected]>

第四步:根据官方 Dockerfile 构建 Isso Docker 镜像

由于您已经从其 GitHub 存储库下载了 Isso,地址为 /opt/isso,Dockerfile 已经存在。

所以,让我们构建图像并命名它 isso:0.12.2

docker build . -t isso:0.12.2

该图像将在本地创建 0.12.2 标签。 是时候在 Docker Compose 中使用它了:

version: '3.7'

services:
  isso:
    image: isso:0.12.2
    restart: on-failure
    volumes:
      - ./:/config
      - ./:/db
    environment:
     - UID=4242
     - GID=4242
     - VIRTUAL_HOST=isso.domain.com
     - LETSENCRYPT_HOST=isso.domain.com
    networks:
     - net

networks:
  net:
    external: true

首先,您设置图像名称并使用 on-failure 重启政策。 根据开发人员显示的卷的安装方式, /config/db 目录将是它在 Isso 容器中的显示方式。 UIDGID 值 4242 用于以非特权用户身份运行容器。

VIRTUAL_HOST 用于使 Isso JS 文件可在线访问以嵌入您的网站,以及 LETSENCRYPT_HOST 为 HTTPS 访问提供免费的 SSL 证书。 我们的 Nginx 容器使用一个名为 net. 因此,这种配置也应该使用同一个网络。

您现在已经准备好使用 Docker 部署 Isso!

第 5 步:部署 Docker Compose 文件

现在,要记住的关键点是:

  • 此容器必须与 Isso 共享相同的网络,以便它们能够相互通信。 由于 Isso 将使用 net 网络,就像您的反向代理容器一样,这将使用相同的。 如果您配置了不同的网络,请确保使用该网络。
  • 您应该设置“on-failure”重启策略。
  • 您必须使用卷来保护持久数据(主机端在 /opt/isso) 安装在容器内各自的位置。

容器需要在 docker-compose 文件之外设置环境变量。 这些是从主机端读取的重要值,这就是为什么 Isso 是一个很好的 example 混合码头化设置。

让我们启动 Isso 实例:

docker-compose up -d

通过实时检查了解部署过程:

docker logs -f isso_isso_1

如果一切顺利,你会得到这样的输出,如下所示:

2021-08-23 14:48:21,334 INFO: connected to SMTP server
2021-08-23 14:48:21,750 INFO: connected to https://domain.com/
[2021-08-23 14:48:21 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2021-08-23 14:48:21 +0000] [1] [INFO] Listening at: https://0.0.0.0:8080 (1)
[2021-08-23 14:48:21 +0000] [1] [INFO] Using worker: sync
[2021-08-23 14:48:21 +0000] [8] [INFO] Booting worker with pid: 8
[2021-08-23 14:48:21 +0000] [9] [INFO] Booting worker with pid: 9
[2021-08-23 14:48:21 +0000] [10] [INFO] Booting worker with pid: 10
[2021-08-23 14:48:21 +0000] [11] [INFO] Booting worker with pid: 11

第 6 步:在您的网站上嵌入 Isso 代码

根据第 3 步中讨论的配置,您现在必须使用 Isso 嵌入代码更新您的网站。

您可以确定应该将 JavaScript 嵌入网站的哪个位置。

<script data-isso="https://isso.domain.com/"
                data-isso-avatar="true"
                data-isso-vote="true"               
                data-isso-vote-levels="-5,5"
                src="https://isso.domain.com/js/embed.min.js"></script><
        <section id="isso-thread"></section>

幽灵的步骤

在基于 Docker 的 Ghost 部署中,过程如下所示:

登录你的ghost服务器并进入ghost目录:

cd ~/ghost

post.hbs 文件位于 /var/lib/ghost/current/content/themes/theme-name/post.hbs. 请记住仅使用您当前使用的主题的 post.hbs 以使嵌入生效。 这里我使用的是 Casper 主题。 所以 theme-name 这里是 casper. 您可以通过输入 Ghost 容器的 shell 来仔细检查:

[email protected]:~$ docker exec -ti ghost_ghost_1 bash -c "ls /var/lib/ghost/current/content/themes/casper/"
LICENSE    author.hbs	  error.hbs    package.json  post.hbs
README.md  default.hbs	  gulpfile.js  page.hbs      tag.hbs
assets	   error-404.hbs  index.hbs    partials      yarn.lock

使用 docker cp 命令复制文件:

docker cp ghost_ghost_1:/var/lib/ghost/current/content/themes/casper/post.hbs post.hbs

现在您已经将它放在了 Docker Compose 文件所在的自托管 Ghost 目录中,打开该文件并在 article-comments 部分中嵌入以下代码:

    <section class="article-comments gh-canvas">
        <script data-isso="https://isso.domain.com/"
                data-isso-avatar="true"
                data-isso-vote="true"               
                data-isso-vote-levels="-5,5"
                src="https://isso.domain.com/js/embed.min.js"></script><
        <section id="isso-thread"></section>
    </section>

这里, data-isso-vote="true" 可以为访客投票和 data-isso-vote-levels="-5,5" 允许为这些值设置一个范围(在这种情况下为 -5 到 5):

在 Isso 上投票

在卷部分的 Ghost Docker Compose 配置中挂载新修改的文​​件,并按如下方式更新它:

- ./post.hbs:/var/lib/ghost/current/content/themes/casper/post.hbs

根据此配置扩展一个新的 Ghost 实例:

docker-compose up -d --scale ghost=2 --no-recreate

大约一分钟左右后,移除仍在运行的旧 Ghost 容器:

docker rm -f ghost_ghost_1

缩小到单容器模式:

docker-compose up -d --scale ghost=1 --no-recreate

至此,您已经成功在您的博客上完成了 Isso 的设置!

第 7 步:在网站上访问您的 Isso 评论框

等待几分钟,然后将浏览器指向刚刚配置 Isso 的 Ghost 域。

为了 example如果您将博客托管在 domain.com,向下滚动到任何博客文章的底部,您会发现评论框可供使用!

Isso 评论框包括可选的名称、电子邮件和网站框,带有预览和提交按钮。Isso 评论框

停止容器

如果您想关闭容器,可以通过转到下载 Isso 的目录来完成(/opt/isso 在我们的例子中)使用 Git 并使用以下命令:

docker-compose down

要再次开始部署,请确保您在相同的环境下工作 /opt/isso 目录并运行:

docker-compose up -d

奖金提示

以下是您的 Isso 设置应该派上用场的一些额外提示:

网页管理界面

您知道您还可以在 Web 界面上访问和审核 Isso 评论吗? 用于该目的的相应 URL 是 isso.domain.com/admin. 在这里,我使用 isso 作为子域。 但为了启用它,您必须设置一个名为的附加部分 [admin] 在配置文件(在步骤 3 中讨论)中包含以下内容:

[admin]
enabled = true
password = plain-text-password

请注意 plain-text-password 上面看到的实际上是您用作密码的值:

Isso 管理 Web 界面登录要求输入密码Isso 管理 Web 界面登录

登录后,网页界面如下图所示:

使用名为 Valid、Pending 和 Staled 的选项卡在 Web 管理面板上审核 Isso 评论。 可以按线程分组。 可用的页码。 按 id、创建、修改、喜欢和不喜欢排序。 可以编辑、删除或验证评论。 在这里,一条待处理的评论正在等待审核。管理 Web 管理面板上的 Isso 评论

如果您启用了 Docker 内容信任

Dockerfile 使用 node:dubnium-buster 作为我尝试构建它时显然没有有效信任数据的基本图像。 Docker 上默认禁用内容信任。 但是如果你启用了它,你可能会得到这样的错误:

[email protected]:/opt/isso$ docker build . -t isso:0.12.2
WARN[0013] targets metadata is nearing expiry, you should re-sign the role metadata 
WARN[0013] snapshot is nearing expiry, you should re-sign the role metadata 
ERRO[0013] Can't add file /opt/isso/ansible/site.yml to tar: io: read/write on closed pipe 
Sending build context to Docker daemon    2.8MB
ERRO[0013] Can't close tar writer: io: read/write on closed pipe 
error during connect: Post https://%2Fvar%2Frun%2Fdocker.sock/v1.41/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=isso%3A0.12.2&target=&ulimits=null&version=1: No valid trust data for dubnium-buster

所以,一定要临时设置 DOCKER_CONTENT_TRUST 作为 0 在构建图像之前(步骤 4):

export DOCKER_CONTENT_TRUST=0

将其设置回 1 获得图像后:

export DOCKER_CONTENT_TRUST=1

更新 Isso

每当发布新版本的 Isso 时,您都可以将存储库克隆到单独的位置:

git clone https://github.com/posativ/isso.git isso-update
cd isso-update

搬到这个单独的位置后(isso-update),您可以使用步骤 4 中所示的最新版本号构建新映像。完成后,编辑 Isso Docker Compose 文件并在此处更新映像版本号。

现在,扩大一个新的 Isso 容器,等待大约一分钟,然后移除旧容器。 最后,缩小到单容器模式(如第 6 步后半部分所述)。

确保投票有效

我花了一段时间才弄清楚为什么在我尝试时对评论的赞成或反对无效。 Isso 对这些事情非常警惕和挑剔。

只有在从不同的 IP 地址(在我的情况下是我的移动数据)访问评论后,我才能成功测试 upvoting/downvoting。 对于在 Isso 上测试评论投票,使用 VPN 将是一个好主意。

最后的笔记

有关 Isso 应用程序及其所有功能的完整参考,您可以参考 Isso 官方文档,特别是服务器和客户端子部分,以广泛使用它并最大限度地提高其生产力。 希望您发现本指南对在您的网站上自行托管您自己的评论系统很有用。 如果您有任何建议、反馈或疑问,可以在下面的评论部分分享。