ある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
この記事へのコメント
トラックバックURL