CentOS7使用Mattermost自建即时聊天服务器
Table of Contents
Mattermost简介
在此之前,我写过一篇:CentOS7使用RocketChat自建即时聊天服务器。
其实mattermost跟rocketchat非常像,而且更方便,因为它支持mysql(而一般有个人服务器的同学,都会搞个小网站,mysql肯定已经安装了,所以更方便部署,不想rocketchat还要额外安装mongodb)
Mattermost是一款类似slack的,go语言编写的开源(github)即时聊天服务器。至于slack是什么,你可以去这里看一下。
安装Mattermost
这是官方安装文档,以下是我自己总结优化的步骤。
官网找到最新版本下载链接(如下图)
使用wget下载
wget https://releases.mattermost.com/5.26.1/mattermost-5.26.1-linux-amd64.tar.gz
解压下载好的压缩文件
tar -zxf mattermost-5.26.1-linux-amd64.tar.gz
把解压出来的mattermost
文件夹移动到/opt/
目录下
sudo mv mattermost /opt/
进入/opt/
目录
sudo cd /opt/mattermost
在/opt/
目录下添加一个data
目录用于存放数据
sudo mkdir data
添加一个名为“mattermost”的用户,只用来执行mattermost程序,不能用于登录(当然默认也会创建一个名为“mattermost”的组)
useradd -s /sbin/nologin -M mattermost
把/opt/mattermost
目录的所有者和所属组设置为刚刚添加的用户和组(即“mattermost”)
sudo chown -R mattermost:mattermost /opt/mattermost
给/opt/mattermost
目录的所属组添加写权限
sudo chmod -R g+w /opt/mattermost
配置Mattermost
使用vim打开mattermost的配置文件
vim /opt/mattermost/config/config.json
配置数据库
注意: 我这边是用mysql8数据库,这里我假设你已经安装好了mysql数据库,并且知道你的mysql数据库的用户名、密码、端口。
在配置里面搜索“SqlSettings”(不会搜?看这里),这是数据库的配置,你可以看到它下边有DriverName
和DataSource
"SqlSettings": {
"DriverName": "mysql",
"DataSource": "mmuser:mostest@tcp(localhost:3306)/mattermost_test?charset=utf8mb4,utf8\u0026readTimeout=30s\u0026writeTimeout=30s",
"DataSourceReplicas": [],
"DataSourceSearchReplicas": [],
"MaxIdleConns": 20,
"ConnMaxLifetimeMilliseconds": 3600000,
"MaxOpenConns": 300,
"Trace": false,
"AtRestEncryptKey": "",
"QueryTimeout": 30,
"DisableDatabaseSearch": false
},
DriverName
就是设置你使用什么数据库,它支持mysql和PostgreSQL两种数据库,默认是mysql,如果你用的是mysql就不用改了,如果你使用的是PostgreSQL,那那要改成“postgres”。
DataSource
用于指定数据库参数。不管是什么程序,用到了数据库,你肯定要告诉它你mysql的用户名、密码、地址、端口、数据库名,这样它才能使用数据库,“?”号前面那一段就是用来设置这些信息的(仅限mysql,如果你用PostgreSQL,请在这里搜索“If you are using PostgreSQL”)
mmuser:mostest@tcp(localhost:3306)/mattermost_test
它的格式是
用户名:密码@tcp(ip或域名:端口)/数据库名
我数据库帐号和密码是root
和123456
,而且是在本地(即与mattermost在同一台服务器),所以ip或域名那里我就填127.0.0.1
,我的数据库端口也没有改,是mysql默认端口3306
,而数据库名我建议设置为mattermost
,所以我的设置是
root:123456@tcp(127.0.0.1:3306)/mattermost
另外charset=utf8mb4,utf8
中,第一个utf8mb4
是字符编码集(英文叫CHARACTER SET),第二个utf8
是校对集(英文叫collation),我们要把第二个utf8
修改为utf8mb4_0900_ai_ci
。字符集和校对集的区别可以看这里或这里。
charset=utf8mb4,utf8mb4_0900_ai_ci
至于readTimeout和writeTimeout,是读超时时间和写超时时间,这个我们直接用默认的就可以。而\u0026
其实是&
符号,这个原来就那样的我们不要动它,所以最终我的DataSource
配置是这样的
"DataSource": "root:123456@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8mb4_0900_ai_ci\u0026readTimeout=30s\u0026writeTimeout=30s",
前面指定的数据库mattermost
其实是不存在的,所以我们要创建一个数据库(当然如果你用客户端连的,也可以不用命令,直接在客户端创建,注意字符集和校对集)
CREATE DATABASE IF NOT EXISTS mattermost DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci;
测试运行
配置数据库后,就可以测试能否运行了,进入到mattermost目录
cd /opt/mattermost
使用以下命令运行mattermost
sudo -u mattermost ./bin/mattermost
运行上述命令后,会输出一些信息,最后一行如果类似如下,代表启动成功(而且启动成功也会占用终端)
{"level":"info","ts":1598609004.1071396,"caller":"app/server.go:860","msg":"Server is listening on [::]:8065","address":"[::]:8065"}
假设你的服务器ip是12.34.56.78
,则此时用浏览器访问以下链接即可打开Mattermost的页面
http://12.34.56.78:8065
如果能打开,那说明一切正常,现在你可以在终端按ctrl+c
结束掉Mattermost的运行了,毕竟只是测试。
配置https
前面测试的时候,是直接用http+ip访问的,但是http比较不安全,现在都用https了,所以我们最好配置https。
要使用https,首先要解析一个域名到你的服务器,然后按https证书自动续订(renew)问题里的方法获取tls证书文件和密钥文件。
获取到证书和密钥文件后,把它们放到合适位置,我建议放到mattermost目录下,即/opt/mattermost/
里面,并且放在一个文件夹里,按我的方法获取,证书文件名字是fullchain.pem
,密钥文件为private.pem
。
然后就可以配置https了,需要修改以下几个参数,这几个参数都在配置文件的顶部位置,很容易找到
SiteURL
ConnectionSecurity
TLSCertFile
TLSKeyFile
Forward80To443
SiteURL
就是你的域名,假设你的域名是mattermost.zhangsan.com
,那么这里要写https://mattermost.zhangsan.com
,即要包含协议“https://”;ConnectionSecurity
要设置为“TLS”,表示启用“TLS”(因为https本质是http+tls);Forward80To443
设置为true(不用双引号),表示把80端口的请求转发到443端口(即把http请求重定向到https请求,相当于不允许使用http协议访问,因为如果还是允许http,那就算设置了https也没有意义了);TLSCertFile
填tls证书文件路径;TLSKeyFile
填tls密钥文件路径;
配置好之后,再用前面的方式去启动mattermost
cd /opt/mattermost
sudo -u mattermost ./bin/mattermost
这次,你就可以访问“https://mattermost.zhangsan.com:8065”来进入了。当然,现在的启动方式不是在后台启动,这样肯定不行的,下面我们来配置后台启动。
配置后台启动&开机自启动
使用vim创建以下文件
vim /etc/systemd/system/mattermost.service
使用:set paste
进入粘贴模式,然后把以下内容粘贴进去,然后:x
保存
[Unit]
Description=Mattermost
After=syslog.target network.target
[Service]
Type=notify
WorkingDirectory=/opt/mattermost
User=mattermost
ExecStart=/opt/mattermost/bin/mattermost
PIDFile=/run/master.pid
TimeoutStartSec=3600
LimitNOFILE=49152
[Install]
WantedBy=multi-user.target
然后修改mattermost.service
的权限为644(其实一般创建后默认都是644)
sudo chmod 664 /etc/systemd/system/mattermost.service
然后就可以使用以下命令启/停mattermost了
# 启动
systemctl start mattermost
# 查看运行状态(例如是不是已经启动成功了)
systemctl status mattermost
# 设置开机启动
systemctl enable mattermost
# 重启
systemctl restart mattermost
# 停止
systemctl stop matermost
更新Mattermost版本
# 下载最新版并解压出来(请参考安装),假设解压出来的mattermost文件夹在家目录~
# 把配置和数据放到解压出来的mattermost文件夹中
cp -r /opt/mattermost/config/ ~/mattermost/
cp -r /opt/mattermost/data/ ~/mattermost/
# 修改新的mattermost文件夹的所有者和所属组为mattermost
sudo chown -R mattermost:mattermost ~/mattermost/
# 给新的mattermost文件夹所属组添加写权限
sudo chmod -R g+w ~/mattermost/
# ----------- 以上为准备步骤,下边开始替换 -----------
# 停止mattermost
systemctl stop mattermost
# 把原来的重命名
mv /opt/mattermost/ /opt/mattermost.bak
# 把解压出来的mattermost文件夹移动过去(会覆盖原来的)
mv ~/mattermost/ /opt/
# 再次启动mattermost
systemctl start mattermost
# 查看是否启动成功
systemctl status mattermost
# 如果确定没啥问题,就可以删除刚刚重命名的那个mattermost了(因为这是老版本),当然如果你空间够,可以过一段时间再删除以免新的出现问题, 旧的可以马上恢复
配置nginx反代
你可能也有注意到,前面配置了https后,访问的域名后面是加了一个:8065
的,这是端口号,可是为什么要加端口号?因为我们启动mattermost时用的不是https默认端口号,https默认端口号是443,那为什么不用443?因为很多人服务器可能之前已经有一个网站了,nginx(或apache/caddy)已经占用443端口了,如果你的服务器以前没有网站,443端口没被使用,你可以在配置文件里把原来的8065改成443即可
"ListenAddress": ":8065",
如果你的服务器443端口已经被nginx占用,那么你需要用nginx来接收mattermost客户端的请求,然后转发给mattermost即可
upstream mattermost {
server 127.0.0.1:8065;
keepalive 32;
}
server {
listen 443 ssl http2;
http2_push_preload on;
server_name mattermost.xiebruce.top;
#https start
ssl_certificate /usr/local/nginx/letsencrypt/xiebruce.top/fullchain.pem;
ssl_certificate_key /usr/local/nginx/letsencrypt/xiebruce.top/private.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
#https end
location ~ /api/v[0-9]+/(users/)?websocket$ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 50M;
proxy_set_header Host $http_host;
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 $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 90;
proxy_send_timeout 300;
proxy_read_timeout 90s;
proxy_pass http://mattermost;
}
location / {
client_max_body_size 50M;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
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 $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_cache mattermost_cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale timeout;
proxy_cache_lock on;
proxy_http_version 1.1;
proxy_pass http://mattermost;
}
}
但是,在你nginx已经开启了https的情况下,前面在mattermost配置文件里设置的https相关的配置全部还原,是的,就连SiteURL也可以不填
"SiteURL": "",
"ConnectionSecurity": "",
"TLSCertFile": "",
"TLSKeyFile": "",
"Forward80To443": false,
另外,由于用了nginx反代,我们需要把ListenAddress
修改一下,修改成只监听本地环回网卡
# 原(:8065表示监听所有网卡,用http+ip还是可以打开)
"ListenAddress": ":8065",
# 修改后(127.0.0.1:8065,表示只监听本地环回网卡,用http+ip就打不开了,相当于彻底禁止http方式访问)
"ListenAddress": "127.0.0.1:8065",
界面设置
界面是如下图这样的,现在输入你的邮箱、用户名、密码注册吧(第一个用户是超级管理员)
上图注册后,点“Go to System Console”可以到后台进行一些设置
其它的后面有时间再补吧,主要是安装部署已经写完了。