foremanを使ってRailsのActive Job(Sidekiq)やその他の常駐プロセスの設定をする

Active Job(Sidekiq)の設定をしようと[こことか](http://qiita.com/zaru/items/8385fdddbd1be25fe370)見てたんですが、[monitでSidekiqプロセス管理（監視）](http://qiita.com/zaru/items/8385fdddbd1be25fe370#monitでsidekiqプロセス管理監視)とかがあって、monit入れるノめんどくさい&あわよくば常駐プロセス(TwitterストリーミングAPIでの収集プログラムとか)を簡単に設定したい、楽をしたい。との思いでいたのですが、どうやら[foreman](https://github.com/ddollar/foreman)が良い感じに楽できるみたいなので設定してみました。

foremanはheroku使ってたときになんとなく設定してたのですが、vpsとかのサーバーで使えるようで、使ってみたら普通に便利だったのでみんな使いましょう(それでもっといいまとめとか書いて俺に楽させて下さい)

# 環境説明

今回解説する記事書いてる時の環境を書いておきます
(動き理解しちゃえば他の環境でも動くとは思いますが)

- 開発環境
  - Mac OS X 10.10.5
  - Ruby 2.2.1
- 本番環境
  - Ubuntu 14.04.3
  - Ruby 2.1.1 (Rubyのバージョンは開発も本番もなるべく一緒にしておきましょう(今気づいた))
  - sudoのパスワード無し実行の許可済み # 起動スクリプトの作成時に必要
  - rbenvをglobal環境で実行可能に設定済み # `/etc/profile.d/rbenv.sh`みたいにして全ユーザーがrbenv読み込まれるようにしてある
- Rails 4.2.3
- foreman 0.78.0
- capistrano 3.4.0
- capistrano3-foreman 0.2.5


Ubuntuの[upstart](http://upstart.ubuntu.com)を使うのでこの`capistrano3-foreman`が使えるんですが、upstart固定の設定になってるので他の設定をするときはデプロイタスクを(対象箇所を書き換えて)自分で書いちゃった方が良いと思います、行数少ないし。
<https://github.com/surzycki/capistrano-foreman/blob/242e9a92165fdb5c9520424afb01f4ba895d8ab3/lib/capistrano/tasks/foreman.cap>

upstartの説明はこちら
[Upstart を使ってお手軽 daemon 化](http://heartbeats.jp/hbblog/2013/02/upstart-daemon.html)


upstartとか他にも常駐プロセスとかのdaemon化させられる奴に対応してて、フォーマット設定は以下の一覧があります。(upstart以外は試してない)

- bluepill
- inittab
- launchd
- runit
- supervisord
- systemd
- upstart

<http://ddollar.github.io/foreman/#EXPORT-FORMATS>

# foremanの初期設定

`foreman start`で各プロセスが起動できるように設定

```rb:Gemfile
gem 'foreman'
```

```rb:Procfile
web: bundle exec rails server -p $PORT
worker: bundle exec rails r lib/tasks/twitter_streaming.rb
sidekiq: bundle exec sidekiq -C config/sidekiq.yml
```

     $ foreman start
    16:49:46 web.1     | started with pid 33986
    16:49:46 worker.1  | started with pid 33987
    16:49:46 sidekiq.1 | started with pid 33988
    16:49:49 web.1     | => Booting WEBrick
    16:49:49 web.1     | => Rails 4.2.3 application starting in development on http://localhost:3000
    16:49:49 web.1     | => Run `rails server -h` for more startup options
    16:49:49 web.1     | => Ctrl-C to shutdown server
    16:49:49 web.1     | [2015-08-31 16:49:49] INFO  WEBrick 1.3.1
    16:49:49 web.1     | [2015-08-31 16:49:49] INFO  ruby 2.2.1 (2015-02-26) [x86_64-darwin14]
    16:49:49 web.1     | [2015-08-31 16:49:49] INFO  WEBrick::HTTPServer#start: pid=33986 port=3000

# foreman デプロイ設定

```rb:Gemfile
group :development do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano-scm-copy' # これは好みに合わせて
  gem 'capistrano3-foreman'
end
```

```rb:config/deploy.rb
set :application, 'yatapara' # 立川屋台村ヤタパラ! 立川にお越しの際には是非！ http://yatapara.com
set :deploy_to, '/usr/local/rails/yatapara'
set :foreman_env,  '/usr/local/rails/yatapara/shared/.env.production' # 環境変数ファイルの設定しましょう。`RAILS_ENV=production` とかしとかないといけない。
set :rbenv_type, :system
set :rbenv_ruby, '2.1.1'
after 'foreman:export', 'foreman:restart'
```

```/usr/local/rails/yatapara/shared/.env.production
RAILS_ENV=production
SECRET_KEY_BASE=hugehugehugehguehgeugehugehgueguehguegheguegueghuge
```

```rb:Capfile
require 'capistrano/foreman'
```

後は普通にデプロイして起動とかできるように。

# foreman exportのテンプレート設定

このままデプロイすれば行ける。。。
はずなのですが、foremanのデフォルトテンプレートのままだと

- rbenvの読み込みされない
- logの出力ディレクトリの設定しても適応されない

なので読み込まれるテンプレートを変えます
(プルリク送った方が良いのでは)(誰か送って私に楽をさせて下さい)

テンプレートを変えるためにはデプロイ先のサーバーのホームディレクトリ配下`~/.foreman/templates/upstart/process.conf.erb`に設定します

```rb:~/.foreman/templates/upstart/process.conf.erb
start on starting <%= app %>-<%= name %>
stop on stopping <%= app %>-<%= name %>
respawn

env PORT=<%= port %>
<% engine.env.each do |name,value| -%>
env <%= name.upcase %>='<%= value.gsub(/'/, "'\"'\"'") %>'
<% end -%>

setuid <%= user %>

chdir <%= engine.root %>

exec bash -lc '<%= process.command %> >> <%= "#{log}/#{name}-#{num}.log" %> 2>&1'
```

`foreman export`で何が出力されるかとか簡単に見ておくのも良いです(ローカルでもいいので)

# deploy

    cap production deploy

でデプロイが完了すればオッケーだと思います(sudo実行をパスワードなしにしておくのを忘れずに)

デプロイ先のサーバーで確認しましょう(`set :application`で設定した名前で設定ファイルが出力されているので設定名でgrep)

    # initctl list| grep yatapara
    yatapara-web start/running
    yatapara-sidekiq-1 start/running, process 8240
    yatapara start/running
    yatapara-web-1 start/running, process 8236
    yatapara-worker-1 start/running, process 8237
    yatapara-worker start/running
    yatapara-sidekiq start/running

process番号が出力されてれば問題ありません。
`start/running`の出力があるのにprocess番号が無い場合には起動出来てないのでログを見ましょう。

ログはデプロイした場所配下の`shared/log/`下に入ってると思います。
今まで設定してきた通りだと`/usr/local/rails/yatapara/shared/log/`の下とか。
`/var/log/upstart/`の下にもそれっぽいのあるかもです。

# プロセスをkillしてみる

upstartで起動してるのでプロセスが死んでも自動起動します。
試しに起動した`8236`プロセスをkill、その後別のプロセスが立ち上がってるので自動起動されてるのが解ります。


    # initctl list| grep yatapara
    yatapara-web start/running
    yatapara-sidekiq-1 start/running, process 8240
    yatapara start/running
    yatapara-web-1 start/running, process 8236
    yatapara-worker-1 start/running, process 8237
    yatapara-worker start/running
    yatapara-sidekiq start/running
    # kill -KILL 8236
    # initctl list| grep yatapara
    yatapara-web start/running
    yatapara-sidekiq-1 start/running, process 8240
    yatapara start/running
    yatapara-web-1 start/running, process 8923 # 変わってる
    yatapara-worker-1 start/running, process 8237
    yatapara-worker start/running
    yatapara-sidekiq start/running

以上で設定は完了です。

# 終わりに

楽をしたい