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

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

Mattermost简介

在此之前,我写过一篇:CentOS7使用RocketChat自建即时聊天服务器

其实mattermost跟rocketchat非常像,而且更方便,因为它支持mysql(而一般有个人服务器的同学,都会搞个小网站,mysql肯定已经安装了,所以更方便部署,不想rocketchat还要额外安装mongodb)

Mattermost是一款类似slack的,go语言编写的开源(github)即时聊天服务器。至于slack是什么,你可以去这里看一下。

安装Mattermost

这是官方安装文档,以下是我自己总结优化的步骤。

官网找到最新版本下载链接(如下图)
15985415750746.jpg

使用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”(不会搜?看这里),这是数据库的配置,你可以看到它下边有DriverNameDataSource

"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或域名:端口)/数据库名

我数据库帐号和密码是root123456,而且是在本地(即与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",

界面设置

界面是如下图这样的,现在输入你的邮箱、用户名、密码注册吧(第一个用户是超级管理员)
-w854

上图注册后,点“Go to System Console”可以到后台进行一些设置
-w566

其它的后面有时间再补吧,主要是安装部署已经写完了。

打赏
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

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