Rocket.Chat搭建个人聊天服务器并配置hubot机器人

Rocket.Chat搭建个人聊天服务器并配置hubot机器人

目前国内主流的通讯软件都会受到国家监管,聊天记录会作为取证的材料,随时都会被查。所以搭建聊天私服是非常有必要的,避免敏感信息泄露。Rocket.chat支持docker一键搭建,并配置Nginx反向代理加上ssl证书包装通讯内容也是加密的。

安装最新版的docker和Nginx

这是我踩的第一个坑,通常使用云服务器都会用系统自带的yum源安装docker。但这个是旧版的docker运行Rocket.chat会出现莫名其妙的报错。

卸载旧版的docker。

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

安装最新版的docker。

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

安装完成后检查docker的版本。

[root@VM-4-13-centos ~]# docker -v
Docker version 25.0.3, build 4debf41

安装Nginx则直接使用yum安装即可。

yum install nginx -y

创建rocket.chat的compose.yml文件

创建rocket.chat的目录。

mkdir rocketchat
cd rocketchat
touch compose.yml .env

编辑compose.yml文件,插入下面的内容。

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:-127.0.0.1}:${HOST_PORT:-3000}:${PORT:-3000}"

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

然后编辑.env文件,插入下面的内容,注意修改ROOT_URL。

### Rocket.Chat configuration

# Rocket.Chat version
# see:- https://github.com/RocketChat/Rocket.Chat/releases
RELEASE=6.6.0
# 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=https://<改成你的ip>:<端口>/
# 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=

运行rocket.chat服务

docker compose up -d

此时rokcet.chat是监听在127.0.0.1:3000的,目前只有本机可以访问。

docker compose logs

如果日志中有rocket.chat输出的版本号就说明运行没有问题。

目前基本上搭建完成一大半。

配置ssl证书+Nginx反向代理

如果要使用移动端的app则必须要求有配置ssl证书,所以必须要用的Nginx进行反向代理。申请ssl证书网上有很多相关的文章,或者可以直接使用cloudflare的代理转发(会自动配置ssl),这里就不赘述了。

编辑Nginx的配置文件nginx.conf。

#必须要加上这段,否则Nginx不支持websocket
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {

listen 443 ssl;

access_log logs/wordpress.log combinediox;
error_log logs/wordpress.error.log;
server_name zgao.top;                                 #填写您的证书绑定的域名,例如:cloud.tencent.com
ssl_certificate 1_zgao.top_bundle.crt;                #填写您的证书文件名称,例如:1_cloud.tencent.com_bundle.crt
ssl_certificate_key 2_zgao.top.key;                   #填写您的私钥文件名称,例如:2_cloud.tencent.com.key
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;                  # 可参考此 SSL 协议进行配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;  
ssl_prefer_server_ciphers on;

        location / {
            proxy_pass   http://localhost:3000;       #反向代理到本地rokcet.chat监听的端口
            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_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
}

完成后重启Nginx,访问你的ip:443就能看到rocket.chat的初始界面了。第一次需要需要验证管理员的邮箱并登录。

登录rocket.chat并安装移动端APP

这里我的433端口给博客用了,所以我监听的442端口给到rocket.chat。

同时也可以在苹果商店(外区)搜索下载rocket.chat的app使用。

让其他朋友也填写你的服务器服务器ip和端口并注册用户,就可以一起在私人服务器上聊天了。再也不用担心聊天记录被监控了。

hubot机器人配置

配置好Rocket.Chat后可以添加hubot机器人做一些自动化的事情。官方推荐的机器人仓库为:
https://github.com/RocketChat/hubot-rocketchat

创建机器人账号

给机器人配置一个账号密码。

运行hubot的docker

在Rocket.Chat的目录下运行。

docker run -it -e ROCKETCHAT_URL=https://<域名>:<端口> \
	-e ROCKETCHAT_ROOM='general' \
	-e RESPOND_TO_DM=false \
	-e ROCKETCHAT_USER=<bot的用户名> \
	-e ROCKETCHAT_PASSWORD=<bot的密码> \
	-e ROCKETCHAT_AUTH=password \
	-e BOT_NAME=<bot的别名> \
	-e EXTERNAL_SCRIPTS=hubot-pugme,hubot-help \
	-v $PWD/scripts:/home/hubot/scripts \
	rocketchat/hubot-rocketchat

-e RESPOND_TO_DM=false //bot是否回复私聊的消息,否则只在群里中回复

-v $PWD/scripts:/home/hubot/scripts 会将当前目录下的scripts目录挂载到容器的/home/hubot/scripts目录下,这个就是hubot执行脚本的目录。

scripts中存放自己开发的hubot脚本。如果语法没有问题查看容器运行的日志如下:

示例的hubot脚本

hello.js

module.exports = (robot) => {
  robot.hear(/hello/i, (res) => {
    // 使用 res.message.user.name 获取发送消息的用户名称
    const userName = res.message.user.name;
    // 向群聊发送回复消息
    res.reply(`Hello, ${userName}!`);
  });
};

当我发送hello时 ,就会触发机器人的代码,自动@ 发送消息的人进行回复。

根据关键字发送http请求并回复响应内容

module.exports = function(robot) {
  robot.respond(/mobile\s+(\d+)/i, function(res) {
    var mobileNumber = res.match[1];
    var queryUrl = "http://xxxxx:xxx/sgk?mobile=" + mobileNumber;

    robot.http(queryUrl).get()(function(err, response, body) {
      if (err) {
        res.send("发生错误: " + err);
        return;
      }
      // 确认响应状态码为200
      if (response.statusCode === 200) {
        try {
          // 解析响应体的JSON内容
          var jsonResponse = JSON.parse(body);
          // 提取并发送message内容
          var message = jsonResponse.message;
          res.send("请求成功,查询结果:\n" + message);
        } catch (error) {
          res.send("解析响应内容时发生错误:" + error);
        }
      } else {
        res.send("请求失败,状态码:" + response.statusCode);
      }
    });
  });
};

这是一段查询社工库的脚本,根据mobile参数拼接请求URL接口,然后解析json消息并返回。

至于如何开发hubot的脚本,直接让GPT帮忙写就可以了。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论