Self-hosted 系列之 Rocket.Chat 服务部署指北


Rocket.Chat 是一个开源的团队聊天软件,类似 Slack,支持 Self-hosted 部署。

环境信息

内存:2 GB CPU:2 核 IP:140.238.45.112 Docker:24.0.2(docker compose)

部署服务

过程参考官方教程:https://docs.rocket.chat/deploy/prepare-for-your-deployment/rapid-deployment-methods/docker-and-docker-compose

将当前用户添加到 docker group,以便执行命令不需要 sudo

$ sudo usermod -aG docker $USER
$ sudo reboot

/opt 目录创建一个存放 docker-compose.yml 的文件夹

$ mkdir /opt/rocket-chat/ && cd /opt/rocket-chat/

下载官方提供的 yml 配置

$ curl -L https://raw.githubusercontent.com/RocketChat/Docker.Official.Image/master/compose.yml -O

如果网络不畅,可以复制这个配置,跟官方保持了一致(可选)。

volumes:
  mongodb_data: { driver: local }

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:-}
      REG_TOKEN: ${REG_TOKEN:-}
    depends_on:
      - mongodb
    expose:
      - ${PORT:-3000}
    ports:
      - "${BIND_IP:-0.0.0.0}:${HOST_PORT:-3000}:${PORT:-3000}"

  mongodb:
    image: docker.io/bitnami/mongodb:${MONGODB_VERSION:-5.0}
    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}

这样,在目录下已经有一个 compose.yml 文件。

如果你需要限制容器的资源消耗,可以增加配置如下:

rocketchat:
    image: registry.rocket.chat/rocketchat/rocket.chat:${RELEASE:-latest}
    restart: always
    cpus: 1.2
    mem_limit: 1.8g

在当前文件夹(/opt/rocket-chat/)下创建 .env 文件,内容如下,这个内容来自于:env.example

### Rocket.Chat configuration

# Rocket.Chat version
# see:- https://github.com/RocketChat/Rocket.Chat/releases
RELEASE=6.2.4
# MongoDB endpoint (include ?replicaSet= parameter)
#MONGO_URL=
# MongoDB endpoint to the local database
#MONGO_OPLOG_URL=
# IP to bind the process to
#BIND_IP=
# URL used to access your Rocket.Chat instance
ROOT_URL=http://11.22.77.88
# Port Rocket.Chat runs on (in-container)
#PORT=
# Port on the host to bind to
#HOST_PORT=

### MongoDB configuration
# MongoDB version/image tag
#MONGODB_VERSION=
# See:- https://hub.docker.com/r/bitnami/mongodb

### Traefik config (if enabled)
# Traefik version/image tag
#TRAEFIK_RELEASE=
# Domain for https (change ROOT_URL & BIND_IP accordingly)
#DOMAIN=
# Email for certificate notifications
#LETSENCRYPT_EMAIL=

RELEASE 是推荐配置的,找到稳定的版本好,不建议使用 latest,其它可配置项可以根据部署情况自行修改。

以上步骤已做好了准备,运行命令启动服务,它会先启动 mongodb,而后启动 rocket.chat 服务。

$ docker compose up -d

# 停止
$ docker compose stop

如果你用的是云服务器,3000 端口很可能没有开放,需要在安全组中进行配置。

更推荐的方式是前边儿挂着一个 Nginx,通过反向代理访问服务。以下是 Nginx 配置

/etc/nginx/conf.d/chat.conf

server {
    listen 80;
    server_name 11.22.77.88;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_cache_bypass $http_upgrade;
        proxy_ssl_verify off;
        client_max_body_size 200m;
    }
}

从外部访问 80 端口,请求会被转发到机器上的 3000 端口,另外开启了 WebSocket 支持,以及文件上传最大 200MB

此刻,打开 http://<你的IP> 即可访问服务,首个创建的用户是管理员。

使用客户端,填入的服务器 IP 也是这个 IP 地址,推荐绑定域名使用(国内主机域名需备案)

使用 S3 协议的存储

管理页面 - 找到 “设置” - “文件上传”

为了跟 Nginx 配置的 200 MB 匹配,文件上传配置中的文件大小限制也需要修改,这里的单位是字节,所以填入 “209715200”

下拉存储类型,选择 AmazonS3,这里不是说只能用亚马逊的 S3,而是支持 S3 协议的存储都可以。

前一段时间发现个小存储,如果用于测试,还是挺方便的:Bitiful

粉色箭头标注的是 “Amazon S3 bucket name”、“Bucket URL”、“地区”,再到 AccessKey 处创建个子用户,获得 Key

Amazon S3 bucket name:dd-images
Bucket URL:s3.bitiful.net
地区:cn-east-1
Amazon S3 AWSAccessKeyId:Q31493Btk******Ljf4ToPvJ
Amazon S3 AWSSecretAccessKey:qQ6TIlYFL3k**********EPGItzaC6X

填入保存,在聊天窗口发送图像测试

在存储桶即可看到我们上传的文件,如果在聊天窗删除图像,存储桶的文件也会同步删除。

IP 也可以有 HTTPS

发放免费 IP 证书的网站:https://zerossl.com/

使用示例网站上有说明,也可参考我之前一篇博文的记录:Nginx 反代 Quora Poe 使用多种聊天AI

使用感受

部署简单,跟着官方教程走一遍很快就能启动使用,2C2G 应该是最低配置要求,基于 Node.js 的服务资源消耗比较大,实测 1GB 起不来服务。

个人使用中感觉不太友好的地方是文件上传功能,无论使用的是默认的 MongoDB 还是外部的 S3 存储,进度条缓慢到达 100% 后还需要一段时间才能显示,而且存在不展示文件的情况,4M小水管虽然慢,但展示效果还有不少的优化空间。

另外 Web 端发送图片是原图,客户端发送的图片是压缩后的,行为存在不一致性,图像这种比较高频的场景,目前需要点击别针图标选择发送,用单独的发送图片的图标会更加易用,这样也可以在 APP 中弹出的窗口选择原图发送还是压缩后的图片,从大众使用角度,编辑器中的 “Inline code”、“Multi line”、“Katex” 应该支持可选隐藏。

整体来说,Rocket.Chat 应对简单的场景,可用性还是不错的,后续会尝试其他可独立部署的 IM,也会进一步了解 Rocket.Chat 功能。