Errbitとは
ErrbitはAirbrakeのオープンソース版です。 アプリケーションのエラーを収集することで、チャットやメールなどで通知したり、エラーを管理することができます。
今までアプリケーションエラーを通知する仕組みが社内であったのですが、以下の理由でErrbitを立てて使ってみています。
- エラー通知する仕組みは社内の人がつくったもので、作った人以外がメンテナンスできない
- エラー管理をしたい
- アプリケーションエラーを外部に渡したくない(Airbrakeなどは使えない)
インストールするもの
- MongoDB 2.6.8
- Errbitが収集したデータを格納するストレージ
- ruby 2.1.2
- 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.sh
は http://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を構築してログインできるところまでを紹介しました。 次回からはアプリケーション側の設定方法などを紹介していきます。