简介

RocketChat是一个企业级的大型开源的聊天系统,类似于Discord,免费版功能就很强大了,可以在网页端直接聊天,同时还支援全平台客户端。

免费版支持完全私有化部署,完整的权限控制系统,功能应有尽有,已经是非常良心了。

本篇文章主要记录笔者是如何使用Docker快速部署RocketChat的。

Docker部署

配置Docker环境

首先你需要有安装dockerdocker-compose

如果你的系统还没有安装的话可以看这篇文章:https://www.hash070.top/archives/docker-and-docker-compose-install.html

创建目录并填写docker-compose描述文件

首先要创建一个全新的目录,专门用于存放RocketChat的数据文件,后期如果需要迁移服务器的话直接把这个文件夹打包带走就可以了。

创建目录的名称随意,这里假设创建了并进入了一个名为rocketchat的文件夹

mkdir rocketchat
cd rocketchat

然后创建并填写docker-compose.yml文件,docker将根据该文件的内容配置和启动容器

vim docker-compose.yml

向该文件中填入如下内容

其中,你可以在第29行找到该容器所暴露的web端口,默认为3000,而且安全起见仅允许LocalHost访问,请套上Nginx反代+证书使用,当然你可以根据自己的需要更改。

version: "3.7"

services:
  rocketchat:
    image: registry.rocket.chat/rocketchat/rocket.chat:${RELEASE:-latest}
    restart: always
    labels:
      traefik.enable: "true"
      traefik.http.routers.rocketchat.rule: Host(`${DOMAIN}`)
      traefik.http.routers.rocketchat.tls: "true"
      traefik.http.routers.rocketchat.entrypoints: https
      traefik.http.routers.rocketchat.tls.certresolver: le
    environment:
      MONGO_URL: "${MONGO_URL:-\
        mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}/\
        ${MONGODB_DATABASE:-rocketchat}?replicaSet=${MONGODB_REPLICA_SET_NAME:-rs0}}"
      MONGO_OPLOG_URL: "${MONGO_OPLOG_URL:\
        -mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}/\
        local?replicaSet=${MONGODB_REPLICA_SET_NAME:-rs0}}"
      ROOT_URL: ${ROOT_URL:-http://localhost:${HOST_PORT:-3000}}
      PORT: ${PORT:-3000}
      DEPLOY_METHOD: docker
      DEPLOY_PLATFORM: ${DEPLOY_PLATFORM}
    depends_on:
      - mongodb
    expose:
      - ${PORT:-3000}
    ports:
      - "${BIND_IP:-127.0.0.1}:${HOST_PORT:-3000}:${PORT:-3000}"

  mongodb:
    image: docker.io/bitnami/mongodb:${MONGODB_VERSION:-4.4}
    restart: always
    volumes:
      - ./mongodb_data:/bitnami/mongodb
    environment:
      MONGODB_REPLICA_SET_MODE: primary
      MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
      MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
      MONGODB_INITIAL_PRIMARY_HOST: ${MONGODB_INITIAL_PRIMARY_HOST:-mongodb}
      MONGODB_INITIAL_PRIMARY_PORT_NUMBER: ${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}
      MONGODB_ADVERTISED_HOSTNAME: ${MONGODB_ADVERTISED_HOSTNAME:-mongodb}
      MONGODB_ENABLE_JOURNAL: ${MONGODB_ENABLE_JOURNAL:-true}
      ALLOW_EMPTY_PASSWORD: ${ALLOW_EMPTY_PASSWORD:-yes}

然后就是创建数据库目录了,rocketchat依赖于mongo数据库

这里引用的数据库容器是bitnami的mongo docker发行版,该容器为适应生产环境,你需要手动修改数据库文件夹的权限以避免出现权限问题而导致数据库容器启动失败。

sudo mkdir mongodb_data
sudo chown -R 1001 mongodb_data

启动Docker容器

在你创建了docker-compose.yml的文件夹下执行以下命令可以方便地启动/关闭/删除容器

# 启动容器
docker-compose up -d
# 停止容器
docker-compose stop
# 重启容器
docker-compose restart
# 下线(删除)容器
docker-compose down
# 删除容器不会导致你的数据丢失,你的数据库保存在了当前目录下的mongodb_data文件夹内,请妥善保管该目录

至此,RocketChat部署完成

反向代理

Nginx反向代理到本机的http://127.0.0.1:3000端口即可,需要注意的是RocketChat需要使用WebSocket协议来实现聊天通信, 在你的Nginx反向配置文件中应该声明支援WebSocket

我的Nginx反向代理配置文件如下,供大家参考

    location / {
      proxy_pass http://127.0.0.1:3000;
      proxy_set_header Host $http_host;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Nginx-Proxy true;
      proxy_redirect off;
    }

使用教程

初次配置

初次配置会要求创建一个管理员帐号并要求填写一些信息,最一页的那个邮箱激活验证那一步是可以跳过的,右下角有个跳过按钮,后期可以在控制台配置。

之后请自由探索吧,下面我就写一些RocketChat的坑。

进阶设置

如何禁止普通用户搜索其他用户

普通用户默认情况下可以查看该服务器上的所有用户,如果你不想让普通用户能随意查看你的服务器上的所有其他用户,可以在系统控制台 ->权限 取消勾选user那一列的查看外部聊天室的权限,即View Outside Room权限。

如何自定义首页内容

系统控制台->布局->内容中填写。

只支持html,但是你可以使用Typora将你的Markdown文本导出为html然后复制进去。

如何要求新用户注册后要求验证邮箱并限制邮箱域

首先你需要先配置好smtp服务,它在系统控制台->设置->电子邮件中,如果你遇到了问题请往下面看

在系统控制台->设置->帐号->注册部分,勾选只允许已验证的用户登录然后点击右上角的保存。

如果你需要限定用户注册的邮箱的域名,如要求只能使用qq邮箱注册,则可以在允许的域名列表中填入qq.com

常见问题

关于SMTP邮件无法发送的问题

系统控制台->设置->电子邮箱->SMTP中,以qq邮箱为例,如果你确实已经正确地填写了邮箱和对应的密码或密钥,而且使用的是465端口,那么将协议那一项改为smtps或许可以解决(因为465端口一般使用的是安全的smtp协议,即smtps协议

SMTPS:465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。

image-20220621131848448

关于速率限制器(RateLimiter)

系统控制台->设置->RateLimiter中,速率限制器可以防止服务器被滥用导致系统崩溃,该功能默认启用。

如果你认为默认的限制条件过于严格,可以手动调高一点配置。不推荐关闭速率限制器。

其中API Rate Limiter可以适当调高一点,我调整为50了

如果你的用户在注册时遇到了速率限制的问题,那么你可以把Feature Limiting中的值适当增加,它用来限制在一段时间内单一IP的注册速度,这里的"一段时间"指的是API Rate Limiter中的时间。

评价

总体来说RocketChat是一款功能强大的聊天平台,笔者对这个聊天系统非常满意,权限控制系统很完善,适合作为公司和团队的私有化的内部聊天平台。

Q.E.D.