復数のプロセスを管理することのできる Procfile ベースのアプリケーションマネージャである foreman の使い方についてです。
foremanの使用方法
Gemfile にgem 'foreman'
を追加して bundle install を実行してください。アプリケーションルートに各プロセスを定義するためのProcfile
も作成します。
Procfile にはプロセスの名前とそれを実行するためのコマンドの両方が含まれている必要があります。フォーマットは<process>: <command>
です。Rails アプリケーションと Resque のワーカーを起動する場合の例は以下のようになります。
rails: bundle exec rails server worker: TERM_CHILD=1 QUEUES=* bundle exec rake environment resque:work
check
コマンドを使用して Procfile の検証ができます。
$ bundle exec foreman check valid procfile detected (rails, worker)
Procfile に問題がなければstart
コマンドで起動してみましょう。成功すると以下のようなログが流れます。foreman start <process>
で起動するプロセスを指定することも可能です。
$ bundle exec foreman start 19:51:04 rails.1 | started with pid 34223 19:51:04 worker.1 | started with pid 34224 19:51:06 rails.1 | => Booting Puma 19:51:06 rails.1 | => Rails 5.0.1 application starting in development on http://localhost:5000 19:51:06 rails.1 | => Run `rails server -h` for more startup options 19:51:06 rails.1 | Puma starting in single mode... 19:51:06 rails.1 | * Version 3.7.0 (ruby 2.3.1-p112), codename: Snowy Sagebrush 19:51:06 rails.1 | * Min threads: 5, max threads: 5 19:51:06 rails.1 | * Environment: development 19:51:06 rails.1 | * Listening on tcp://0.0.0.0:5000 19:51:06 rails.1 | Use Ctrl-C to stop
オプション
ポートの指定
普通に起動した時との違いは Rails のポートに 5000 番が使用されることです。3000 番を使用したい場合などは-p, --port
オプションを指定してください。
$ bundle exec foreman start -p 3000
環境変数
-e, --env
オプションであらかじめ記述してある環境変数のファイルを読み込むことができます。オプションを指定しないでもアプリケーションのルートディレクトリに.env
ファイルがあると自動で読み込まれます。
$ vi .env FOO=bar BAZ=qux
$ bundle exec foreman run irb irb(main):001:0> p ENV['FOO'] "bar" => "bar" irb(main):002:0> p ENV['BAZ'] "qux" => "qux"
Procfileの指定
-f, --procfile
オプションを使用すると読み込むProcfile
を指定することができます。Procfile.production
など環境別に作成する場合にも使えます。ただし、指定したファイルがあるディレクトリがアプリケーションのルートディレクトリとみなされます。
$ bundle exec foreman start -f ../config/proc/Procfile.production
アプリケーションルートの指定
-d, --root
オプションでアプリケーションのルートディレクトリを指定できます。デフォルトでは Procfile を含むディレクトリになります。
$ bundle exec foreman start -d /home/ubuntu/projects/proc
exportコマンド
export
コマンドはアプリケーションを別のプロセス管理形式にエクスポートするために使用されます。使用できるフォーマットは以下の通りです。
- bluepill
- inittab
- launchd
- runit
- supervisord
- systemd
- upstart
$ bundle exec foreman export supervisord /usr/local/supervisord/conf/supervisord.d/ -a my-app -u ubuntu $ cat /usr/local/supervisord/conf/supervisord.d/my-app.conf [program:my-app-rails-1] command=bundle exec rails server autostart=true autorestart=true stopsignal=QUIT stdout_logfile=/var/log/my-app/rails-1.log stderr_logfile=/var/log/my-app/rails-1.error.log user=ubuntu directory=/home/ubuntu/projects/proc environment=FOO="bar",BAZ="qux",PORT="5000" [program:my-app-worker-1] command=TERM_CHILD=1 QUEUES=* bundle exec rake environment resque:work autostart=true autorestart=true stopsignal=QUIT stdout_logfile=/var/log/my-app/worker-1.log stderr_logfile=/var/log/my-app/worker-1.error.log user=ubuntu directory=/home/ubuntu/projects/proc environment=FOO="bar",BAZ="qux",PORT="5100" [group:my-app] programs=my-app-rails-1,my-app-worker-1
GitHub - ddollar/foreman: Manage Procfile-based applications
foreman(1) - manage Procfile-based applications