Active Job(Sidekiq)の設定をしようとこことか見てたんですが、monitでSidekiqプロセス管理(監視)とかがあって、monit入れるノめんどくさい&あわよくば常駐プロセス(TwitterストリーミングAPIでの収集プログラムとか)を簡単に設定したい、楽をしたい。との思いでいたのですが、どうやら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を使うのでこのcapistrano3-foreman
が使えるんですが、upstart固定の設定になってるので他の設定をするときはデプロイタスクを(対象箇所を書き換えて)自分で書いちゃった方が良いと思います、行数少ないし。
https://github.com/surzycki/capistrano-foreman/blob/242e9a92165fdb5c9520424afb01f4ba895d8ab3/lib/capistrano/tasks/foreman.cap
upstartの説明はこちら
Upstart を使ってお手軽 daemon 化
upstartとか他にも常駐プロセスとかのdaemon化させられる奴に対応してて、フォーマット設定は以下の一覧があります。(upstart以外は試してない)
- bluepill
- inittab
- launchd
- runit
- supervisord
- systemd
- upstart
http://ddollar.github.io/foreman/#EXPORT-FORMATS
foremanの初期設定
foreman start
で各プロセスが起動できるように設定
gem 'foreman'
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 デプロイ設定
group :development do
gem 'capistrano'
gem 'capistrano-rbenv'
gem 'capistrano-bundler'
gem 'capistrano-rails'
gem 'capistrano-scm-copy' # これは好みに合わせて
gem 'capistrano3-foreman'
end
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'
RAILS_ENV=production
SECRET_KEY_BASE=hugehugehugehguehgeugehugehgueguehguegheguegueghuge
require 'capistrano/foreman'
後は普通にデプロイして起動とかできるように。
foreman exportのテンプレート設定
このままデプロイすれば行ける。。。
はずなのですが、foremanのデフォルトテンプレートのままだと
- rbenvの読み込みされない
- logの出力ディレクトリの設定しても適応されない
なので読み込まれるテンプレートを変えます
(プルリク送った方が良いのでは)(誰か送って私に楽をさせて下さい)
テンプレートを変えるためにはデプロイ先のサーバーのホームディレクトリ配下~/.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
以上で設定は完了です。
終わりに
楽をしたい