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


## Errbitとは

[Errbit](https://github.com/errbit/errbit)は[Airbrake](https://airbrake.io/)のオープンソース版です。
アプリケーションのエラーを収集することで、チャットやメールなどで通知したり、エラーを管理することができます。

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

<!--more-->

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

````bash
$ sudo yum install mongodb-org

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

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

````bash
$ sudo yum install mongodb-org-shell

$ mongo --version
MongoDB shell version: 2.6.8
````

## Rubyのインストール

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

````bash
$ 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
````

````bash
# /etc/profile.d/rbenv.sh

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

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

Ruby 2.1.2を入れます。

````bash
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をインストールします。

````bash
root> gem install bundler
````

## Errbitのインストール

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

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

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

````bash
$ sudo useradd errbit
````

ErrbitをGitHubからcloneします。
場所はどこでも良いですが`/app`以下にします。

````bash
$ sudo mkdir /app
$ sudo chown errbit:errbit /app

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

````bash
$ cd errbit
$ bundle install --path=vendor/bundle

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

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

````bash
$ bundle exec rake secret
8aac31a5497ccb76389ecc97da8e2cc65bb8659b5aad96a08d9879a10d0f71ae81efb53c045951f1316a8801f308f3d664f655783babcdd277f2d4307fe019b9
````

`.env`を設定します。

````bash
$ 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](https://github.com/errbit/errbit/blob/master/docs/configuration.md)を参照してください。


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

````bash
$ 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
````

```bash
$ bundle install --path=vendor/bundle
```

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

````bash
$ 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にデータベースが作成されたか確認します。

```bash
$ 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`を編集します。サンプルを少しいじりました。

````bash
$ 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`を実行します。

````bash
$ bundle exec rake assets:precompile RAILS_ENV=production
````

`unicorn_rails`を起動します。

````bash
$ 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
````

````bash
$ 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;
    }
}
````

````bash
$ sudo service nginx configtest
$ sudo service nginx start
````

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

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

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

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

````bash
$ 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
````

````bash
$ sudo initctl reload-configuration
$ sudo initctl start svscan
svscan start/running, process 3858
````

`addsv.sh` は [http://blog.hansode.org/archives/51311837.html](http://blog.hansode.org/archives/51311837.html) からもってきます。

````bash
$ sudo su -l
root> cd /service/
root> vi addsv.sh
root> chmod +x addsv.sh
root> ./addsv.sh errbit
````

````bash
# /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の設定を行います。

````bash
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
'
````

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

````bash
root> cd /service
root> mv .errbit errbit
````

````bash
# プロセス確認
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

* [https://github.com/errbit/errbit](https://github.com/errbit/errbit)
* [http://kyokomi.hatenablog.com/entry/2015/01/28/222514](http://kyokomi.hatenablog.com/entry/2015/01/28/222514)
* [http://qiita.com/AH_korikori/items/431790c8fc48c304f348](http://qiita.com/AH_korikori/items/431790c8fc48c304f348)

元記事は[こちら](http://blog.jicoman.info/2015/07/install_errbit/)