SlackクローンのMattermostを使ってみる - 導入、初期設定編-

> 「大人の事情でSlackとかHipChatは使えない」

って話、やっぱり多いみたいなので。世知辛いですね。

いろいろ試していたのですが長くなったので、とりあえず一回まとめてみました。
需要ありそうでしたら仕事探しのついでに、ちょこちょこ書いたりしていきたいなーと思います。

# Mattermostとは

[Mattermost](http://www.mattermost.org/)

<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/9ba635f9-86ba-c1a2-e1d3-96b0d67671a5.png" width="500px">

「GitHubに対するGitLab、そのSlack版」という説明が一番しっくりくるでしょうか。[^1]

SlackのOSSクローンというだけにとどまらず、"Slack-compatible, not Slack-limited" を目指して、Markdown記法やハッシュタグといった独自機能を取り入れたりもしている、なかなか挑戦的なプロダクトです。

技術的にはGo言語やReactを使ってるというあたりも興味深いですね。

# 導入

大きく以下の３パターンがあるかと思います。

## 1. 公式から提供されているDockerイメージを利用

[Download Mattermost | Mattermost](http://docs.mattermost.com/install/docker-local-machine.html#one-line-docker-install)
参考: Dockerで簡単にSlackライクなmattermostを動かしてみよう！ http://qiita.com/letusfly85/items/475c6cbdfbbce93c8795

触るだけならこれが一番簡単ですが、「大人の事情でSlackが使えない」という場合、「そもそもDockerを動かせるような環境がない」ということも多いかと思いますので…（濁った魚の眼で）

EC2のイメージなんかも提供されていますが…（以下略）

## 2. GitLabにバンドルされているMattermostを有効化して利用

[Download GitLab Community Edition (CE) | GitLab](https://about.gitlab.com/downloads/)

最近のGitLab(CE)にはこのMattermostがバンドルされているので、GitLabを導入し、`/etc/gitlab/gitlab.rb` からMattermost関連の設定を有効化、`$ gitlab-ctl reconfigure`するだけで使えるようになります。

しかし、この方法でMattermostを利用すると、GitLabとのシングルサインオン(GitLab-SSO)やアカウント登録のメール認証がデフォルトで有効にされているため、場合によってはやや使いづらいです。

GitLabの導入も同じタイミングでやってしまいたい、という事情があれば別ですが、GitLab自体も更新頻度が高いソフトウェアなので、変な依存関係を作ってしまうよりは、別々に運用したほうがいいかな、と思います。

## 3. Mattermost単体でインストール

結局、一番シンプルで簡単なのはこの方法でした。
[Production Install on RHEL 7.1+ — Mattermost 2.0 documentation](http://docs.mattermost.com/install/prod-rhel-7.html)

手順書が長くて敬遠していたのですが、実際やってみると特に難しいこともなく。
手順書ではPostgresql 9.4を利用していますが、[MySQL 5.6にするのも特に難しくないみたいなので](http://qiita.com/st_1t/items/e9efebe7aa7be8d57863)、この辺も柔軟に対応できていい感じだと思います。

一緒にGitLabの導入を検討している場合でも、とりあえずは単体で導入してMattermost自体の仕組みに慣れてから、必要に応じてGitLabと連携させる、というのがおすすめです。[^2]

# インストール(CentOS 7.2)

Windows環境などでも試しやすいように、Vagrant用のスクリプトにまとめました。

[terukizm/mattermost-vagrant: Mattermost Sample for Vagrant (VirtualBox + CentOS 7.2.x)](https://github.com/terukizm/mattermost-vagrant)

`$ vagrant up`するとCentOS 7.2の仮想マシンが作られ、プロビジョニング用のスクリプト(setup.sh)が流れます。
一通りの処理が終わったら、最後に出てくるURLにアクセスしてください。

## 手順書からの変更点

基本的には公式ドキュメントの通りですが、若干手を加えてあります。 
[Production Install on RHEL 7.1+ — Mattermost 2.0 documentation](http://docs.mattermost.com/install/prod-rhel-7.html)

* システム構成
    * mattermost(8065)、nginx(80)、postgresql(5432)は、すべて相乗りとする
    * SMTPは設定しない(あとからWebGUI経由で設定できるし、なくても動くため)
    * letsencryptは設定しない(内部利用の想定とし、httpsは利用しない)
* postgresql
    * `127.0.0.1/32`で接続するように設定を変更
    *  `systemctl reload postgresql-9.4.service` だとconfへの変更が反映されなかったので`systemctl restart`に変更
    *  (`initdb`する部分でマルチバイト対応の文字コード指定が必要では？と思ったが、手順書の通りで問題なかった)
* nginx
    * `proxy_pass`のアドレスは`localhost`に変更
    * 手順中の`chkconfig`とかを`systemctl`に統一

`\orig`ディレクトリ中に修正前の設定ファイルを置いてあるので、適宜diffを取っていただければわかりやすいかなと思います。

# 使い方

基本的には本家と同じ（色んな意味で）なのですが、簡単に。

## 初期設定

TOPページにアクセスすると、まずメールアドレスの入力を求められます。
このメールアドレスでAdminユーザ権限のアカウントが作成されるので、入力内容を確認して次へ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/bb26ba29-66c4-828d-4cae-7105b309cef2.png" width="500px">

MattermostではメールアドレスがログインIDになりますが（アカウント名でログインする設定も可能）、初期状態ではメールアドレスの正当性確認は行わないので、有効なメールアドレスでなくても大丈夫です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/1efbc8bf-8f20-3716-f1bc-da21683f3112.png" width="500px">

続いてチーム名を入力。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/9f8ec7e6-d3ae-32e5-1548-49ee3234d3c4.png" width="500px">

"http://example.com/チーム名"  がURLになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/e78d5a4f-a4c9-12b3-730d-7acc4ed952d7.png" width="500px">


管理者ユーザのアカウント名／パスワードを入力。(ここでは "root")
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/a4be7b69-e773-3d9f-cf6d-a3c29ca24573.png" width="500px">
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/301b1d66-c2b9-d2c5-9765-b3f1baf0762e.png" width="500px">

最後にこんな画面が出れば完了です。
Slackと同じく簡単なチュートリアルがあるので、やってみるのもよいかもしれません。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/f7e6a616-dee5-c60c-b508-eecaead96e0b.png" width="500px">

なお、アップロードファイルなどは`${mattermost_home}/data/`に保存されますが、Amazon S3に永続化することもできるようです。(「System Console」→「File Settings」)

## 管理者メニュー

ユーザを追加する場合、招待用のURLから登録してもらうのが楽だと思います。(「Get Team Invite Link」)
後述のSMTP設定がしてあれば、指定したメールアドレスに対して登録用メールを送信することもできます。(「Invite New Member」)
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/9bdd3cbf-532f-165a-d9b1-6a0ec1bba8b5.png" width="500px">

「Manage Members」からはユーザに対してSystem Admin/Team Adminといったロール設定ができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/e0579fa4-9bf4-676a-2a64-a77575e00a28.png" width="500px">

おそらくメインで使うのはこの辺りになるかと思います。

## SMTP設定

「System Console」→「Email Setting」からSMTP設定を行うことができます。
メンションやDMに対するメール通知、登録時のメールアドレスの正当性確認などを行いたい場合は必要になります。

こちらは、たまたま手元にあったlolipopのメールアカウントでの設定サンプルです。
SMTP送信に利用するメールアカウントで、正しく認証が行えるように設定してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/94ffd63e-1c82-ec31-846e-546492d1af4d.png" width="500px">

### Gmailの場合

Gmailアカウントを利用する場合の設定例です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/d9619c5c-e2d5-7417-743e-42e553d985c0.png" width="500px">

なお、送信用にGmailを利用する場合、Gmailアカウントで以下の設定を行う必要があります。
セキュリティ的にはあまりよろしくないので、必要なら別途送信用のアカウントを取得するなどしてください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/d3d32e8f-54df-c865-914b-f75620eb648c.png" width="500px">


# 触ってみた印象

僕もSlackをそこまで使い込んでいたわけではないので、参考程度に…

## Good!!

### :+1: WebGUI、日本語対応が素晴らしい

基本的に本家とほぼ同じUIで、再現度が非常に高いです。（高すぎて逆に不安になるくらい…というか怒られないんですかねこれ…）
<img src="https://qiita-image-store.s3.amazonaws.com/0/50184/16cee06b-883a-d294-9748-34f0f66b5413.png" width="700px">

一通りさわってみましたが文字化け等もありませんでした。スマホからの絵文字入力(utf8mb4のやつ)なども正しく表示されています。

また、Markdown書式にも対応しているため、非常に表現力が豊かです。[Messaging Basics — Mattermost 2.0 documentation](http://docs.mattermost.com/help/getting-started/messaging-basics.html)



### :+1: 機能の再現度が高い

v2.0.0リリース時点で、以下の機能が確認できました。Slackの主要な機能はほぼ網羅している、といってもよいのではないでしょうか。

* 機能
  * Mention
  * Reply
  * Direct Message
  * Private Group
* UI/UX
  * デスクトップ通知(Web Notifications API)
  * キーボード入力中の通知、改行(Shift-Enter)
  * ファイル添付
  * [絵文字](http://www.emoji-cheat-sheet.com/)
  * 発言へのリンク取得
  * 発言の取り消し（削除）
* 外部連携
  * WebHook[^3]
  * Hubot[^4]
  * Slash Command (カスタマイズ可能)

もちろんないものもありますが、今後に期待ですかね…？

* お気に入り機能
* カスタム絵文字(:vim:で秀丸のアイコンが出るようにしたりするやつ)
* URLのサムネイル表示、自動展開

### :+1: ネイティブクライアントが揃っている

iOS（公式）、Android（公式）が既にリリースされています。
[Community Applications | Mattermost](http://www.mattermost.org/community-applications/#native)

<img width="375" alt="IMG_2415.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/50184/db60f68d-d48d-74fb-369f-79f188a37321.png">

@yuya-ocさんによるelectron製のデスクトップアプリ(Win/Mac/Linux)もあり、こちらも良い感じで動きます。
[yuya-oc/electron-mattermost: Electron-based desktop application for Mattermost (https://github.com/mattermost/platform)](https://github.com/yuya-oc/electron-mattermost)


## Bad...

とまあ良い所ばかり挙げたんですが、もちろん微妙な部分も…

### :-1: 発言履歴検索が部分一致に対応していない（完全一致のみ）

こちらの記事によると結構前からみたいですね。
参考: Mattermost の検索機能 http://qiita.com/usutani/items/36777c14502c80f86336

> 追記しました。→ [日本語全文検索暫定対応](http://qiita.com/terukizm/items/b477943b63c66ab7d454)

「Slackの無料プランだとログが流れてしまうから…」という大人の事情パターンの場合には、やや使いづらいかもしれません。[^5]

### :-1: ネイティブアプリのPush通知がハードル高そう

機能としては提供されているみたいですが、簡単には使えなさそうでした。
[Configuration Settings — Mattermost 2.0 documentation](http://docs.mattermost.com/administration/config-settings.html#push-notification-settings)

「社内でだけ使うので問題ない」と割り切れれば良いのですが…

### :-1: ローカライゼーションは日本語非対応

[Localization — Mattermost 2.0 documentation](http://docs.mattermost.com/developer/localization.html) 
OSSなので英語得意な方、是非とも…

### :-1: ブラウザキャッシュへの反映が遅れる

条件などよくわからないのですが、アイコンを変更したりした場合に反映されなかったりする場合があります。
ログアウトしても反映されなかったりするので、おそらくクライアント側でのキャッシュ削除がうまくいってなかったりするのかなと思うんですが、よくわかりませんでした。

そのうち改善されるといいなあ…

### :-1: 全体的に情報が少ない

みんな人柱になりましょう！！

# というわけで

「Slackを導入したいけど大人の事情で…」とくすぶっている方は、是非一度、試してみてください。

ご参考になれば幸いです。

[^1]: 良い言い方でないのは百も承知なのですが、「貧者のSlack」という表現が頭から離れませんでした…
[^2]: 「System Console」→「GitLab Settings」で後からGitLab-SSO設定もできるみたいです。大変そうですけど…
[^3]: SlackのIncoming/Outgoing WebHookに相当するもので、一応動作確認はできたのですが、正直使いづらかったです。BKの塊みたいになりそうなので、ChatOpsみたいなことをやりたいのでしたら正直あまりオススメできないです…
[^4]: [hubot-mattermost](https://www.npmjs.com/package/hubot-mattermost)があるのですが、一部の機能しか動作確認ができませんでした。最終更新が２か月前なので、もしかしたらv2.0.x系に対応してないのかもしれません。比較的新しい類似プロダクトに[hubot-matteruser](https://www.npmjs.com/package/hubot-matteruser)があるのですが、こちらはhttpsオンリーということで動作確認できませんでした。今後の課題です…
[^5]: 履歴を残す意味が「言った言わないの防止」だけでしたらRDBMSにSQL投げれば用は足りるのかもしれません。RDBMSをMySQLにしてmysqldumpするみたいな荒業もありますし、工夫次第ではいろいろできそうです。SlackへのInport/Export機能も実装予定みたいですが…


## Tips(おまけ)

* アニメーションGifはファイル添付しても再生されませんが、Markdown書式でurlへのリンクを貼り付けると動きます。
    * サムネイル表示とかも見え方が微妙だったりするので、Markdown書式メインの方が見やすくてよいかもしれません。
* 「Account Settings」→「Advanced」→「Preview pre-release feature」でβ版の機能が有効になります。
    * Markdown Previewとかあるようです。うまく動きませんでしたが…
* 「Account Settings」→「Display Settings」から"Import theme colors from Slack"というのがあります。
    * 色合い合わせるとどこまでそっくりになってしまうのか、ちょっと気になるところです。 
* ${mattermost_home}/web/static/images 以下に静的ファイルがあってたのしい
    * bing.mp3をサーバ側で置き換えたら通知テロできるのかな？って思ったのですが、現状ではそういうふうにはなってないっぽいです。残念。
        * (→追記)キャッシュが効いてただけっぽくて久しぶりに開いたら反映されました。変なmp3に置き換えるのは絶対やめようね。絶対だぞ！！
* Hubot連携についても簡単にまとめました。あわせてどうぞ。
    *  [Hubot連携編](http://qiita.com/terukizm/items/4524249dd7f1298fdc06)