CentOS7にRocket.Chatをインストール

あるWebシステムで一部処理の流れにメールを利用している。

レンタルのメールサーバなので何年かに一度ぐらいはダウンしたりしており、復旧にどれだけかかるのかはわからない。

これが停止するとこのシステムだけでなく、いろんな業務が完全にストップすると思われるのでSNSのツールに並列にapiで自動投稿して業務を行えるようにしている。

ツールはLINE等のチャットツールがベストだが、apiでbotしかできないようなのでtwitterを採用。

しかし普通にルールに従って使用していてもロックかけられたりすることがあったのでこれでは代替えに使えないので、オンプレミスで使えるOSSのチャットツールであるRocket.Chatを使用してそちらに移行することにした。

今回CentOSにインストールする際にだいぶ苦戦したので、その方法を記述する。

これが公式のドキュメント

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

ですが、ほかのインストール作業とかになれている方であれば、何とはなしに何をやっているのかわかるはず。

mongodbやら他の必要なパッケージなど入れたりというところは基本的に問題にはなりません。

何が問題になるかといえばRocket.Chatそのものです。というのもcurlで最新のバイナリを取ってきているのですがそれによってうまくいかないということが起きてくるわけです。

ググるとcentOSに入れている記事が何点かありますがトラブっている様子はありません。たぶん以前のバージョンではうまくいっているのでしょう。

古いソースもありますが、これはcurlで落とすものとは構造が違ってソースそのもの、このアプリはMeteorで作られていてコンパイルしてバイナリを作らないといけないのだと思われる。いま単純にインストールしたいだけなのにnodeやMeteorの勉強を始めてどうやるか追及しなければならないのは今やるべきこととちょっと違う。

現在の最新である0.61.2をCentOS7.3に入れる方法は以下のようになります。

(1)MongoDBリポジトリ

$ sudo vi /etc/yum.repos.d/mongodb-org-3.4.repo

[ファイル作成]

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=0
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

(2)MongoDBインストール

$ sudo yum install --enablerepo=mongodb-org-3.4 mongodb-org-server mongodb-org

(3)必要なライブラリをインストール(epelリポジトリ有効前提)

$ sudo yum install --enablerepo=epel nodejs npm curl GraphicsMagick

(4)nodeインストール

$ sudo npm install -g inherits n

(5)node.jsのバージョンを8.9.3に設定する

$ sudo n 8.9.3

(6)Rocket.Chatのインストール

$ cd /opt
$ sudo curl -k -L https://releases.rocket.chat/latest/download -o rocket.chat.tgz
$ sudo tar zxvf rocket.chat.tgz
$ sudo mv bundle /opt/rocket.chat

$ cd /opt/rocket.chat/programs/server/
$ sudo npm install

(7)Rocket.Chatのサービスのための設定

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

設定ファイル

$ cd /opt/rocket.chat
$ sudo vi rocketchat.env

[ファイル作成]

PORT=3000
ROOT_URL=http://ドメイン or IP:3000/
MONGO_URL=mongodb://localhost:27017/rocketchat

MongoDBを起動

$ sudo systemctl start mongod

Rocket.Chatサービスファイルを作成

$ sudo vi /usr/lib/systemd/system/rocketchat.service

[ファイル作成]

[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target

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

[Install]
WantedBy=multi-user.target

Rocket.Chatサービス起動

$ sudo systemctl enable rocketchat.service
$ sudo systemctl start rocketchat.service

普通はこれだけでOKなのですが、エラーで起動しません。

Feb 16 17:39:50 lemon systemd: Started The Rocket.Chat server.
Feb 16 17:39:50 lemon systemd: Starting The Rocket.Chat server...
Feb 16 17:39:50 lemon rocketchat: module.js:664
Feb 16 17:39:50 lemon rocketchat: return process.dlopen(module, path._makeLong(filename));
Feb 16 17:39:50 lemon rocketchat: ^
Feb 16 17:39:50 lemon rocketchat: Error: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /opt/rocket.chat/programs/server/node_modules/fibers/bin/linux-x64-57/fibers.node)

まずはCentOS7に入っているlistdc++はそんなに新しくないのでこの方法でビルドしなおします。

https://github.com/RocketChat/Rocket.Chat/issues/9167
$ sudo npm install -g node-gyp
$ cd /opt/rocket.chat/programs/server/node_modules/fibers/
$ sudo node-gyp rebuild
$ sudo cp -f build/Release/fibers.node bin/linux-x64-57/fibers.node

これで起動するかと思いきやまたもエラーが出ます。

Feb 16 19:49:43 lemon systemd: Started The Rocket.Chat server.
Feb 16 19:49:43 lemon systemd: Starting The Rocket.Chat server...
Feb 16 19:49:43 lemon rocketchat: module.js:664
Feb 16 19:49:43 lemon rocketchat: return process.dlopen(module, path._makeLong(filename));
Feb 16 19:49:43 lemon rocketchat: ^
Feb 16 19:49:43 lemon rocketchat: Error: The module '/opt/rocket.chat/programs/server/node_modules/fibers/bin/linux-x64-57/fibers.node'
Feb 16 19:49:43 lemon rocketchat: was compiled against a different Node.js version using
Feb 16 19:49:43 lemon rocketchat: NODE_MODULE_VERSION 48. This version of Node.js requires
Feb 16 19:49:43 lemon rocketchat: NODE_MODULE_VERSION 57. Please try re-compiling or re-installing
Feb 16 19:49:43 lemon rocketchat: the module (for instance, using `npm rebuild` or `npm install`).

勝手にnode6.12.3が使われるので

$ cd /opt/rocket.chat/programs/server/node_modules/fibers/
$ sudo node-gyp rebuild --target=v8.9.3
$ sudo cp -f build/Release/fibers.node bin/linux-x64-57/fibers.node

としてビルドしなおします。

何度もいろいろ試してみて何が問題かということがわかってきた。node.jsのバージョン管理するのにいろんなものがあるが公式で書いてあるnというものを使っている。sudo node -vとしても8.9.3が返ってくるのだけどsudo node-gypとした場合どう見てるのかわからないが、入れたnodeを見ることができないということが原因(たとえばsuしてnode-gypをすれば8.9.3が使われる)。 今回は無理やり–targetで指定してるが、nしたユーザーでログインした状態でやればうまくいくはず

CentOS6に入れるのはもっとめんいどい。以下6.6に入れる方法

(1)~(5)までは同じでよい。node-gypがpython2.7を必要とし、Rocket.Chatコンパイルの時には新しいgccを必要とする

(6)pythonのバージョンを2.7に設定する。

$ sudo yum -y install centos-release-scl-rh centos-release-scl
$ sudo vi /etc/yum.repos.d/CentOS-SCLo-scl.repo
 enabled=0に変更
$ sudo vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
 enabled=0に変更
$ sudo yum --enablerepo=centos-sclo-rh -y install python27
$ sudo vi /etc/profile.d/python27.sh

[ファイル作成]

#!/bin/bash

source /opt/rh/python27/enable
export X_SCLS="`scl enable python27 'echo $X_SCLS'`"

(7)GCCのバージョンを4.9にする

$ cd /etc/yum.repos.d/
$ sudo wget --no-check-certificate https://copr-fe.cloud.fedoraproject.org/coprs/rhscl/devtoolset-3/repo/epel-6/rhscl-devtoolset-3-epel-6.repo
$ sudo vi rhscl-devtoolset-3-epel-6.repo
 enabled=0に変更
$ sudo yum install --enablerepo=rhscl-devtoolset-3 devtoolset-3-gcc devtoolset-3-binutils
$ sudo yum install --enablerepo=rhscl-devtoolset-3 devtoolset-3-gcc-c++ devtoolset-3-gcc-gfortran
$ sudo vi /etc/profile.d/devtoolset3.sh

[ファイル作成]

#!/bin/bash

source /opt/rh/devtoolset-3/enable
echo "WARNING: devtoolset-3 is enabled!"

(8)Rocket.Chatのインストール

$ cd /opt
$ sudo curl -k -L https://releases.rocket.chat/latest/download -o rocket.chat.tgz
$ sudo tar zxvf rocket.chat.tgz
$ sudo mv bundle /opt/rocket.chat

hogeユーザーで
$ sudo chown -R hoge:hoge /opt/rocket.chat
$ n 8.9.3
$ cd /opt/rocket.chat/programs/server/
$ npm install
$ sudo chown -R root:root /opt/rocket.chat

(9)MongoDBを起動

$ sudo mkdir /data/mongo
$ sudo chown mongod:mongod /data/mongo
$ sudo chkconfig mongod on
$ sudo /etc/init.d/mongod start

(10)Rocket.Chatのサービスのための設定

$ sudo vi /opt/rocket.chat/rocketchat.sh

[ファイル作成]

#!/bin/sh
# chkconfig: 2345 90 15
# description:  rocketchat

. /etc/rc.d/init.d/functions

prog="rocketchat"
user="root"
nodejs="/usr/local/n/versions/node/8.9.3/bin/node"
rootdir="/opt/rocket.chat"
server="$rootdir/main.js"
logfile="$rootdir/${prog}.log"
lockfile="/var/lock/subsys/${prog}"
pidfile="/var/run/${prog}.pid"

start()
{
    [ -x $nodejs ] || exit 5
    echo -n $"Starting $server: "
    runuser -l "$user" -c "export MONGO_URL=mongodb://127.0.0.1:27017/rocketchat && export ROOT_URL=http://ドメイン or IP::3000/ && export PORT=3000 && $nodejs $server >> $logfile &" && echo_success || echo_failure
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch $lockfile
    ps -aefw | grep "$nodejs $server" | grep -v " grep " | awk '{print $2}' > $pidfile
    return $RETVAL
}
stop()
{
    echo -n $"Stopping $server: "
    killproc -p $pidfile $prog
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f $lockfile
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status ${prog}
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        RETVAL=1
esac

exit $RETVAL
$ sudo chmod 755 /opt/rocket.chat/rocketchat.sh
$ sudo ln -s /opt/rocket.chat/rocketchat.sh /etc/init.d/rocketchat
$ sudo chkconfig rocketchat on
$ sudo /etc/init.d/rocketchat start
カテゴリー: Linux, 技術情報 タグ: ,

関連してるかも記事

この記事へのコメント

※コメントはスパム対策の為、承認制となっています。あらかじめご了承ください。

トラックバックURL