Ruby
errbit

ErrbitをCentOS6.5にインストール

More than 3 years have passed since last update.


Errbitとは

ErrbitAirbrakeのオープンソース版です。

アプリケーションのエラーを収集することで、チャットやメールなどで通知したり、エラーを管理することができます。

今までアプリケーションエラーを通知する仕組みが社内であったのですが、以下の理由でErrbitを立てて使ってみています。


  • エラー通知する仕組みは社内の人がつくったもので、作った人以外がメンテナンスできない

  • エラー管理をしたい

  • アプリケーションエラーを外部に渡したくない(Airbrakeなどは使えない)


インストールするもの


  • MongoDB 2.6.8


    • Errbitが収集したデータを格納するストレージ



  • ruby 2.1.2


    • Rails製なのでRubyが必要



  • Errbit 0.3.0


    • Errbit本体



  • nginx 1.7.10


    • Unicornと連携してリバースプロキシしたいため



  • daemontools 0.76


    • サービスを常駐化できるものならSupervisorなどでも良い




MongoDBをインストール

YumでインストールするためにYumリポジトリを追加します。

# /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

$ sudo yum install mongodb-org

# 起動
$ sudo chkconfig mongod --add
$ sudo chkconfig mongod on
$ sudo service mongod start

すでにMongoDBサーバがある場合は、MongoDB-CLIのみをインストールします。

$ sudo yum install mongodb-org-shell

$ mongo --version
MongoDB shell version: 2.6.8


Rubyのインストール

今回はrbenvでRubyをインストールしました。

$ sudo su -l

root> cd /usr/local
root> git clone https://github.com/sstephenson/rbenv.git rbenv
root> git clone https://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
root> rbenv/plugin/ruby-build/install.sh

# /etc/profile.d/rbenv.sh

export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init --no-rehash -)"

root> source /etc/profile.d/rbenv.sh

Ruby 2.1.2を入れます。

root> rbenv install 2.1.2

root> rbenv rehash
root> rbenv global 2.1.2
root> ruby --version
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

Bundlerをインストールします。

root> gem install bundler


Errbitのインストール

依存パッケージを予めインストールしておきます。

$ sudo yum install gcc make git libxml2 libxml2-devel libxslt-devel libcurl-devel libzip-devel openssl-devel readline-devel

Errbit専用ユーザ(errbit)を追加します。

$ sudo useradd errbit

ErrbitをGitHubからcloneします。

場所はどこでも良いですが/app以下にします。

$ sudo mkdir /app

$ sudo chown errbit:errbit /app

# 以下、errbitユーザで実行
$ su - errbit
$ cd /app
$ git clone https://github.com/errbit/errbit

$ cd errbit

$ bundle install --path=vendor/bundle

Nokogiriに関するエラー出た場合
$ bundle config build.nokogiri --use-system-libraries
$ bundle install --path=vendor/bundle

SecretKeyを生成します。これは.env(後述)で使います。

$ bundle exec rake secret

8aac31a5497ccb76389ecc97da8e2cc65bb8659b5aad96a08d9879a10d0f71ae81efb53c045951f1316a8801f308f3d664f655783babcdd277f2d4307fe019b9

.envを設定します。

$ cp -a .env.default .env

# .env

ERRBIT_HOST=errbit.example.com
ERRBIT_PROTOCOL=http
ERRBIT_ENFORCE_SSL=false
CONFIRM_RESOLVE_ERR=true
ERRBIT_CONFIRM_ERR_ACTIONS=true
ERRBIT_USER_HAS_USERNAME=false
ERRBIT_USE_GRAVATAR=true
ERRBIT_GRAVATAR_DEFAULT=identicon
ALLOW_COMMENTS_WITH_ISSUE_TRACKER=true
SERVE_STATIC_ASSETS=true
SECRET_KEY_BASE=<生成したSecretKey>
ERRBIT_EMAIL_FROM='foo@bar.com'
ERRBIT_EMAIL_AT_NOTICES='[1,10,100]'
ERRBIT_PER_APP_EMAIL_AT_NOTICES=false
ERRBIT_NOTIFY_AT_NOTICES='[0]'
ERRBIT_PER_APP_NOTIFY_AT_NOTICES=false
MONGO_URL='mongodb://<MongoDBのIPアドレス>/errbit'
GITHUB_URL='https://github.com'
GITHUB_AUTHENTICATION=true
GITHUB_ACCESS_SCOPE='[repo]'
DEVISE_MODULES='[database_authenticatable,recoverable,rememberable,trackable,validatable,omniauthable]'

各種設定パラメータはConfiguring Errbitを参照してください。

errbit:bootstrapで初期設定を行います。

$ bundle exec rake errbit:bootstrap RAILS_ENV=production

rake aborted!
ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

エラーが出ました。

Gemfileにtherubyracerを追加して、bundle installします。

# Gemfile

gem 'therubyracer', :platforms => :ruby

$ bundle install --path=vendor/bundle

もう一度Bootstrapを実行すると成功するはずです。

$ bundle exec rake errbit:bootstrap RAILS_ENV=production

Seeding database
-------------------------------
Creating an initial admin user:
-- email: errbit@errbit.example.com
-- password: Oh1234wUcKMc

Be sure to note down these credentials now!

ログイン情報(メールアドレス、パスワード)が設定されるので、どこかに書き留めておきます(あとで変更可能です)。

MongoDBにデータベースが作成されたか確認します。

$ mongo <MongoDBサーバのIPアドレス>

MongoDB shell version: 2.6.8
connecting to: xxx.xxx.xxx.xxx/test

Foo:PRIMARY> show dbs;
admin (empty)
errbit 0.078GB
local 10.073GB

Foo:PRIMARY> use errbit
switched to db errbit

Foo:PRIMARY> show collections;
backtraces
comments
errs
notices
problems
system.indexes
users


Unicornの設定

unicorn.rbを編集します。サンプルを少しいじりました。

$ cp -a config/{unicorn.default.rb,unicorn.rb}

# config/unicorn.rb

rails_root = File.expand_path('../../', __FILE__)

worker_processes 3
working_directory rails_root
listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"
stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"

timeout 30
preload_app true
listen ENV['PORT'] || 8080
pid ENV['UNICORN_PID'] if ENV['UNICORN_PID']

before_fork do |server, worker|
old_pid = "#{server.config[:pid]}.oldbin"
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end

Errbit(Rails)をProduction環境で動かすためにassets:precompileを実行します。

$ bundle exec rake assets:precompile RAILS_ENV=production

unicorn_railsを起動します。

$ bundle exec unicorn_rails -c config/unicorn.rb -p 3000 -E production -D

ブラウザ等から http://errbit.example.com:3000/ でアクセスしてErrbitが表示されるか確認します。また、先ほどのID,PWでログインできればOKです。


NginxとUnicornの連携

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

# /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1

$ sudo yum install nginx

$ sudo chkconfig nginx on
$ sudo chkconfig nginx --add

VirtualHostを設定します。

# /etc/nginx/conf.d/errbit.conf

upstream unicorn {
server unix:/app/errbit/tmp/unicorn.sock;
}

server {
listen 80;
server_name errbit.example.com;
root /app/errbit/public;

access_log /var/log/nginx/errbit.access.log main;
error_log /var/log/nginx/errbit.error.log;

error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

try_files $uri/index.html $uri @unicorn;

location @unicorn {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://unicorn;
}
}

$ sudo service nginx configtest

$ sudo service nginx start

http://errbit.example.com/にアクセスし、ログインできればOKです。


Unicornサービスを常駐化(daemontools)

先ほどまで動かしていたUnicornプロセスをkillしておきます。

damoentoolsをインストールします。

$ sudo rpm -Uvh http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/daemontools-0.76-1.el6.art.x86_64.rpm

# /etc/init/svscan.conf

start on runlevel [12345]
respawn
exec /command/svscanboot

$ sudo initctl reload-configuration

$ sudo initctl start svscan
svscan start/running, process 3858

addsv.shhttp://blog.hansode.org/archives/51311837.html からもってきます。

$ sudo su -l

root> cd /service/
root> vi addsv.sh
root> chmod +x addsv.sh
root> ./addsv.sh errbit

# /service/addsv.sh

#!/bin/sh
#
# http://blog.hansode.org/
#
# $0 <service name>
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH

#
# usage
#
usage() {
cat <<EOS
usage:
$0 <service name>

EOS
exit 1
}

#
# main
#
[ $# = 1 ] || usage

svdir=/service
svname=$(basename $1)
acct_name=root
acct_group=root

[ -d ${svdir} ] || usage
[ -z ${svname} ] && usage
[ -d ${svdir}/.${svname} ] && usage
id ${acct_name} 2>&1 >/dev/null || { echo "no such acct: ${acct_name}"; usage; }

# directory, file

mkdir ${svdir}/.${svname}
chmod +t ${svdir}/.${svname}
mkdir ${svdir}/.${svname}/log
mkdir ${svdir}/.${svname}/log/main
touch ${svdir}/.${svname}/log/status
chown ${acct_name}:${acct_group} ${svdir}/.${svname}/log/main
chown ${acct_name}:${acct_group} ${svdir}/.${svname}/log/status

# run script

cat <<EOS > ${svdir}/.${svname}/run
#!/bin/sh

PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

exec 2>&1
sleep 3

EOS
chmod +x ${svdir}/.${svname}/run

cat <<EOS > ${svdir}/.${svname}/log/run
#!/bin/sh
exec setuidgid
${acct_name} multilog t s1000000 n100 ./main
EOS

chmod +x ${svdir}/.${svname}/log/run

exit 0

Errbitの設定を行います。

root> cd /service/.errbit

root> mkdir env
root> echo 'production' > env/RAILS_ENV
root> echo '/app/errbit' > env/RAILS_ROOT
root> echo '/usr/local/rbenv' > env/RBENV_ROOT
root> echo 'errbit' > env/USER

# /service/.errbit/run

#!/bin/sh

exec 2>&1
sleep 3
envdir ./env \
sh -c '
PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

cd $RAILS_ROOT
exec setuidgid $USER \
bundle exec unicorn_rails -c ./config/unicorn.rb -E $RAILS_ENV
'

設定が完了したら、ディレクトリ名を変更して起動させます。

root> cd /service

root> mv .errbit errbit

# プロセス確認

root> ps aux | grep [s]upervise
root 627 0.0 0.0 3932 364 ? S 10:45 0:00 supervise log
root 3473 0.0 0.0 3932 392 ? S 13:40 0:00 supervise errbit

# ログ確認
root> tail -f /service/errbit/log/main/current | tai64nlocal

http://errbit.example.com/にアクセスし、ログインできればOKです。


最後に

Errbitを構築してログインできるところまでを紹介しました。

次回からはアプリケーション側の設定方法などを紹介していきます。


参考URL

元記事はこちら