Rocket.Chat を Dockerで構築してHubotと連携する

![https://camo\.githubusercontent\.com/10d84b7d3ba2cff5cef0736152dd6792a38ea511/68747470733a2f2f726f636b65742e636861742f696d616765732f6c6f676f2f6c6f676f2d6461726b2e7376673f7633](https://camo.githubusercontent.com/10d84b7d3ba2cff5cef0736152dd6792a38ea511/68747470733a2f2f726f636b65742e636861742f696d616765732f6c6f676f2f6c6f676f2d6461726b2e7376673f7633)


俺は一体何回Chat環境をつくれば気が済むんだ…:poop:

* [社内でHipChatクローンのKandanとHubotを動かす \- Qiita](http://qiita.com/tenten0213/items/7ed9159b96b1d894ee8b)
* [Let's ChatとHubotを連携する \- Qiita](http://qiita.com/tenten0213/items/dff56549586f4c5607cf)
* [Back channelingとHubotを連携する \- Qiita](http://qiita.com/tenten0213/items/23443b6d5ecbb0293060)

ってことで、DockerでRocket.Chatの環境を構築してHubotと連携してみたいと思います。

```bash
$ docker version 1.12.3, build 6b644ec
$ docker-compose --version
docker-compose version 1.8.1, build 878cff1
$ docker-machine --version
docker-machine version 0.8.2, build e18a919
```

インストールは公式のドキュメントを参考にして進めてみます。  

iOSアプリのCI用Mac上に構築する想定なので、Mac用の手順を参照しています。

Docker, Docker Composeがインストールされている前提です。

* [Rocket\.Chat Docs](https://rocket.chat/docs/installation/docker-containers/docker-compose)

## docker-compose.ymlを作成する

Rocket.chatのdocker-compose.ymlを参考にして、必要な設定のみ残したものを作成します。

* [example](https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml)

```bash
$ mkdir rocket-chat
$ cd rocket-chat
$ wget https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml
$ vi docker-compose.yml
```

Rocket.chatは永続化にMongoDBを利用しているので、MongoDBの設定が入っています。  
HubotとRocket.chatを連携したいので、Hubotの設定も残しておきます。
proxy対応として、 `hubot-proxy-loader` を`EXTERNAL_SCRIPTS` に追加しています。

※ Hubotを別サーバにインストールする場合は、Hubotの設定は不要です

```yaml:docker-compose.yml
rocketchat:
  image: rocketchat/rocket.chat:latest
  volumes:
    - ./uploads:/app/uploads
    - /etc/localtime:/etc/localtime:ro
  environment:
    - PORT=3000
    - ROOT_URL=http://localhost:3000
    - MONGO_URL=mongodb://mongo:27017/rocketchat
#   - HTTP_PROXY=http://proxy.domain.com
#   - HTTPS_PROXY=http://proxy.domain.com
    - TZ=Asia/Tokyo
  links:
    - mongo:mongo
  ports:
    - 3000:3000

mongo:
  image: mongo:3.2
  volumes:
    - ./data/db:/data/db
    - /etc/localtime:/etc/localtime:ro
  environment:
    - TZ=Asia/Tokyo
  command: mongod --smallfiles --oplogSize 128

# hubot, the popular chatbot (add the bot user first and change the password before starting this image)
hubot:
  image: rocketchat/hubot-rocketchat:latest
  environment:
    - ROCKETCHAT_URL=rocketchat:3000
    - ROCKETCHAT_ROOM=GENERAL
    - ROCKETCHAT_USER=bot
    - ROCKETCHAT_PASSWORD=password
    - BOT_NAME=bot
# you can add more scripts as you'd like here, they need to be installable by npm
    - EXTERNAL_SCRIPTS=hubot-seen,hubot-links,hubot-diagnostics,hubot-proxy-loader
    - TZ=Asia/Tokyo
  links:
    - rocketchat:rocketchat
  labels:
    - "traefik.enable=false"
  volumes:
    - ./scripts:/home/hubot/scripts
    - /etc/localtime:/etc/localtime:ro
# this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier
  ports:
    - 3001:8080
```

2016/11/17 Timezoneの設定を追加しました。  
ログが `2016-11-17T10:33:31.592+0900` のように表示されるようになります。

起動

```bash
$ docker-compose up -d
```

プロセスの確認

```bash
docker-compose ps
         Name                        Command               State           Ports
-----------------------------------------------------------------------------------------
rocketchat_hubot_1        /bin/sh -c node -e "consol ...   Up      0.0.0.0:3001->8080/tcp
rocketchat_mongo_1        /entrypoint.sh mongod --sm ...   Up      27017/tcp
rocketchat_rocketchat_1   node main.js                     Up      0.0.0.0:3000->3000/tcp
```

![Rocket_Chat.png](https://qiita-image-store.s3.amazonaws.com/0/6092/5ef45c50-0d39-f370-6d7a-63f71eb4bb45.png)

### Botアカウントの作成

起動後、自身のアカウントを作成しログインしたら、Hubot用のアカウントを作成します。
設定値は`docker-compose.yml`の値に合わせます。

![Rocket_Chat.png](https://qiita-image-store.s3.amazonaws.com/0/6092/ea0c1892-196c-ab48-add7-6ab6e64c48b6.png)

ユーザ作成直後は`@bot ping`しても応答が返ってきませんでした。(まだbotが介在していないよう)  

再起動を実行すると、

```bash
$ docker-compose stop
Stopping rocketchat_hubot_1 ... done
Stopping rocketchat_rocketchat_1 ... done
Stopping rocketchat_mongo_1 ... done
>>> elapsed time 27s

$ docker-compose up -d
Starting rocketchat_mongo_1
Starting rocketchat_rocketchat_1
Starting rocketchat_hubot_1
```

HubotがRocketchatに接続し、ルームに参加するようになります。

```
hubot_1       | [Tue Nov 15 2016 04:20:14 GMT+0000 (UTC)] INFO Starting Rocketchat adapter version 1.0.6...
hubot_1       | [Tue Nov 15 2016 04:20:14 GMT+0000 (UTC)] INFO Once connected to rooms I will respond to the name: bot
hubot_1       | [Tue Nov 15 2016 04:20:14 GMT+0000 (UTC)] INFO Connecting To: rocketchat:3000
hubot_1       | [Tue Nov 15 2016 04:20:14 GMT+0000 (UTC)] INFO Successfully connected!
hubot_1       | [Tue Nov 15 2016 04:20:14 GMT+0000 (UTC)] INFO GENERAL
hubot_1       | [Tue Nov 15 2016 04:20:14 GMT+0000 (UTC)] INFO Logging In
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Successfully Logged In
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Looking up Room ID for: GENERAL
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Joining Room: GENERAL
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO rid:  [ 'GENERAL' ]
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO All rooms joined.
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Successfully joined room: GENERAL
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Preparing Meteor Subscriptions..
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Subscribing to Room: __my_messages__
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Successfully subscribed to messages
hubot_1       | [Tue Nov 15 2016 04:20:15 GMT+0000 (UTC)] INFO Setting up reactive message list...
```

以下の画像の1回目の`ping`は再起動前、2回目は再起動後です。

![Rocket_Chat.png](https://qiita-image-store.s3.amazonaws.com/0/6092/51c321d0-ddc8-161e-2e2a-e80b965e0ba6.png)


### 感想

なんやかんやうまくいかなくて `docker-compose logs -f`したり、 `docker-compose rm` で消してからやり直したりしたので、ここらへんのコマンドは覚えておくと良さそうです。
ちょこちょこDockerを社内で利用しようと手を出しているのですが、これだけ簡単に環境が整うのはホント楽ですね。

今回は自分のマシンで環境を構築しましたが、この後にiOSアプリCI用Macに同様の環境を構築する予定です。
そんな場合でも、同様の`docker-compose.yml`を配置して`docker-compose up -d` すれば環境が整うのはありがたいです。