Help us understand the problem. What is going on with this article?

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

元記事はこちら

sansan
法人向け名刺管理サービスSansan及び個人向け名刺管理サービスEightを企画・開発・販売するベンチャー
http://jp.corp-sansan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした