自托管 Rocket.Chat 与 Docker 的完整指南

火箭聊天 是一个 开源交流平台 非常适合组织、团队或论坛成员之间的协作。

我们在 Linux Handbook 和 It’s FOSS 中使用它进行内部交流,并且非常喜欢它。

现在,你可以 选择托管 Rocket.Chat 实例 来自 Rocket.Chat 本身的制造商。 这当然会产生额外的费用,但您不必花费额外的精力来部署 Rocket.Chat、更新和维护它。 此外,它还有助于 Rocket.Chat 项目的开发。

如果您想避免花费太多或以“自己动手”的方式处理事情,您可以在您的服务器上自行托管 Rocket.Chat。

在本教程中,我将展示使用 Docker 部署 Rocket.Chat 的步骤。

自托管 Rocket.Chat 与 Docker

让我们看看在 Linux 服务器上使用 Docker 部署 Rocket.Chat 需要什么。

要求

除了熟悉 Linux 命令之外,了解 Docker Compose 的基础知识在这里也会有所帮助。

  • Linux 服务器。 您可以使用物理服务器、虚拟机或云服务器。 你可以 与我们的合作伙伴 Linode 签约 并获得 100 美元的免费积分。
  • Docker 和 Docker Compose 安装在您的服务器上。
  • 访问您要部署 Rocket.Chat 的域的 DNS。
  • 带有 www/non-www 重定向和允许上传限制的 Nginx 反向代理设置。

第 0 步:准备好初始设置

您需要在系统上安装 Docker 和 Docker Compose。 您可以参考这些教程以获取有关 Ubuntu 的说明。

  • 在 Ubuntu 上安装 Docker
  • 在 Ubuntu 上安装 Docker Compose

除此之外,您还需要设置 Nginx 反向代理。 如果您想在同一台服务器上安装多个 Rocket.Chat 或其他一些 Web 服务,这将非常有用。

这个主题之前已经在下面链接的教程中详细介绍过,所以我不会在这里重复相同的步骤。 但是,您必须在系统上进行此设置。

运行 Docker Compose 时使用以下 Nginx 配置,命名为 docker-compose.yml 在一个单独的目录中。 确保你改变 DEFAULT_EMAIL 根据您的喜好。

version: '3.7'

services:

  jwilder-nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: jwilder-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:
      - jwilder-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

volumes:
  certs:
  html:
  vhost:
  dhparam:

networks:
  net:
    external: true

在部署上述配置之前,如果需要,请检查参考,并确保如下所述的准备步骤。

第一步:准备部署 Rocket.Chat 服务器

我在这里使用 Jwilder 反向代理方法,因为它考虑了 SSL 证书、www/non-www 重定向和允许的上传限制。

如何处理 SSL 证书已在上面要求部分中共享的链接中介绍。 此外,我将描述如何启用 www/non-www 重定向(子域跳过它)并通过 Nginx 增加允许的上传限制。

WWW/非WWW重定向(跳过子域)

如果您想在子域上自行托管 Rocket.Chat,则此部分无关紧要,您可以继续下一部分。 但如果没有,根据您的 SEO 偏好,您可能希望将 www 重定向设置为非 www,反之亦然。 为了 example,如果您的聊天服务器托管在 domain.com 上,则必须将访问 www.domain.com 的用户重定向到它(只是如何 GitHub 的域名 作品)。

同样,如果您将其托管在 www.domain.com,访问 domain.com 的用户必须被重定向(只是如何 Linode的域 作品)。

WWW 到非 WWW

创建一个名为 www.domain.com 在 nginx docker compose 目录中包含以下内容并保存:

rewrite ^/(.*)$ https://domain.com/$1 permanent;

非万维网到万维网

创建一个名为 domain.com 在 nginx docker compose 目录中包含以下内容并保存:

rewrite ^/(.*)$ https://www.domain.com/$1 permanent;

现在,假设您想使用 WWW 到非 WWW 重定向。 您所要做的就是将文件绑定挂载到 Nginx 服务配置的卷部分中:

      - ./www.domain.com:/etc/nginx/vhost.d/www.domain.com

增加允许的上传限制

图片上传可能会受到低 Rocket.Chat 的上传大小限制. 由于我使用的是反向代理,因此我必须另外设置最大上传限制并避免在 Docker 上上传图像时出现问题。 假设 1 GB,创建一个名为 client_max_upload_size.conf 并将其保存为以下内容:

client_max_body_size 1G;

稍后您需要按照上一个文件的描述安装它:

      - ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf

docker-compose up -d 从 Nginx 目录更新您的 Nginx 配置。

Rocket.Chat 部署配置基本上由三个主要组件组成:

由于您正在使用 Docker 设置 Rocket.Chat,因此上述所有组件都将部署为它们各自的容器。

对于数据库服务和 副本集初始化,我将使用一个名为 rocket 因为它只需要对 Rocket.Chat 服务可见。

networks:
  - rocket

但是对于 Rocket.Chat 服务,当然是一样的 net 反向代理配置中使用的网络必须与 rocket 网络,然后才有可能使用 Nginx Docker 容器启动并运行它。

networks:
  - net
  - rocket

现在考虑如何使用 Docker Compose 单独配置它们:

对于 MongoDB,我使用 Docker Hub 上提供的官方 MongoDB 4.0 映像

  mongo:
    image: mongo:4.0
    restart: always
    volumes:
     - ./data/db:/data/db
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
    networks:
      - rocket

Rocket.Chat 还需要 MongoDB 副本集 以提高性能。 所以必须单独使用镜像来部署临时服务和初始化副本集。 它将运行必要的命令,删除自身并且不会继续运行:

  mongo-init-replica:
    image: mongo:4.0
    command: 'bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})" && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)"'
    depends_on:
      - mongo
    networks:
      - rocket

对于 Rocket.Chat 服务本身,我使用开发人员发布的 Docker Hub 上标记的最新版本号作为稳定版本。 在这里,在撰写本文时,它是 3.17.0 并基于 官方 Rocket.Chat Docker Compose 配置

  rocketchat:
    image: rocketchat/rocket.chat:3.17.0
    command: bash -c 'for i in `seq 1 30`; do node main.js && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)'
    restart: always
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=https://chat.domain.com
      - VIRTUAL_HOST=chat.domain.com
      - LETSENCRYPT_HOST=chat.domain.com
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - Accounts_UseDNSDomainCheck=false
    depends_on:
      - mongo
    networks:
      - net
      - rocket

由于这是基于 Nginx 反向代理的配置,因此您必须包含额外的环境变量,即, VIRTUAL_HOST, LETSENCRYPT_HOST 使用您的域 URL 和 Accounts_UseDNSDomainCheck 设置 false. 在这里,我假设 chat.domain.com 作为一个 example 您的聊天服务器的域名。

请注意,部署使用绑定挂载配置,因此,数据库和服务卷目录将在具有 Docker Compose 文件的同一目录中创建。

第 2 步:部署 Rocket.Chat

现在您应该准备好 docker-compose 文件。 是时候使用这个文件了。

在您的服务器上创建 Rocket Chat docker compose 目录:

mkdir rocketchat

进入目录编辑必要的文件:

cd rocketchat

现在根据我们目前的讨论创建以下 docker-compose 文件:

version: "3.7"

services:
  rocketchat:
    image: rocketchat/rocket.chat:3.17.0
    command: bash -c 'for i in `seq 1 30`; do node main.js && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)'
    restart: always
    volumes:
      - ./uploads:/app/uploads
    environment:
      - PORT=3000
      - ROOT_URL=https://chat.domain.com
      - LETSENCRYPT_HOST=chat.domain.com
      - VIRTUAL_HOST=chat.domain.com
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - Accounts_UseDNSDomainCheck=false
    depends_on:
      - mongo
    networks:
      - net
      - rocket

  mongo:
    image: mongo:4.0
    restart: always
    volumes:
     - ./data/db:/data/db
    command: mongod --smallfiles --oplogSize 128 --replSet rs0 --storageEngine=mmapv1
    networks:
      - rocket

  mongo-init-replica:
    image: mongo:4.0
    command: 'bash -c "for i in `seq 1 30`; do mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})" && s=$$? && break || s=$$?; echo "Tried $$i times. Waiting 5 secs..."; sleep 5; done; (exit $$s)"'
    depends_on:
      - mongo
    networks:
      - rocket

networks:
  net:
    external: true
  rocket:
    internal: true

现在,您可以启动 Rocket.Chat 实例:

docker-compose up -d

使用您的域 URL 访问配置中指定的 Rocket.Chat 服务器域。

第 3 步:设置您的 Rocket.Chat 管理员帐户

首次访问您的聊天服务器 URL 时,请按照屏幕上的说明操作,直到您将您的网站声明为 admin.

第 4 步:为电子邮件通知设置 SMTP

在这个 example, 我用过 发送网格 作为 SMTP 服务。 以下是有关如何配置它的快速演练:

在主聊天服务器上,单击主页图标:

导航到管理面板:

向下滚动一点并打开电子邮件设置:

火箭聊天电子邮件通知设置

再次,在右侧向下滚动,直到看到“SMTP”:

火箭聊天 SMTP 设置

展开它并确保选择以下设置,特别是 smtps 协议。 这 [email protected] “来自电子邮件”当然仅用于演示目的。 根据您希望它在用户收到邮箱通知时的外观,根据您认为合适的方式对其进行自定义。 因此,根据您的要求进行更改:

火箭聊天 SMTP 设置

那就这样吧! 您已经成功地在您的服务器上自行托管了您自己的、功能齐全的 Rocket.Chat 实例!

自托管 Rocket.Chat 实例的提示

这里有一些技巧可以帮助您维护您的实例。

始终在服务器 URL 中使用 HTTPS

确保始终在聊天服务器 URL 中使用 HTTPS,尤其是在以下两种情况下:

  • 当您告知用户首次登录的 URL 时,请确保他们使用 https 在域名中。
  • 确保 URL 值位于 Admin Panel > Settings > General > Site URL也使用 https.

确保上述两项任务将防止将来出现不必要的登录或注销问题。

实时监控 Rocket.Chat 日志

如果要在实时部署容器时检查容器的日志,可以运行:

docker logs -f rocketchat_rocketchat_1

无需停机即可备份和恢复 Rocket.Chat 设置和卷

使用云 + 本地方法,您可以在不停机的情况下备份和恢复 Rocket.Chat 设置和音量。 我在以下文章中讨论了如何备份绑定挂载(Rocket.Chat 使用):

快速更新 Rocket.Chat 容器而不会中断

随着 --scale Docker Compose 上的标志,您可以基于最新版本的 Rocket.Chat 创建一个新容器。 完成后,您可以删除旧的。 当您缩减到单容器模式时,这导致停机时间可以忽略不计。 执行升级时用户访问不会受到影响:

如果您遇到错误,有问题或有建议,可以在下面留下评论告诉我。