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

火箭聊天 是一个 开源交流平台 组织、团队或论坛成员之间协作的理想选择。

我们将它用于 Linux Handbook 的内部交流,它是 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;

非 WWW 到 WWW

创建一个名为 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 服务。 以下是有关怎样配置它的快速演练:

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

导航到管理面板:

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

Rocket Chat 电子邮件通知设置

再次向右向下滚动,直到看到“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 创建一个新容器。 完成后,您可以删除旧的。 当您缩小到单容器模式时,这会导致可以忽略不计的停机时间。 执行升级时,用户访问不会受到影响:

如果您遇到错误,有问题或有建议,您可以通过在下面发表评测让我知道。

相关阅读:

Posted in: LinuxTags: ,