火箭聊天 是一个 开源交流平台 非常适合组织、团队或论坛成员之间的协作。
我们在 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 部署配置基本上由三个主要组件组成:
- MongoDB 数据库后端
- 副本集的MongoDB初始化
- 火箭聊天 本身作为 Web 前端
由于您正在使用 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”:

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

那就这样吧! 您已经成功地在您的服务器上自行托管了您自己的、功能齐全的 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 创建一个新容器。 完成后,您可以删除旧的。 当您缩减到单容器模式时,这导致停机时间可以忽略不计。 执行升级时用户访问不会受到影响:
如果您遇到错误,有问题或有建议,可以在下面留下评论告诉我。