メールやIRC、Skypeといったコミュニケーションツールに変わって、最近急速に利用者を増やしているのがSlackに代表されるチャット型コミュニケーションツールだ。今回はオープンソースで公開されているSlack風コミュニケーションツール「Rocket.Chat」および「Mattermost」を紹介する。

Twitterのような気軽にコミュニケーションを取れるツールを開発現場へ

ソフトウェア開発の現場で利用されているコミュニケーションツールとしては、電子メールがもっともメジャーだろう。電子メールは低コストでさまざまな環境で利用でき、テキストだけでなくファイルを添付することも可能だ。また、電子メールを使ったことがないという人は少数であるため、利用するにあたっての学習コストが低い点もメリットだ。

しかし、電子メールでのコミュニケーションは内容が冗長になりやすいというデメリットもある。そのため、大量のメールが飛び交うような環境ではそれらに目を通すだけでも大変だ。また、状況によってはメールを送信してから送信先に届くまでに時間がかかる場合がある。そのため、リアルタイム性が求められる場合には使いにくい。

いっぽう、ソフトウェア開発者の間で古くから使われているコミュニケーションツールとしてIRC(Internet Relay Chat)がある。IRCはいわゆるテキストチャットツールであり、ほぼリアルタイムでやり取りができる点が特徴だ。長文のやり取りには向いていないが、その分気軽に投稿できるというメリットもある。

IRCは現在でも多くの利用者がいるものの、チャットルームやユーザーの管理機能が貧弱であり、管理が難しいというデメリットがあった。いっぽう、2000年代半ばから普及し始めたSNSはオンラインで他人と容易にコミュニケーションを取れるシステムを提供しており、このようなシステムをビジネスの現場向けに提供する「Yammar」や「HipChat」といったサービスが登場し始めた。また近年では、「Slack」が使い勝手の良さから人気を博すようになり、これらツールを導入する企業が増えている(図1)。

図1 Slackのメイン画面
図1 Slackのメイン画面

YammerやHipChat、Slackといった新しいコミュニケーションツールの特徴は、ユーザーはTwitterやFacebookなどのSNSと同じような感覚で利用できるため導入コストが低く、さらに利用者やチャットルームの管理が用意である点だ。

また、これらツールは検索機能にも注力されており、過去の投稿アーカイブから必要な情報を見つけやすくなっている。外部ツールとの連携機能も充実しており、監視ツールやビルドツールと連携させ、アラートや各種通知をチャットルーム内に自動投稿させる、という使い方も増えている。

オンプレミスでSlackと同様のサービスを構築できるオープンソースソフトウェア

現在、このようなチャット型のコミュニケーションツールでもっとも有名なのがSlackだろう。Slackはいわゆる「SaaS(Software as a Service)」型のクラウドサービスとして提供されているため、管理の手間が少なく簡単に導入できる。ただし、これらは商用サービスとして提供されており、フル機能を利用しようとすると一定のコストが必要となる。無料で利用することも可能だが、その場合機能制限が加えられることとなる。また、クラウドサービスの場合投稿内容はすべてサービス提供側が管理するサーバー内に保管されることになる。これらが漏洩する可能性は低いとは思われるが、開発プロジェクト内でのやり取りが外部に保存されるのを好ましく思わないユーザーもいるだろう。業務の現場ではセキュリティ対策の観点から外部に情報を持ち出すことやインターネットへのアクセスが制限されている場合があり、そういった環境では利用が難しいという問題もある。

そういったケースに向け、自分達で管理しているサーバー内で同様のサービスを提供できる、オンプレミス向けのコミュニケーションツールも登場している。今回はこのようなオンプレミス型のコミュニケーションツールのうち、オープンソースで公開されており評価も高い「Rocket.chat」および「Mattermost」を紹介する。

「Rocket.Chat」を使ってみる

まずRocket.Chatだが、こちらは「究極のオープンソースWebチャットプラットフォーム」を謳ったチャットツールだ(図2)。

図2 Rocket.Chatのメイン画面
図2 Rocket.Chatのメイン画面

基本機能はほぼSlackと同様で、UIも似ている。また、WebブラウザだけでなくiOS/AndroidアプリやWindows/Mac OS X/Linux向けのデスクトップクライアントも提供されている点もSlackと近い。さらに音声/ビデオチャット機能やファイル共有機能、画面共有機能も備えている。

実装言語はNode.jsで、データベースにはMongoDBを採用。また、アプリケーションフレームワークにはMeteorが使われている。そのため、これらの技術に関する知識があればカスタマイズしやすい。

Rocket.Chatのインストール

Rocket.Chatのインストールについては詳しいドキュメントが公開されているが、今回はCentOS 7でのインストール方法を紹介する。

Rocket.Chatでは、前述のとおりMongoDBおよびNode.jsを使用しているため、まずこれらのインストールが必要だ。また、curlやGraphicsMagicも必要となる。これらの一部はCentOSの標準パッケージとしては提供されていないが、EPELというパッケージリポジトリを利用すれば容易に導入が可能だ。もしEPELを利用していない場合、下記のようにしてリポジトリを追加できる。

# rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

EPELを利用できる状態になったら、yumコマンドで下記のように必要なパッケージをインストールする。

# yum install --enablerepo=epel mongodb-server nodejs npm curl GraphicsMagick

依存するツールやライブラリのインストールが完了したら、続いてRocket.Chat本体のインストールを行う。まず、Rocket.Chatのダウンロードページに掲載されているダウンロードURL(https://rocket.chat/releases/latest/download)から以下のように最新の安定版リリースアーカイブをダウンロードする。

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

ダウンロードしたアーカイブでは「bundle」というディレクトリ内にソースコードやライブラリ一式が含まれているので、アーカイブの展開後、このディレクトリを適当なディレクトリに移動する。今回は「/opt/rocket.chat」という名前にリネームした。

# tar xvzf rocket.chat.tgz
# mkdir /opt
# mv bundle /opt/rocket.chat

続いて、npmコマンドを使って依存する外部ライブラリをインストールする。

# cd /opt/rocket.chat/programs/server/
# npm install

また、今回はRocket.Chatを「rocketchat」というユーザー/グループで実行することにする。まず「rocketchat」ユーザーおよびグループを作成し、Rocket.Chatのディレクトリ内のファイル/ディレクトリの所有者をこのユーザー/グループに変更する。

# useradd -r rocketchat -U
# chown -R rocketchat:rocketchat  /opt/rocket.chat

以上でインストール作業は完了だ。続いて、Systemdを使ってRocket.Chatをサービスとして実行できるよう設定ファイルを用意する。まず、「/etc/rocket.chat」というディレクトリを作成し、ここに「rocketchat.env」という名前で設定ファイルを作成する。

# mkdir /etc/rocket.chat
# touch /etc/rocket.chat/rocketchat.env

/etc/rocket.chat/rocketchat.envファイルの中身は以下のようになる。

MONGO_URL=mongodb://localhost:27017/rocketchat
ROOT_URL=http://<ホストのIPアドレス>:3000/
PORT=3000

続いて、Systemdの設定ファイル「/etc/systemd/system/rocketchat.service」を作成する。

# touch /etc/systemd/system/rocketchat.service

このファイルの中身は次のようになる。

[Unit]
Description=Rocket.Chat Server
After=network-online.target mongod.target
Requires=network-online.target

[Service]
ExecStart=/usr/bin/node /opt/rocket.chat/main.js
EnvironmentFile=/etc/rocket.chat/rocketchat.env
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat

[Install]
WantedBy=multi-user.target

最後にsystemctlコマンドで設定を反映させ、MongoDBおよびRocket.Chatを起動させる。

# systemctl daemon-reload
# systemctl start mongod
# systemctl start rocketchat

作業後、「systemctl status」コマンドで正しくサービスが起動できているかを確認しておこう。

# systemctl status rocketchat
● rocketchat.service - Rocket.Chat Server
   Loaded: loaded (/etc/systemd/system/rocketchat.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2016-08-30 20:21:49 JST; 3s ago
 Main PID: 26448 (node)
   Memory: 100.0M
   CGroup: /system.slice/rocketchat.service
           mq26448 /usr/bin/node /opt/rocket.chat/main.js

 8月 30 20:21:49 centos10 systemd[1]: Started Rocket.Chat Server.
 8月 30 20:21:49 centos10 systemd[1]: Starting Rocket.Chat Server...

また、今回使用する3000番ポートにアクセスできるようファイアウォールの設定も行っておく。たとえばfirewalldを利用している場合、下記で一時的に3000番ポートを有効にできる。

# firewall-cmd --add-port 3000/tcp

Rocket.Chatのユーザー登録とログイン、各種設定

Rocket.Chatの起動後、「http://<ホスト名もしくはIPアドレス>:3000」にアクセスすると、図3のようなログイン画面が表示される。ここで「新しいアカウントを登録」をクリックし、メールアドレスおよびパスワード、ユーザー名を登録するとRocket.Chatのホーム画面が表示される(図4、5、6)。

図3 Rocket.Chatのログイン画面
図3 Rocket.Chatのログイン画面
図4 メールアドレスおよびパスワードの入力画面
図4 メールアドレスおよびパスワードの入力画面
図5 ユーザー名の登録画面
図5 ユーザー名の登録画面
図6 Rocket.Chatのホーム画面
図6 Rocket.Chatのホーム画面

ここで最初に作られたユーザーに対し自動的に管理者権限が与えられる仕組みなので、サービスを起動したらすぐにユーザーを作成しておこう。また、ユーザー名はいわゆる「メンション」(ほかのユーザーがそのユーザーに対しての投稿)の際に「@<ユーザー名>」という形で使われるので、簡潔なものにしておくことをおすすめする。

チャット画面(チャンネル)のレイアウトはSlackと同様、画面下に投稿するテキストを入力するボックスがあるレイアウトとなっている。また、画面左側の「チャンネル」横にある「+」をクリックするとチャンネルの新規作成が、「ダイレクトメッセージ」横の「+」をクリックするとほかのユーザーへのダイレクトメッセージを作成できる。指定されたユーザーのみが閲覧できるプライベートチャンネルを作成することも可能だ。

ユーザー名横の「∨」をクリックすると、「オンライン」や「離席中」といったステータスを変更できる。また、ここからアカウントの設定画面や、管理者であれば管理画面を開くことも可能だ(図7)。

図7 ユーザー名横のドロップダウンメニューでステータス設定や設定/管理画面へのアクセスが行える
図7 ユーザー名横のドロップダウンメニューでステータス設定や設定/管理画面へのアクセスが行える

アカウント設定では通知や表示方式などを設定できるほか、プロフィールや登録メールアドレス、アバターなどの変更なども行える(図8)。

図8 ユーザー設定を行う「マイアカウント」画面
図8 ユーザー設定を行う「マイアカウント」画面

一方管理画面では、各ユーザーの権限設定や、HipChat/Slackのデータのインポート、サービス連携、ログ表示、各種機能の管理などの設定が可能になっている(図9)。

図9 システムやユーザーの設定を行える「管理」画面
図9 システムやユーザーの設定を行える「管理」画面

「Mattermost」を使ってみる

続いて、Mattermostについて紹介しよう。こちらは、「セルフホスティング式のSlack代替」を謳っており、より強くSlackを意識しているようだ。Slackの機能をほぼすべて備えており、さらにSlackと一部互換性のあるWebフック機能を提供している(図10)。

図10 Mattermostのホーム画面
図10 Mattermostのホーム画面

また、Rocket.Chatと同様、WebブラウザからだけでなくiOS/AndroidアプリやWindows/Mac OS X/Linux向けデスクトップクライアントも提供されている。そのほか、Slackはチーム毎にアカウント作成が必要だったが、Mattermostでは1ユーザーを複数のチームに所属させることができたり、Markdownによるフォーマッティング、チャネル名に英語以外の言語を利用可能、シンタックスハイライティングなど、非常に多くの機能を備えているのも特徴だ。

なお、MattermostはGo言語で実装されており、データベースにはMySQL(および互換データベースであるMariaDB)もしくはPostgreSQLが利用できる。ただし、MySQL/MariaDBの場合はFULLTEXTインデックスを利用するため、MySQL 5.6.4以上もしくはMariaDB 10.0.5以上が必要となる。CentOS 7の場合、現時点ではこれらは公式パッケージとしては用意されていないが、MariaDBの公式パッケージを利用すれば容易に入手が可能だ。

Mattermostのインストール

今回はCentOS 7へのインストールについて紹介する。これ以外の管球へのインストールについては、Rocket.Chatと同様、Mattermostの公式ドキュメントを参照して欲しい。

まず、MariaDBの最新版を利用するためにMariaDBの公式リポジトリを利用できるよう、/etc/yum.repos.d/mariadb.repoという設定ファイルを作成する。

# touch /etc/yum.repos.d/mariadb.repo

設定ファイルの中身は次のようになる。

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

次に、yumコマンドでMariaDBの最新安定版をインストールする。なお、すでにCentOSの公式パッケージでMariaDBをインストールしている場合はいったんMariaDBを停止させておく必要がある。

# systemctl stop mariadb ←MariaDBがすでにインストールされている場合、いったんmariadbサービスを停止させておく
# yum install --enablerepo=mariadb MariaDB-server MariaDB-client
# systemctl start mariadb

続いて、適当なディレクトリに以下のような「create_db.sql」ファイルを作成する。

# touch create_db.sql

このファイルには、データベースを作成するための次のようなSQLを記述する。なお、「mmuser_password」の部分は適当なパスワードに置き換えて欲しい。

CREATE DATABASE mattermost;
CREATE USER 'mmuser'@'localhost' IDENTIFIED BY 'mmuser_password';
GRANT ALL PRIVILEGES ON mattermost.* TO 'mmuser'@'localhost' IDENTIFIED BY 'mmuser_password';
FLUSH PRIVILEGES

ファイルを作成したら、mysqlコマンドを使ってこのSQLを実行し、データベースおよびユーザーを作成する。

# mysql -u root < create_db.sql

続いて、Mattermost本体のインストールを行う。Mattermost最新版の配布アーカイブ入手URLはダウンロードページに掲載されているので、このURLをコピーし、インストールするサーバーにダウンロードする。

# curl -o mattermost-team-3.3.0-linux-amd64.tar.gz https://releases.mattermost.com/3.3.0/mattermost-team-3.3.0-lin
ux-amd64.tar.gz

ダウンロードしたパッケージを展開すると「mattermost」というディレクトリが作成されるので、これを適当なディレクトリに移動する。今回は/opt/ディレクトリ以下に移動した。

# tar xvzf mattermost-team-3.3.0-linux-amd64.tar.gz
# mkdir /opt
# mv mattermost /opt/

続いて、データ保存先ディレクトリ(/opt/mattermost/data)の作成と、設定ファイル(/opt/mattermost/config/config.json)の編集を行う。

# mkdir -p /opt/mattermost/data

/opt/mattermost/config/config.json内には多くの設定内容が記されているが、ここではデータベース設定のみを環境に応じて修正しておく。下記の「SqlSettings」部分がデータベース設定となっているので、「DriverName」が「mysql」になっていることを確認し、「DataSource」を「”mmuser:<mmuserのパスワード>@localhost:3306/mattermost?charset=utf8mb4,utf8″」と設定する。データベースとしてlocalhost以外を使用する場合は「localhost」の部分を変更すれば良い。

    "SqlSettings": {
        "DriverName": "mysql",
        "DataSource": "mmuser:mmuser_password@localhost:3306/mattermost?charset=utf8mb4,utf8",
        "DataSourceReplicas": [],
        "MaxIdleConns": 10,
        "MaxOpenConns": 10,
        "Trace": false,
        "AtRestEncryptKey": "7rAh6iwQCkV4cA1Gsg3fgGOXJAQ43QVg"
    },
    "LogSettings"

また、今回はMattermostを「mattermost」というユーザーで実行するので、useraddコマンドでこのユーザーを作成し、各種ファイル/ディレクトリのパーミッションを変更しておく。

# useradd -r mattermost -U
# chown -R mattermost:mattermost /opt/mattermost

以上でインストール作業は完了だ。続いてSystemdでMattermostサービスを管理するための設定ファイル(/etc/systemd/system/mattermost.service)を用意する。

# touch /etc/systemd/system/mattermost.service

ファイルの中身は下記のようになる。

[Unit]
After=network-online.target
Description=mattermost server
Requires=network-online.target rsyslog.service mariadb.service

[Service]
WorkingDirectory=/opt/mattermost/bin
User=mattermost
ExecStart=/opt/mattermost/bin/platform
PIDFile=/var/spool/mattermost/pid/master.pid
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mattermost

[Install]
WantedBy=multi-user.target

最後にsystemctlコマンドで設定の反映とmattermostサービスの実行を行う。

# systemctl daemon-reload
# systemctl start mattermost

「systemctl status」コマンドで正しくサービスが稼動しているかどうかも確認しておこう。

# systemctl status mattermost
 ● mattermost.service - mattermost server
   Loaded: loaded (/etc/systemd/system/mattermost.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2016-08-30 20:42:08 JST; 2s ago
 Main PID: 25733 (platform)
   Memory: 10.6M
   CGroup: /system.slice/mattermost.service
           mq25733 /opt/mattermost/bin/platform
  
  

最後に、今回使用する8065番ポートにアクセスできるようファイアウォールの設定も行っておく。

# firewall-cmd --add-port 8065/tcp

Mattermostのユーザー登録およびシステム管理

Mattermostの起動後、「http://<Mattermostが稼動しているサーバーのホスト名もしくはIPアドレス>:8065/」というURLにアクセスすると、アカウント作成画面が表示される。ここで管理者として使用するユーザーのメールアドレスおよびユーザー名、パスワードを設定し、「Create Account」をクリックすると管理者ユーザーが作成される(図11)。

図11 Mattermostのアカウント作成画面
図11 Mattermostのアカウント作成画面

続いてチームの選択画面が表示されるが、初期状態ではチームが作成されていないため、なにも候補は表示されない(図12)。チームを作成するには「Create a new team」を、そのまま管理画面を表示させるには「Go to System Console」をクリックする。

図12 Mattermostのチーム選択画面
図12 Mattermostのチーム選択画面

チームの作成画面では、チーム名およびチームのURLを入力する(図13、14)。チーム名にはアルファベットだけでなく任意の文字が利用可能だが、チームのURLにはアルファベット小文字および数字、奪取のみが利用可能となっている。また、一部の単語は予約されていて使えない(この設定は管理画面から変更可能)。

図13 チーム作成画面。まずチーム名を指定する
図13 チーム作成画面。まずチーム名を指定する
図14 続いてチームのURLを指定する
図14 続いてチームのURLを指定する

なお、筆者の環境ではFirefoxでチームのURLを設定できない(どんな文字を入力してもそのURLは使用不可能という旨が表示される)トラブルがあったが、Google Chromeで設定を行ったところ問題なく設定が行えた。

Mattermostの初回ログイン時には簡単なチュートリアルが表示される(図15)。

図15 Mattermostへの初回ログイン時には簡単なチュートリアルが表示される
図15 Mattermostへの初回ログイン時には簡単なチュートリアルが表示される

また、チャット画面はこちらもSlackと同様、画面下にテキストボックスが表示される形になっている。もちろんプライベートグループやダイレクトメッセージの作成も可能だ(図16)。

図16 Mattermostのチャット画面
図16 Mattermostのチャット画面

画面左側のユーザー名横にある「⋮」をクリックすると、各種メニューが表示される。ここで、「Account Settings」をクリックすると「Account Settings」画面が表示される。ここではアカウント名やメールアドレスの設定、セキュリティ設定、通知設定のほか、表示をカスタマイズすることも可能だ(図17)。

図17 ユーザー名横にある「⋮」をクリックすると、各種メニューが表示される
図17 ユーザー名横にある「⋮」をクリックすると、各種メニューが表示される

また、「Display」内の「Language」で「日本語(Beta)」を選択することで、ユーザーインターフェイスを日本語化できる(図18)。

図18 メニュー内の「Account Settings」をクリックし、「Account Settings」画面で「Display」をクリックすると言語設定を行える
図18 メニュー内の「Account Settings」をクリックし、「Account Settings」画面で「Display」をクリックすると言語設定を行える

日本語ユーザーインターフェイスはまだベータ段階とのことだが多くの部分が日本語化されており、十分に実用的という雰囲気だ(図19)。

図19 日本語化されたユーザーインターフェイス
図19 日本語化されたユーザーインターフェイス

メニューの「System Console(システムコンソール)」をクリックすると管理画面(システムコンソール)が表示される(図20)。ここではユーザーやチームに関する制限を設定したり、各種通知機能や統合機能などの設定、カスタマイズなどが行えるようになっている。

図20 各種設定を行うシステムコンソール
図20 各種設定を行うシステムコンソール

なお、MattermostではルートURL(http://<ホスト名>:8065/)にアクセスしても新規ユーザー登録画面へのリンクは用意されておらず、メニューの「新しいメンバーを招待」からユーザーを個別に招待するか、「チーム招待リンクを入手」で表示される招待用URLを使用する必要がある(図21)。

図21 メニューの「チーム招待リンクを入手」をクリックすると、招待用のURLが表示される
図21 メニューの「チーム招待リンクを入手」をクリックすると、招待用のURLが表示される

機能的にはどちらも十分、開発現場以外での利用も可能

さて、今回紹介したRocket.ChatとMattermostだが、どちらも現段階で十分実用的と感じた。Rocket.Chatは初期設定で日本語ユーザーインターフェイスが利用できるが、Mattermostの日本語ユーザーインターフェイスもベータ版とはいえ必要十分なものになっている。

また、どちらもSlackからユーザーやチャット履歴、設定などをインポートする機能も備えている。そのため、すでにSlackを利用している場合でも比較的容易に移行できるだろう。

また、Rocket.ChatもMattermostのどちらもユーザーインターフェイスが十分に洗練されているため、開発者以外のユーザーでも使いやすい。開発者だけでなく、一般的な会社内のコミュニケーションや、それ以外のグループなどの連絡ツールとしても活用できそうだ。