CentOS7使用RocketChat自建即时聊天服务器

简介

什么是RocketChat?

RocketChat是一个开源的聊天工具(类似微信、QQ),但不同的是,微信、QQ的服务器是腾讯公司的,数据都保存的腾讯的服务器上,而我们用RocketChat,是自己搭建的服务器,所有聊天记录都存在自己的服务器上。

RocketChat支持Mac、Windows、Linux、iPhone、Android、网页版,也就是完全支持所有平台。

RocketChat客户端界面:
-w999

<img src="https://oscimg.oschina.net/oscnet/up-ac0361614d31a785cfd407818014affd.jpg" alt="-w999">

为什么要自己搭建聊天服务器?

现在人们越来越注重隐私,有时候公司内部的一些交流,以及一些众所周知的比较敏感的话题,并不适合使用微信、QQ之类的没有任何隐私可言的工具进行讨论,而RocketChat的服务器是我们自己搭建的,数据在自己手上,所以比较安全。

如何搭建RocketChat服务器?

RocketChat是使用nodejs编写的,使用mongodb作为数据库,所以我们要搭建RocketChat服务器,要安装四个部分:

  • 1、nodejs(以及一些nodejs的工具库)
  • 2、mongodb(数据库)
  • 3、GraphicsMagick(一个图片处理库,RocketChat需要用它来处理图片)
  • 4、RocketChat

下面我们将一步一步安装上边说的四个工具,当然如果你想直接看官方文档也可以:官方安装文档

安装mongodb

添加mongodb的yum源

由于mongodb并没有添加到yum源中,我们要使用yum安装mongodb,需要先添加它的yum源,其实就是在/etc/yum.repos.d/目录中添加一个叫mongodb-org-4.0.repo的文件,并把下边的内容填进去保存即可:

1[mongodb-org-4.0] 2name=MongoDB Repository 3baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/ 4gpgcheck=1 5enabled=1 6gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

如果你嫌上面的方式麻烦,你可以直接在终端里执行以下命令,就会自动在/etc/yum.repos.d/目录中产生这个文件:

1cat << EOF | sudo tee -a /etc/yum.repos.d/mongodb-org-4.0.repo 2[mongodb-org-4.0] 3name=MongoDB Repository 4baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/ 5gpgcheck=1 6enabled=1 7gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc 8EOF

安装mongodb

添加完yum源,直接使用我们熟悉的yum安装即可(不过它的包名叫mongodb-org而不是mongodb):

yum -y install mongodb-org

修改mongodb配置文件

需要把engine设置为wiredTiger,以及把设置replicationreplSetName: rs01,以及把bindIp的ip用引号起起来。

设置完的整个配置如下所示,如果你觉得麻烦,其实直接把我的配置覆盖过去就行:

1# mongod.conf 2 3# for documentation of all options, see: 4# http://docs.mongodb.org/manual/reference/configuration-options/ 5 6# where to write logging data. 7systemLog: 8 destination: file 9 logAppend: true 10 path: /var/log/mongodb/mongod.log 11 12# Where and how to store data. 13storage: 14 dbPath: /var/lib/mongo 15 journal: 16 enabled: true 17 engine: wiredTiger 18# wiredTiger: 19 20# how the process runs 21processManagement: 22 fork: true # fork and run in background 23 pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile 24 timeZoneInfo: /usr/share/zoneinfo 25 26# network interfaces 27net: 28 port: 27017 29 bindIp: "127.0.0.1" # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting. 30 31 32#security: 33 34#operationProfiling: 35 36replication: 37 replSetName: rs01 38 39#sharding: 40 41## Enterprise-Only Options 42 43#auditLog: 44 45#snmp:

启动mongodb

先启动:

systemctl start mongod

然后查看是否启动成功:

systemctl status mongod

如果是如下图所示,有active (running)字样,说明已经成功启动:
-w821

<img src="https://oscimg.oschina.net/oscnet/up-61a6f175773854dbeac0e399465b5b6b.jpg" alt="-w821">

设置开机自动启动:

systemctl enable mongod

如果你要停止或重启:

1# 停止mongodb 2systemctl stop mongod 3 4# 重启mongodb 5systemctl restart mongod

初始化mongodb

使用mongo命令登录mongodb:

mongo 127.0.0.1

创建一个单服务器的复制集(你有多台服务器做集群也可以):

rs.initiate({_id:'rs01',members:[{_id:1,host:'127.0.0.1:27017'}]})

执行结果如下图所示:
-w596

<img src="https://oscimg.oschina.net/oscnet/up-38d2c2421cfbadcd123d2201aad3c02f.jpg" alt="-w596">

设置后用exit命令退出mongodb。

安装nodejs

执行以下命令安装nodejs:

yum -y install nodejs

以上安装的nodejs版本比较低(可以用node -v命令查看版本,我这里目前是v6.17.1),但是RocketChat需要使用比较高的nodejs版本,所以我们要使用nodejs的版本管理工具n来切换到新版本(没错,这个工具名称就一个字母n)。

先使用npm安装inherits以及n(前面安装nodejs后,npm命令就自动有了):

npm install -g inherits n

以上安装可能会有一些WARNING,可以不用理会(当然也可能没有)。

然后使用n工具把nodejs的版本切换到RocketChat要求的版本8.11.4

n 8.11.4

如下图,切换成功后,你再用node -v查看版本,可能还是原来的版本,原因是终端记录了原来的版本,你需要退出登录,再重新登录服务器,然后再看版本,应该就已经换过来了:
-w718

<img src="https://oscimg.oschina.net/oscnet/up-6f60834f2fac074d44cc43c2e6b9afdf.jpg" alt="-w718">

至此,nodejs已经安装完成。

安装GraphicsMagick

前面说过,GraphicsMagick是一个图片处理工具,RocketChat需要使用它来处理聊天中的图片,所以我们要安装一下。

这个安装比较简单,直接使用yum安装即可:

yum install -y GraphicsMagick

安装RocketChat

简介

所有准备工作已完成,终于可以开始安装我们的主角“RocketChat”了,前面说过,RocketChat是用nodejs写的,所以其实所谓的安装,就是把把源码下载下来,解压一下,放到合适的地方,做一个systemd的开机自启动,它的启动也很简单,其实就是用node运行RocketChat的入口文件main.js而已,比如:

/usr/local/bin/node /path/to/RocketChat/main.js

开始安装RocketChat

下载RocketChat最新版本到/tmp/目录中:

curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz

进入/tmp/目录,我们可以看到一个叫rocket.chat.tgz的文件,这个文件就是刚刚下载的:

cd /tmp/

解压rocket.chat.tgz,解压出来是一个bundle文件夹:

tar -zxvf rocket.chat.tgz

解压完成后,我们进入它里面的server文件夹:

cd bundle/programs/server

进入server文件夹后,使用npm安装依赖:

npm install

OK,现在RocketChat其实已经可以用了,但是现在它还在/tmp/目录中,这是Linux的临时文件夹,我们不能把它放在那里(当然你非要放在那运行也是可以的,只不过怕以后清缓存会不小心删除掉,而且也没有人会把程序那在那),所以我们要移动到一个我们认为合适的地方。

放在哪里好呢?其实一般情况下,在Linux中自己安装的程序都会放在/usr/local/目录中的,但是官方文档是把它放在了/opt/目录下,这里我们就根据官方文档的做法,把刚刚解压出来的整个bundle文件夹移动到/opt/目录下,并且重命名为Rocket.Chat(当然你不重命名也是一样可以的,只不过以后可能忘了这是什么程序了)。

执行以下命令,把整个bundle文件夹(也就是Rocket.Chat源码程序)移动到/opt/目录并重命名为Rocket.Chat

mv /tmp/bundle /opt/Rocket.Chat

然后我们顺便把最开始下载的压缩包删掉,因为我们已经解压出来使用了,这个包在这里只会占用服务器硬盘空间(138M呢):

rm /tmp/rocket.chat.tgz

设置开机自启动

前面说过,运行Rocket.Chat这个“服务器”,其实就是用node去运行它的入口文件main.js即可,即:

/usr/local/bin/node /path/to/RocketChat/main.js

但是,为了方便启动/停止,为了方便开机自启动,我们要设置一下开机自启动,Linux的开启自启动有两种,一种是以前的init方式(CentOS6及其以下),一种是CentOS7的systemd,因为我们使用的是CentOS7,所以我们使用systemd方式。

使用systemd来管理程序的启停,其实是在/usr/lib/systemd/system/目录中添加一个以.service结尾的配置文件,比如RocketChat我们就命名为rocketchat.service就行,然后内容直接粘贴以下的内容进去就行(但要注意把ROOT_URL中的ip换成你自己服务器的ip):

1[Unit] 2Description=The Rocket.Chat server 3After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target 4[Service] 5ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js 6StandardOutput=syslog 7StandardError=syslog 8SyslogIdentifier=rocketchat 9User=rocketchat 10Environment=MONGO_URL=mongodb://127.0.0.1:27017/rocketchat?replicaSet=rs01 11Environment=MONGO_OPLOG_URL=mongodb://127.0.0.1:27017/local?replicaSet=rs01 12Environment=ROOT_URL=http://你的服务器ip:3000/ 13Environment=PORT=3000 14[Install] 15WantedBy=multi-user.target

由于我们打算使用一个专有的用户来启动RocketChat,所以我们要先创建一个用户,用户名就叫rocketchat吧,使用以下命令即可创建:

useradd -M rocketchat && usermod -L rocketchat

创建用户后,别忘了把Rocket.Chat的权限修改为该用户:

chown -R rocketchat:rocketchat /opt/Rocket.Chat

然后我们就可以使用systemctl来启动RocketChat服务器了:

systemctl start rocketchat

然后我们再查看一下是否启动成功了:

systemctl status rocketchat

如果一切正常,将会看到类似这样的输出:
-w684

<img src="https://oscimg.oschina.net/oscnet/up-aee6f4bbcebbdfff44bd48a620a260ab.jpg" alt="-w684">

如果像下图这样有红色的failed字样,则说明启动失败,一般来说都是权限问题或者是路径问题,多检查一下即可:
-w782

<img src="https://oscimg.oschina.net/oscnet/up-4d19360020f795ffac36deff6ed4cd4c.jpg" alt="-w782">

启动成功后,我们把RocketChat加入到开机启动:

systemctl enable rocketchat

到这里RocketChat已经启动,下边会继续讲如何使用,如果你要停止或重启RocketChat,由于我们已经使用systemd的启动方式,所以都是systemctl的通用方法:

1# 停止 2systemctl stop rocketchat 3 4# 重启 5systemctl restart rocketchat

如果你想对Linux的系统/程序启动方式有进一步的了解,可以看看这些文章:
浅析Linux初始化init系统第一部分 – Sysvinit
浅析Linux初始化init系统第二部分 – UpStart
浅析Linux初始化init系统第三部分 – Systemd
Systemd入门教程:命令篇
Systemd入门教程:实战篇
Linux – rc.local/init.d/chkconfig/service/systemctl/rcN.d的区别与联系

开始使用RocketChat

如果前面RocketChat已经正常启动,那么如果在浏览器访问:

http://你的服务器ip:3000

就能进入首次的安装向导界面了:
-w1440

<img src="https://oscimg.oschina.net/oscnet/up-1eebed8b0e69186e4b4ddab8c0454688.jpg" alt="-w1440">
  • **姓名:**不需要傻傻的填你的真实姓名,你可以随便填,也可以填一个你常用的网名,英文名等等;
  • **用户名:**不要有空格,由英文下划线数字等组成(不是说一定要下划线,也不是一定要数字,而是说你可以用它们);
  • **组织电邮:**填一个你的邮箱
  • **密码:**填上密码,这个密码以及前面的用户名,其实就是管理员,当然也是一个用户(可以聊天的)

继续往下,这些你都可以自己看着填:
-w1440

<img src="https://oscimg.oschina.net/oscnet/up-7c7f021baf5d0d90c7452549278fdee9.jpg" alt="-w1440">

继续:
-w1440

<img src="https://oscimg.oschina.net/oscnet/up-8108b2df7827ef25ce1ba25ecac29862.jpg" alt="-w1440">

继续:
-w1440

<img src="https://oscimg.oschina.net/oscnet/up-70733418c5db0877bdf052721b663955.jpg" alt="-w1440">

设置好了,现在可以点击“转到你的工作区”
-w974

<img src="https://oscimg.oschina.net/oscnet/up-30de7f7b60f82bc9cdfd1d5a039c2335.jpg" alt="-w974">

界面是这样的(这就是后台界面了):
-w1440

<img src="https://oscimg.oschina.net/oscnet/up-311024fa87fd9aec7b61622c8db34529.jpg" alt="-w1440">

然后,你把你的这个地址,即http://你的服务器ip:3000/发给朋友,或者公司同事,他们在浏览器或客户端访问这个链接,注册一个账号,就可以相互聊天了。

同事/朋友在浏览器上访问(要先注册一个账号):
-w1398

<img src="https://oscimg.oschina.net/oscnet/up-2ba95c15f9317f74b75370e0a442265a.jpg" alt="-w1398">

在电脑客户端(在手机也一样),第一次连接可能比较慢,要稍等一下:
-w993

<img src="https://oscimg.oschina.net/oscnet/up-989d181746521b555a74f4b17526d93d.jpg" alt="-w993">

使用Nginx做反代

一般情况我们都不建议直接使用ip来访问,所以强烈建议使用nginx做反代,这样我们就可以通过域名来访问我们的RocketChat服务器了,如果你不会安装nginx,自己网上找一下资料就行,这里就不说了。

以下是我使用的nginx反代配置(支持https):

1# rocketchat反代 2server { 3 listen 80; 4 listen 443 ssl; 5 server_name rocketchat.xxx.com; 6 7 if ($scheme = http){ 8 return 302 https://$host$request_uri; 9 } 10 11 access_log /var/log/nginx/rocketchat.xxx.com_nginx.access.log combined buffer=1k; 12 error_log /var/log/nginx/rocketchat.xxx.com_nginx.error.log error; 13 14 #https start 15 ssl_certificate /usr/local/nginx/letsencrypt/xiebruce.top/fullchain.pem; 16 ssl_certificate_key /usr/local/nginx/letsencrypt/xiebruce.top/private.pem; 17 ssl_session_timeout 5m; 18 ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; 19 ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 20 ssl_prefer_server_ciphers on; 21 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 22 #https end 23 24 location / { 25 proxy_redirect off; 26 proxy_pass http://127.0.0.1:3000; 27 proxy_http_version 1.1; 28 #由于RocketChat是使用websocket来传输数据的,所以这里反代的时候要设置支持websocket协议 29 proxy_set_header Upgrade $http_upgrade; 30 proxy_set_header Connection "upgrade"; 31 proxy_set_header Host $http_host; 32 proxy_set_header X-Real-IP $remote_addr; 33 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 34 } 35}

如果你不知道怎么配置https,可以看一下为你的网站配置免费的HTTPS支持以及https证书自动续订(renew)问题这两篇文章。


当然,如果你不想那么麻烦,也可以使用不支持https的配置:

1# rocketchat反代 2server { 3 listen 80; 4 5 server_name rocketchat.xxx.com; 6 7 access_log /var/log/nginx/rocketchat.xxx.com_nginx.access.log combined buffer=1k; 8 error_log /var/log/nginx/rocketchat.xxx.com_nginx.error.log error; 9 10 location / { 11 proxy_redirect off; 12 proxy_pass http://127.0.0.1:3000; 13 proxy_http_version 1.1; 14 #由于RocketChat是使用websocket来传输数据的,所以这里反代的时候要设置支持websocket协议 15 proxy_set_header Upgrade $http_upgrade; 16 proxy_set_header Connection "upgrade"; 17 proxy_set_header Host $http_host; 18 proxy_set_header X-Real-IP $remote_addr; 19 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 20 } 21}
  • server_name的值改成你自己的域名,并在你的域名服务商那边添加一个A记录,把域名解析到你这台服务器上;
  • access_logerror_log的路径要修改成真实存在的路径;
  • proxy_pass意思就是把nginx接收到的请求转发给RocketChat,所以它后面的http://127.0.0.1:3000就是RocketChat的地址和端口,由于RocketChat就在本地,所以地址就是127.0.0.1,而端口是我们在/usr/lib/systemd/system/rocketchat.service中用Environment=PORT=3000指定的,如果你不想用这个端口,你可以去修改一下(修改了记得重启)。

如何更新RocketChat服务器

由于更新RocketChat就是更新它的源码,所以我们重复一遍前面的安装步骤即可,即下载→解压→进入server文件夹→npm install→移动并重命名到/opt/目录即可。

客户端的安装

iPhone客户端

直接AppStore搜索“rocket.chat”即可,如下图:
-w495

<img src="https://oscimg.oschina.net/oscnet/up-9374fed179401836f95991835caf83d1.jpg" alt="-w495">

安卓客户端

**1、GooglePlay下载:**搜索“rocket.chat”即可,如下图:
-w394

<img src="https://oscimg.oschina.net/oscnet/up-1975cbda30174b0260faafd8cf53b3fd.jpg" alt="-w394">

2、apk安装:本来安卓是可以直接下载apk安装包的,但是由于官方不提供apk安装包,只有源码,所以只能想办法上googleplay安装了。

电脑客户端(Mac/Win/Linux)

方式一:直接去官网下载就行,当然这个网站如果没有科学上网可能也有点慢:
image

<img src="https://oscimg.oschina.net/oscnet/up-d6aadb9d015ba6a3da2966913562053a.jpg" alt="image">

方式二:你可以去Github下载。

网页版

不需要任何客户端,直接在浏览器访问地址即可。

0 0 vote

Article Rating

本文同步分享在 博客“起航天空”(other)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )