オープンソースなSlack風メッセージシステム「Rocket.Chat」をインストールしてみた

チームで作業をする際、コミュニケーションツールとしてSlackは必要不可欠な存在になっています。

Slackが人気の理由として、無料で十分使えるということがあると思います。

しかし、5GB以上のストレージを使いたい場合や、ユーザーアカウントの管理を自分で行いたい場合などは、Slackでは不便な部分もあるのではないでしょうか。

僕の学校で進めているプロジェクトで、Slackを使いたいと思ったのですが

  • 200人のユーザーを一気に追加したい
  • メールでの投稿システムを作りたい

などの理由からSlackではなく、オープンソースで開発されている「Rocket.Chat」を導入することにしました。
この分野の知識が少ないこともあってインストールがなかなか大変だったので、備忘録も兼ねてメモしておきます。

Rocket Chat

Slackを忠実にコピーされており、

  • チャンネルごとのトーク
  • DM
  • プライベートグループ
  • ファイルのアップロード
  • WebRTCを使ったビデオ通話

などが実装されています。

インストールした環境は

  • さくらのVPS 2GB SSD
  • Ubuntu 14.04

です。

公式のドキュメントとしてこのようなものもあるのですが、nodeのバージョン管理にnvmを使いたかったり色々あるので、あまり参考にはしませんでした。そのまま実行してもエラー吐くし...

環境のセットアップ

早速インストールしていきます。

主にインストールするものは、

  • Node.js(nvm)
  • Meteor
  • MongoDB
  • nginx

です。JavaScriptって感じですね。

nvm

まず、nvmからインストールしていきます。

Ubuntuにはデフォルトでcurlが入っていないので

sudo apt install curl

まあ適当にインストールします。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.27.1/install.sh | bash

次に、nvmをインストール。
終了後、「nvm」と打ってコマンドが動作すればOKです。

動作しなければ、~/.nvm/nvm.shにパスを通してあげましょう。

node.js

次に、nvmを使ってnode.jsをインストールします。Rocket.Chatはv0.10.40で動かすと良いみたいです。

nvm install v0.10.40

これでインストールされます。

nvm use v0.10.40

あとはnvmでこのバージョンを使うように指定しましょう。インストール時にはこのバージョンでないとエラーの元になります。
自分の場合は、同じサーバーでより新しいバージョンのnodeでアプリが動いているので、後で別バージョンを指定できるように設定します。

もし、v0.10.40だけを使えばいい場合は、

nvm alias default v0.10.40

みたいな感じにしてあげればいいと思います。

meteor

Meteorは、サーバー、Webクライアント、モバイルアプリまで開発できるフルスタックのフレームワークです。リアルタイムの通信に強いっていう印象があります。

Rocket.ChatはMeteorで作られているので、親のこいつをインストールします。

curl https://install.meteor.com/ | sh

すごく時間がかかりましたが、少し待てば終わります。

MongoDB

データベースにMongoDBを使うので、インストールします。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

で公開鍵を追加し

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list

ソースを作成

sudo apt-get update sudo apt-get install mongodb-10gen

こんな感じでインストールできると思います。

nginx

リバースプロキシとして使うnginxです。

curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add - sudo sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
sudo sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
sudo apt-get update
sudo apt-get install nginx

こんな感じで適当に入れてあげましょう。

Rocket Chatのインストール

ここからが本番です。

インストールするディレクトリに移動し

git clone https://github.com/RocketChat/Rocket.Chat.git

を実行します。gitコマンドも入ってないのでaptで入れてください。
同じディレクトリにRocket.Chatフォルダが生成されます。

cd Rocket.Chat

で中に入ったら、ひとまず起動してみましょう。

sudo meteor

このコマンドを実行すると、パッケージがインストールされ、localhost:3000でアプリが実行されます。

/etc/nginx/conf.d/rocketchat.confに

server { listen 80; server_name yourdomain.com; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:3000; } }

と書いてあげて、

sudo service nginx restart

でnginxを再起動します。

ドメインにアクセスすると、Meteorが起動しているのが確認できるかと思います。

しかし、このままでは毎回スクリプトをビルドするため、起動に時間が掛かり過ぎます。また、環境変数を指定していないため、アバターなどが正しく表示されないかと思います。

Rocket Chatをbuild

ということで、アプリをビルドします。

Rocket.Chatディレクトリで

meteor build --server "http://yourdomain.com" --directory .

を実行します。すると、bundleディレクトリが生成されます。

cd bundle cd programs/server
npm install
cd ../../

programs/serverにpackage.jsonがありますので、そこに書いてあるものをインストールしてあげます。

これでインストールは完了です。

実行するだけなら、

export HOST=http://yourdomain.com export MONGO_URL=mongodb://localhost:27017/rocketchat
export MONGO_OPLOG_URL=mongodb://localhost:27017/local
exportROOT_URL=http://yourdomain.com
export PORT=3000

このように環境変数を設定し

node main.js

とやれば動くはずです。

プロセス管理

これだと、環境変数を汚してしまいますし、何より自動起動などの設定が面倒です。

そこで、pm2を使ってプロセス管理を行い、他の場所では別のバージョンのnodeが使えるようにしたいと思います。

まず、pm2をインストールします。

nvm use stable npm install pm2 -g

この時点でnodeのバージョンを変更しても大丈夫なはずです。

pm2 startup ubuntu

こう実行して、pm2を起動時に立ち上げます。sudoが付いたコマンドを実行しろと言われるので、実行しましょう。

インストールできたら、Rocket.Chat/bundleにpm2の設定ファイル(pm2.json)を書きます。

[ { "name":"RocketChat", "script":"main.js", "exec_interpreter":"/home/[username]/.nvm/v0.10.40/bin/node", "env":{ "PORT":"3000", "MONGO_URL":"mongodb://127.0.0.1:27017/rocketchat", "ROOT_URL":"http://yourdomain.com" } } ]

こんな感じです。

この設定のミソは、envで環境変数を設定することと、exec_interpreterでnodeのバージョンを指定することです。

pm2.jsonというファイル名であれば、

pm2 start pm2.json

と実行してあげます。

こんな感じで実行されていることが確認できると思います。

あとは、pm2で適当に管理してあげればOKです。

さいごに

文字にすると大したことないんですが、真面目にかなり時間かかりました。

モバイルのアプリを自分でビルドしないといけないのが面倒なのですが、Webだけで使う分には普通に便利です。

以上、しゅんぼーでした。