简介

Mattermost是一套开放源代码、可自行架设的在线聊天服务,有分享文件、搜索与集成其他服务等功能。它被设计成用于组织与公司的内部沟通,且主要将其作为Slack[6][7]Microsoft Teams的开放源代码替代品。使用Golang和React编写的,并且可与MySQL或PostgreSQL一起作为单个Linux二进制文件运行。

本文主要记录如何使用Docker私有化部署一个能在生产环境中使用的Mattermost,同时记录如何设置与使用mattermost

部署

首先新建一个项目目录用于存放数据,然后进入该项目目录

mkdir -p /opt/mattermost && cd /opt/mattermost

新建一个compose

vim docker-compose.yml

在里面填入如下配置

你可以在ports那一行的下方修改要暴露的web端口,默认为8065

version: '3.5'

services:
  postgres:
    container_name: postgres
    image: postgres
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    pids_limit: 100
    tmpfs:
      - /tmp
      - /var/run/postgresql
    env_file:
      - .env
    volumes:
      - ./volumes/db:/var/lib/postgresql/data
  mattermost:
    container_name: mattermost
    image: mattermost/mattermost-team-edition:latest
    restart: unless-stopped
    depends_on:
      - postgres
    security_opt:
      - no-new-privileges:true
    pids_limit: 200
    tmpfs:
      - /tmp
    env_file:
      - .env
    ports:
      - 127.0.0.1:8065:8065
    volumes:
      - ./volumes/app/mattermost/config:/mattermost/config:rw
      - ./volumes/app/mattermost/data:/mattermost/data:rw
      - ./volumes/app/mattermost/logs:/mattermost/logs:rw
      - ./volumes/app/mattermost/plugins:/mattermost/plugins:rw
      - ./volumes/app/mattermost/client/plugins:/mattermost/client/plugins:rw
      - ./volumes/app/mattermost/bleve-indexes:/mattermost/bleve-indexes:rw

然后新建一个.env文件,用于存放变量

设置你的数据库用户名以及密码替换掉imlala和password,另外用你的域名替换掉chat.example.com

POSTGRES_DB=mattermost
POSTGRES_USER=imlala
POSTGRES_PASSWORD=password
MM_SQLSETTINGS_DRIVERNAME=postgres
MM_SQLSETTINGS_DATASOURCE=postgres://imlala:password@postgres:5432/mattermost?sslmode=disable&connect_timeout=10
MM_BLEVESETTINGS_INDEXDIR=/mattermost/bleve-indexes
MM_SERVICESETTINGS_SITEURL=https://chat.example.com

创建项目所需要的目录并给予正确的权限

mkdir -p ./volumes/app/mattermost/{config,data,logs,plugins,client/plugins,bleve-indexes}
chown -R 2000:2000 ./volumes/app/mattermost

然后启动

docker-compose up -d

该容器默认在8065端口提供http服务,浏览器直接访问ip+8065或者nginx反向代理本地的8065端口。

我的反向代理配置文件如下

location /
   location ~ /api/v[0-9]+/(users/)?websocket$ {
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       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_http_version 1.1;
       proxy_pass http://127.0.0.1:8065;
   }
   location / {
       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_http_version 1.1;
       proxy_pass http://127.0.0.1:8065;
   }

运行效果

image-20220616110028748

使用教程

设置系统语言

设置当前界面语言

mattermost默认进来的界面是英文的,我们可以设置为中文的。

点击左上角的设置按钮

image-20220616122934246

显示->语言中选择中文即可

image-20220616123034529

设置默认语言

点击左上角进入系统控制台

image-20220616123252559

找到Localization,然后两个都选中中文即可

image-20220616130057339

配置邮件 smtp

通知设置

首先进入站点设置->通知,更改以下四个选项

image-20220616130254482

其中,通知显示名称将决定你的邮件的标题

通知邮件地址一定要和你的smtp邮箱一致,否则将导致邮件发送失败

剩下可以和邮箱地址一样。

配置smtp

找到环境->SMTP,将信息填入并保存,然后点击测试连接,如果不报错的话你的邮箱可以成功收到一个邮件。

image-20220616130333045

注意:已知使用qq邮箱发送注册邮件时会报错
报错与官方解释如下

550 Mail content denied
出错原因:该邮件内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件。
对于具有群发性质的邮件,如果出现用户普遍表示反感或集中投诉的情况,腾讯邮箱将禁止类似此邮件内容继续发送。
改善建议:如果您是此群发邮件的管理员,请停止群发对用户造成骚扰的广告及推广类邮件。
如果您是个人邮箱用户,请向您的电子邮件提供商报告此情况。

添加团队

Mattermost 既可以部署到单个团队,也可以部署到多个团队。目前,官方建议部署到单个团队,原因如下:

  • 单一团队部署促进了整个组织的沟通。当您添加多个团队时,组可能会变得孤立。
  • 我们尚不支持跨团队的搜索或渠道,这可能会影响跨团队的用户体验。这包括一般搜索、保存的帖子和最近的提及。
  • 集成(例如,webhook 和斜杠命令)仅在单个团队部署中保持不变。

但是,一些 Mattermost 客户更喜欢多团队部署,原因如下:

  • 当每个人都有一个目的时,团队是有用的。例如,一个团队用于员工,另一个团队用于外部用户。
  • 当用户分散在多个团队中而不是全部在同一个团队中时,性能会更好。对于多个团队,每个团队或频道切换加载的内容更少,并且数据库查询更快。
  • 为所有用户创建一个共享团队,并使用高级权限来控制谁可以创建频道并将成员添加到共享团队,在使用多个团队时改进了跨团队协作。此外,公告横幅可用于提供系统范围的公告。

创建方法

点击左上角的团队名称,点击创建团队按钮即可

添加/注册用户

mattermost不支持管理员在网页控制台手动添加和删除用户,但是可以通过命令行的方式添加与删除用户

官方文档:https://docs.mattermost.com/manage/command-line-tools.html

这里着重介绍如何邀请他人加入团队

点击左上角的加号->邀请成员,然后复制链接发给别人,或者自己再开个浏览器手动注册即可。

image-20220616130940413

开放注册

mattermost默认不开放注册,如果有路人进入你的mattermost网站,那么他是找不到注册按钮且无法注册的。

如果你想让任何访问你的站点的人都来注册,那么你可以在后台控制面板->注册->启用开放服务器选择,然后保存即可。

image-20220616130406955

要求邮箱验证

注册时,默认不需要验证邮件,即随便填写邮件都能注册成功,如果你不喜欢这样的话可以在后台更改

后台控制面板->电子邮件->需要电子邮件验证选择,然后保存即可。

image-20220616130548867

进阶设置

进入Docker容器内部执行命令

mattermost不支持bash,所以你需要使用如下命令来进入该容器控制台

docker exec -it mattermost sh

Config配置文件位置

/config/config.json

隔离不同团队间的用户

mattermost默认允许不同团队间的用户互相搜索并创建私聊,如果你对此不满意,可以修改配置文件并重启容器来实现。
官方相关文档:
image-20220617080820009
操作方法:
找到config.json中的RestrictDirectMessage,它的值默认为any,将其修改为team即可限制用户只能与他加入的团队的用户创建私聊。

禁止私聊

官方没有提供对该功能的支持,但是你可以通过安装插件来实现该功能。
首先要修改配置文件以支持手动上传插件
官方文档如下:
image-20220617081843478
操作步骤:
修改config.json中的PluginSettings->EnableUploads字段,使其值为True,然后重启mattermost即可开启上传插件功能

禁止私聊插件GitHub链接:
https://github.com/Brightscout/mattermost-plugin-disable-dm
下载并上传与启用该插件即可实现。
image-20220617082057375

笔者的使用体验

优点

这个系统初次使用体验很好,速度快资源占用少
支援专业而且好用的看板功能,适合个人和团队协调分配任务和规划时间。
image-20220621102742606
支援PlayBook功能,官方描述如下:

Mattermost Playbooks 是预先构建的、可配置的清单,它为团队定义了一个可重复的过程,以实现特定和可预测的结果。借助 Playbook,开发团队可以编排规定的工作流程,并定义、简化和记录复杂的重复性操作。Playbooks 通过集成的通信、协作和状态仪表板帮助您掌控整个工作流程生命周期。

缺点

但是mattermost的权限控制系统和管理系统跟RocketChat简直没法比,被RocketChat薄纱。

  • 无法创建只读频道(企业版功能)

比如你想设置一个只读的频道,专门用于发布公告,查阅文档后发现该功能是企业版独享的。
image-20220621102349249

  • 无法禁止私聊

想禁止私聊,查阅文档后却发现这项功能官方没有提供,你需要通过手动安装第三方插件来实现。

  • 无法在web控制台删除用户、群聊、团队

还有,mattermost居然无法在控制面板删除用户、群聊、和团队等,一旦创建只能归档或禁用,查阅官方文档后发现聊天记录和数据是可以删除,但是需要使用命令行来删。

  • 无法批量删除历史消息,无法设置数据保留策略(企业版功能)

另外,mattermost无法批量删除历史消息,无法设置历史消息自动删除。查阅文档后发现mattermost其实是有这类功能的,该功能名称为Data retention policy,即数据保留政策,但是这个功能是企业版独享的,免费版没法用。

批量删除历史消息和数据保留策略应该是一项最基本的功能,如果你的聊天系统打算长期投入使用的话,该功能必不可少,我认为把该功能放到企业版里是Unacceptable不可接受的
image-20220621101315784

总结

这个聊天系统(免费版)仅时候短期内在一个小团队使用,就算是付费的企业版我觉得用起来也是够呛,用户体验估计还可以,但是管理员的体验肯定不怎么好,因为它的管理系统太弱了。

笔者认为将 RocketChatmattermost两个聊天平台结合起来使用是一个办法。RocketChat用于日常使用,mattermost对于项目开发小组非常友好,两者长短可以互补。

RocketChat搭建教程:https://www.hash070.top/archives/rocketchat-docker.html

Q.E.D.