招待操作不要の Slack っぽいチャットシステム「Rocket.Chat」の導入 (CentOS 7.2)

## Slack をオープンに使いたい
エンジニアからの評価の高いチャットシステムとして [Slack](https://slack.com/) がありますが、Slack へのユーザ追加は招待方式なので、あれはクローズドに運用するのが本来のスタイルです。

が、なかなか評判の良いシステムなので、これをオープンコミュニティでも使いたい。そのために [Slackin](https://github.com/rauchg/slackin) や [Slack Invite Automation](https://github.com/outsideris/slack-invite-automation) 等を用いて自動招待システムを組んで使われているのをよく見ます。

自動招待システムを組むのは悪くない選択ですが、他の選択肢として、招待操作を必要としない Slack クローンである [Rocket.Chat](https://rocket.chat/) を導入するという選択があります。

## Rocket.Chat
[Rocket.Chat](https://github.com/RocketChat/Rocket.Chat) はオープンソースで提供されており、様々なプラットフォームに自由に設置できます。

また、自分でサーバ設置を行わなくても、[デモサイト](https://demo.rocket.chat/) を用いて機能を確認することができますし、僕が少し使った経験上では実際のチャットをデモサイト上で行うのもそれほど悪くありません。

しかしデモはデモに違いないので、データがいつクリアされるかも分かりませんし、ちゃんと自分のサーバを用意して設置するのが本来の使い方です。今回は CentOS 上に Rocket.Chat を設置してみました。

## 今回設置したチャット
以下 URL でアクセスできます。特に用途は限定していませんが、僕が主催する勉強会イベント等で主に利用していくつもりです。

- https://chat.clock-up.jp/

## 前提環境
今回は CentOS 7.2 上に設置します。

```
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

# uname -a
Linux myserver 3.10.0-327.36.3.el7.x86_64 #1 SMP Mon Oct 24 16:09:20 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

## 導入手順ページ
CentOS への導入手順は以下にまとめられています。

- https://rocket.chat/docs/installation/manual-installation/centos

## 以下作業ログ
### node 整備
https://rocket.chat/docs/installation/manual-installation/centos
> Rocket.Chat needs Node.js version 4.5

とあるので、node 4.5.0 が使われるように調整する。

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash
$ echo "source ~/.bash_profile" >> ~/.bashrc
$ source ~/.bash_profile
$ nvm --version
0.30.1
$ nvm ls-remote
$ nvm install v4.5.0
$ nvm use v4.5.0
$ nvm alias default v4.5.0
$ node --version
v4.5.0
$ npm --version
2.15.9
```

### 依存整備
```
# yum -y install epel-release && yum -y update
# yum -y install GraphicsMagick
# vi /etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

# yum -y install mongodb-org-server mongodb-org gcc-c++
# chkconfig mongod on
# service mongod start
```

### Rocket.Chat ビルド・実行
```
$ curl -L https://rocket.chat/releases/latest/download -o rocket.chat.tgz
$ tar zxvf rocket.chat.tgz
$ mv bundle Rocket.Chat
$ cd Rocket.Chat/programs/server
$ npm install
$ cd ../..
$ export PORT=3000
$ export ROOT_URL=http://chat.clock-up.jp:3000/
$ export MONGO_URL=mongodb://localhost:27017/clockrocketchat
$ node main.js
```

一旦この状態で ```http://ホスト名:3000/``` にアクセスし、Rocket.Chat が使えることを確認します。

問題なければ Ctrl+C で一旦サーバを終了。

ターミナルと紐づけない形で永続的に起動したければ以下のコマンドを実行し直します。

```
$ nohup node main.js &
```

これを ```http://ホスト名:3000/``` のまま運用を続けることもできますが、3000番ポートを使うというのもカッコ悪いので、80番ポートが占有されていなければ、PORT 変数を 3000 から 80 に変更することで、80番ポートを使う形で起動すると良いでしょう。


### SSL 設定
今回は僕の環境の場合、既に Apache が起動している状態でした。ここに絡める形で、今回はせっかくなので SSL を設定してみることにします。

SSL 設定は [さくらインターネットRapidSSL申込みからApache設定まで - Qiita](http://qiita.com/kobake@github/items/81c5a589ffb11f77e61e) を参考にします（自分が昔書いた記事ですが）。

今回は以下の前提で設定を行いました。

- ホスト名 (ドメイン): ```chat.clock-up.jp```
- 秘密鍵: ```/etc/httpd/conf/ssl.key/chat.clock-up.jp.key``` として設置済み。
- 中間証明書: ```/etc/httpd/conf/ssl.crt/inca.crt``` として設置済み。
- サーバ証明書: ```/etc/httpd/conf/ssl.crt/chat.clock-up.jp.crt``` として設置済み。

```text:Apacheバージョンの確認
# apachectl -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 12 2017 21:03:28
```

```text:/etc/httpd/conf.d/ssl.confを編集
# 以下を追加
<VirtualHost *:443>
  ServerAdmin kobake@users.sourceforge.net
  ServerName chat.clock-up.jp:443

  ErrorLog    /var/log/chat_error.log
  TransferLog /var/log/chat_access.log

  SSLEngine on
  SSLOptions +StrictRequire
  SSLCertificateKeyFile   /etc/httpd/conf/ssl.key/chat.clock-up.jp.key
  SSLCertificateChainFile /etc/httpd/conf/ssl.crt/inca.crt
  SSLCertificateFile      /etc/httpd/conf/ssl.crt/chat.clock-up.jp.crt

  <Location />
    Options -Indexes
  </Location>

  ProxyPreserveHost On
  ProxyPass /websocket ws://localhost:3000/websocket
  ProxyPassMatch ^/sockjs/(.*)/websocket ws://localhost:3000/sockjs/$1/websocket
  ProxyRequests Off
  ProxyPass / http://127.0.0.1:3000/
  ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
```

```text:Apache再起動
# service httpd restart
```

設定完了です。

https://chat.clock-up.jp/ という形で Rocket.Chat にアクセスできるようになりました。

## ハマったところ
[Rocket.Chat](https://github.com/RocketChat/Rocket.Chat) のページ内に Heroku への簡単デプロイリンクがありますが、2017年5月22日に試した限りでは今は機能しないようです。がんばって直そうとしてみたけど直し方分からなかったです。ちょっと古い版のリポジトリを利用したりするとデプロイできますが…。

他にもいろいろハマった所多かった気がしますが、ちょっと設定作業に時間をあけてしまったのでハマったところ忘れちゃいました。掘り起こしたら追記します。

## 2017-05-23 追記
当初は CentOS 6.9 / Apache 2.2 に導入していたが、iOS 版の Rocket.Chat クライアントからの接続でエラーが起きていたので、設置先を CentOS 7.2 / Apache 2.4 に変更。