はじめに
当社のRailsシステム間連携では、各システムで公開しているWeb APIを使っています。
今までは各システムを bin/rails s で起動し、開発を行ってきました。
ただ、 連携するシステムが増えたり、各システムで使うジョブワーカーが増えたりした結果、現在では各システムを起動する手間が増えてきました。
そこで、今後も効率的に開発できるよう、以下の設定を行いました。
tmux+overmindにて、連携する各システムやワーカーを1つのコマンドで起動できるようにしたRubyMineにて、overmindで起動したプロセスにアタッチし、デバッグできるようにした
この記事では、複数システムを1コマンドで起動できるようにするために、 tmux + overmind + RubyMine にてどのような設定をしたか、チュートリアル形式で共有します。
前提となる環境について
システム全体の構成について
このチュートリアルでは、以下のシステム構成とします。
- mac上で、2つのRailsシステム(
frontend_appとbackend_app)を開発しているfrontend_appについて- 外部からのHTTPリクエストを受け付ける
-
Delayed::Jobでジョブを管理しているbin/rails jobs:workにて Delayed::Job Worker を起動する
- 各Railsシステムは、ローカルマシン上での
bin/rails s実行により起動する - 各Railsシステムは、データベースを適切に設定している
ディレクトリ構成について
次の図のように、overmind ディレクトリの中に frontend_app と backend_app という2つのRailsシステムのリポジトリがあるものとします。
overmind/
├── backend_app/
│ ├── app/
│ ├── bin/
│ ...
└── frontend_app/
├── app/
├── bin/
...
用語について
tmuxとは
terminal multiplexer と呼ばれるソフトウェアのうちの1つです。
1つのターミナルの画面を、複数に分割して利用します。
overmindとは
Procfile ベースのプロセスマネージャーです (Githubリポジトリ)。
Herokuで使う Procfile と同じ書式で定義することで、定義したプロセスを管理できます。
参考: The Procfile | Heroku Dev Center
チュートリアル
tmux + overmind でシステム全体を起動できるようにする
tmux + overmind をセットアップする
overmindのREADMEに従い、 tmux と overmind をインストールします。
% brew install tmux % brew install overmind
tmuxの設定を行う
tmuxはデフォルト設定のままでも問題なく使えます。
ただ、慣れないうちはマウス操作はできたほうが便利なため、 tmux の設定を追加します。
~/.tmux.conf ファイルを追加し、以下を記載します。
set-option -g mouse on
Procfileを作成する
チュートリアルのルートディレクトリである overmind に、ファイル Procfile を作成します。
Procfile には、各Railsシステムやジョブワーカーを起動する時のコマンドを記載します。
なお、ワーキングディレクトリを考慮するため、 && を使ってコマンドをチェーンしています。
参考:foreman - Procfile start processes in their own working directory - Stack Overflow
# frontendの設定 frontend_app: cd frontend_app && bin/rails s -b 0.0.0.0 -p 3030 frontend_worker: cd frontend_app && bin/rails jobs:work # backendの設定 backend_app: cd backend_app && bin/rails s -b 0.0.0.0 -p 3031
tmuxにてovermindを起動する
macのターミナルから tmux を起動します。
% tmux
次に、 Procfile のあるディレクトリに移動し、overmind にて各プロセスを起動します。
% overmind s
tmux の画面では、 Procfile で定義した各プロセスの様子が表示されています。
動作確認
外部からのHTTPリクエストを受け付ける frontend_app に対し、 curl でアクセスします。
すると、 frontend_app からJSONレスポンスが返ってきます。
% curl http://localhost:3030/shops
{"shop":{"name":"スーパーマーケット","apples":[{"name":"シナノゴールド"},{"name":"シナノスイート"},{"name":"秋映"}]}}
tmuxを見ると、各システムやジョブワーカーが連携し、JSONレスポンスを返したことが分かります。

動作確認ができたため、いったん Ctrl + C にて overmind での実行を停止します。
1つのプロセスをtmuxの別ペインで表示する
現在はtmuxの1つのペインに、 Procfile で起動したすべてのプロセスのログが表示されています。
ただ、この状態のままでは各プロセスのログを追いづらいです。
そこで、別ペインで表示するよう設定します。
このチュートリアルでは、ウィンドウを上下ペインに分けます。
上ペインはここまで通り overmind のログを表示します。
一方、下ペインでは backend_app のログのみを表示するようにします。
別ペインで表示するための準備
以下の準備を行います。
- tmuxで
Ctrl + b+"を入力し、水平ペインを開く - 上ペインにて、以下の操作を行う
overmind sを実行し、各システム・ワーカーを起動する
- 下ペインにて、以下の操作を行う
Procfileのあるディレクトリに移動するovermind connect backend_appを実行し、overmindで実行しているbackend_appのプロセスに接続する
動作確認
再びcurlで frontend_app にアクセスしてみます。
すると、上ペインでは、各システム・ワーカーのログが出力されています。
一方、矢印部分の下ペインでは、 backend_app のログのみ表示されています。

RubyMineにて、overmindで起動したプロセスのデバッグを行う
今までの操作にて、各システム・ワーカーを overmind s だけで起動できるようになりました。
ただ、何か不具合があった時には、各システムをデバッグしたくなるかもしれません。
もしRubyMineを使っている場合は、 overmind で起動したプロセスにアタッチ・デバッグできます。
参考: Attach to process | RubyMine
このチュートリアルでは、RubyMineを使って backend_app のプロセスにアタッチしてみます。
RubyMineでの設定
以下の順番で設定を行います。
- RubyMineにて、プロセスにアタッチしたいシステムのリポジトリを開く
- このチュートリアルでは
backend_appリポジトリを開きます。
- このチュートリアルでは
- RubyMineのメニューにて、
Run > Attach to Processを選択する - 実行しているプロセスが表示されるため、
backend_appのプロセスを選択する- 下部のイメージ参照
- RubyMineでブレークポイントを設定する

以上で、デバッグの準備が整いました。
動作確認
curlで frontend_app にアクセスしてみます。
すると、RubyMineで設定したブレークポイントで停止します。
実行時の各変数の内容も表示され、デバッグできていることが分かります。

まとめ
tmux + overmind を利用して、連携する一連のシステムやワーカーを起動できるようにしたことにより、より開発を効率的に行うことができるようになりました。
今後も開発を効率的に行う方法をTechBookにて共有していこうと思います。
本サイトの更新情報は、Twitterの株式会社プレセナ・ストラテジック・パートナーズエンジニア公式で発信しています。ご確認ください。