本日も乙

ただの自己満足な備忘録。

CentOS 6.5にErrbitを構築してみた

Errbitとは

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

今までアプリケーションエラーを通知する仕組みが社内であったのですが、以下の理由で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.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