Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

CapistranoでRuby on Railsアプリのデプロイを効率化する:ステップバイステップ完全ガイド

本記事では、Ruby on RailsアプリケーションにCapistranoを導入し、クラウドインスタンス(Ubuntu OS)へデプロイする手順を詳しく解説します。ホスティングプロバイダーに依存しない構成なので、任意のクラウドサービスやオンプレミスサーバーを使って、ここで紹介する手順をそのまま再現できます。

アプリのデプロイ後には、AppSignalを使ってデプロイ状況をモニタリングする方法についても簡単にご紹介します。

その前に、まずは「なぜCapistranoを使うべきなのか?」という疑問にお答えしましょう。

なぜRailsアプリにCapistranoを選ぶのか?

近年はデプロイやCI(継続的インテグレーション)のためのツールやサービスが数多く登場しているため、「今さらCapistranoを使う意味はあるのか?」と感じる方もいるかもしれません。

この疑問に答えるには、Capistranoの起源と現在までの進化の歴史を振り返る必要があります。Capistranoリポジトリに最初のタグが作成されたのは2006年です。当時の目的は、SSH経由で複数マシン上のコマンドをDSLを使って並列実行できるようにすることでした。それ以来、バージョンごとにさまざまな機能が追加され、進化を続けてきました。

初版から16年以上を経て現在のバージョン3となり、今でも活発に開発が続けられており、自動デプロイスクリプトを構築するためのフレームワークとして広く認知されています。

つまり、もはや単なる「リモートマシンでコマンドを実行するツール」ではありません。Capistrano本体の機能に加えて、Capistrano専用に動作する多数のプラグインやgemも存在します。

こうした背景と、依然として大きなコミュニティに支えられている事実から、Capistranoは自動デプロイのための優れたツールであり続けています。

RailsアプリへのCapistrano導入手順

まず、Capistranoと連携させるためにRailsアプリケーションを設定します。公式ドキュメントに従うことも可能ですが、本記事の範囲には不要な情報も多いため、ここでは必要最低限の手順と設定のみをご紹介します。

設定を始めるには、GemfileのdevelopmentグループにCapistranoのgemを追加します:


データベースのマイグレーション実行やアセットの処理には、capistrano-rails gemが必要です(詳細は後述します)。

次にbundle installを実行して、アプリケーションにCapistranoを追加しましょう:


続いて、Capistranoをインストールします:


このコマンドにより、必要なライブラリを読み込んで設定するCapfileが生成されます。さらに、configフォルダ内に作成されるdeploy.rbファイルには、Capistranoでのデプロイに必要なすべての設定を記述することになります。

補足: Capistranoはstaging環境とproduction環境それぞれに対してdeploy.rbの設定を上書きするファイルも生成しますが、これについては本記事では扱いません。

以上で、Railsアプリケーションとサーバー間の設定・通信を行う準備が整いました。

Capistranoを使ったRailsアプリのサーバー設定

このステップでは、Capistranoの設定ファイルに指示を追加し、アプリをどのサーバーのどこにデプロイするかを伝えます。ここでアクセス情報やセキュリティ設定を定義します。

本番環境で開発時と同じバージョンのRubyを実行できるよう、RVMrbenvなどのRubyバージョン管理ツールを使用しましょう(Capistranoは両方に対応しています)。

本記事ではRVMを使用します。開発マシンと本番サーバーの両方にRVMがインストールされていることを確認し、各環境およびプロジェクトでRubyのバージョンが一致しているかチェックしておきましょう。

capistrano-rvm Gemの追加

Capistranoプロジェクトは、RVMを簡単に設定できるgemを提供しています。プロジェクトに組み込むには、developmentグループ内のGemfileに追加して、再度bundle installを実行します。


Capfileにcapistrano-rvmの読み込みを追記します:


deployファイルには、RubyのバージョンとRVMのパスを指定する設定を追加します(RVMを別パスにインストールした場合は特に重要です)。

Rubyのバージョンが明示されていない場合、Capistranoはデプロイ先サーバーにインストールされている最新バージョンを選択します。


Capistrano::RVMには他にも設定項目がありますが、まずはここで紹介したものだけで十分に始められます。

サーバー設定のセットアップ

デプロイ用のユーザーを定義しておくのがベストプラクティスです。デプロイを開始する前に、必ずサーバー側で以下の手順を実行してください:

  1. ローカルマシンで生成した公開鍵を、サーバーの~/home/YOUR_USER/.ssh/authorized_keysファイルに追加する。
  2. キーペアを作成し、公開鍵をコードリポジトリに登録する。これにより、本番サーバー内でプロジェクトをcloneできるようになります。GitHubを使用している場合は公式ドキュメントを参照してください。
  3. /var/www/ディレクトリへの書き込み権限を設定する。

Capistranoは必要なあらゆる環境向けに設定できます。config/deploy/<environment_name>.rbという新しい設定ファイルを作成し、サーバーに接続するためのIPアドレスまたはDNS名とユーザー名を設定するだけです。


デプロイ設定を完成させるには、アプリケーション名やコードリポジトリのURLなど、アプリに関する情報を含めます。全環境共通の情報はconfig/deploy.rbに記載し、特定の環境固有の設定はconfig/deploy/<environment_name>.rbに分けて保持しましょう。


capistrano-secrets-yml Gemのセットアップ

続いて、capistrano-secrets-yml gemもセットアップしておきましょう。

Gemfileにgemを追加し、bundleを実行してインストールします:


Capfileに読み込みを追記します:


次に、アプリケーション内にconfig/secrets.ymlを作成し、secret key baseを環境変数として含めます。この変数は本番サーバー上で作成されます。このファイルは絶対にリポジトリにコミットしないでください


ターミナルでアプリケーションフォルダに移動し、以下のコマンドでsecret key baseを生成します:


生成されたキーをコピーし、本番サーバーのSECRET_KEY_BASEとして設定します。本番サーバーにアクセスし、常に利用できるよう最終的な~/.bashrcファイルにSECRET_KEY_BASE変数をエクスポートしましょう:


sourceコマンドを実行すれば、即座に環境に反映されます:


次に、自分のマシンに戻ってターミナルからアプリケーションフォルダにアクセスし、以下のCapistranoコマンドを実行すると、本番サーバー上にconfig/secrets.ymlが作成されます:


これで完了です! 次は、マイグレーションを実行するためのCapistrano設定に取り掛かりましょう。

データベースマイグレーションを自動化するCapistrano設定

いよいよ、データベース関連のコマンドを実行するためのCapistrano設定を行います。

Gemfileにすでに含まれているcapistrano-rails gemは、毎回のデプロイ時にマイグレーションを実行するよう設定できます。Capfileに読み込むだけでOKです:


また、デプロイ時にシードデータも投入したい場合は、マイグレーション後に実行される新しいタスクを作成します:


これで、ついにアプリをデプロイする準備が整いました!

Ruby on Railsアプリのデプロイを開始する

ここからは、ローカルマシンから直接サーバーを新しいバージョンに更新するデプロイの実行方法を見ていきます。

デプロイコマンドを実行すると、Capistranoはサーバーに接続します。そこから、設定ファイル(config/deploy.rb)で定義されたリポジトリからコードのcloneを試み、その後デプロイフローに沿って他のタスクが順次実行されます。

Capistranoのdeploy:checkコマンドは、Git設定が正しいこと、およびCapistranoがデプロイで使用するディレクトリに適切にアクセスできることを検証します。

使用する際は環境を指定します。今回はproductionを使用します:


設定に問題がなければ、productionへのデプロイを開始できます:


さらに、以下のコマンドでCapistranoで利用可能なすべてのタスクを確認できます:


さて、最終ステップとして、RailsアプリケーションをAppSignalと統合し、モニタリングを開始しましょう。

AppSignalをCapistranoとRailsアプリに統合する方法

AppSignalはモニタリングツールなので、「なぜこの記事に登場するのか?」と思われるかもしれません。もっともな疑問です。モニタリングはデプロイと直接関係ないように見えますからね。

とはいえ、AppSignalはRailsアプリケーションのモニタリングにおいて、各環境でのデプロイ状況を把握するのに非常に役立つツールです。それでは、AppSignalのセットアップ方法を見ていきましょう。

まずAppSignalアカウントが必要です。AppSignalのサインアップページから作成できます。言語としてRubyを選択し、手順に従ってアプリケーションにAppSignalをインストールしてください。

インストールが完了すると、AppSignalを設定するファイルが生成されます。ここで重要なのはrevisionの定義です。これはデプロイ後に確認され、アプリの新バージョンがデプロイされたかどうかを判定する情報です。ここではGit logをrevision情報として使用し、コードの新規デプロイごとにAppSignalへ通知されるようにします。


また、AppSignalの環境変数(特にAPIキー)を本番サーバーにエクスポートしておくのも良いプラクティスです。APIキーをAppSignalの設定ファイルに直接書き込むのは避けましょう。


これでデプロイを再実行できます。すべて正しく設定されていれば、デプロイ完了時に以下のようなメッセージが表示されます:


これで、AppSignal上であなたのアプリケーションを確認できるようになりました! 🎉

CapistranoでRuby on Railsアプリのデプロイを効率化する:ステップバイステップ完全ガイド

デプロイに関する情報も表示されます:

CapistranoでRuby on Railsアプリのデプロイを効率化する:ステップバイステップ完全ガイド

デプロイ統合や、Railsアプリケーション向けのその他の機能については、AppSignalのデプロイメントドキュメントページをご覧ください。

まとめと次のステップ

本記事では、Capistranoを使ってRailsアプリをデプロイする方法を解説しました。まずアプリにCapistranoを導入し、設定とデプロイを行い、最後にAppSignalによるモニタリングをセットアップしました。

さらに学びたい方は、リポジトリのパイプラインに接続された統合環境からCapistranoを実行するよう設定してみてください。Bitbucket、GitHub、GitLabなどのツールは、このプロセスを管理するための設定を提供しており、Capistranoと組み合わせて利用できます。

Happy coding!

P.S. Ruby Magicの最新記事をいち早くお読みになりたい方は、Ruby Magicニュースレターを購読して、見逃しのないようにしましょう!


  1. Rubyの認可をマスターする:Pundit vs. CanCanCan 徹底比較

    今日の多くのWebアプリケーションでは、ホームページのように誰でも閲覧できる公開ページと、ログインしたユーザーだけがアクセスできるセキュアなページが共存しています。ユーザー登録、ログイン、セッション状態の管理といった一連のプロセスは「認証(authentication)」と呼ばれます。 一方、ログイン済みユーザーに対しては、そのユーザーロールに応じてアクセスできるアクションやリソースを分ける必要があります。たとえば「管理者(admin)」は一般ユーザーよりも広範な権限を持つのが一般的です。このように認証済みユーザーのアクセス範囲を制御するプロセスは「認可(authorization)」と呼ばれ

  2. Rubyのエイリアス(別名定義)完全ガイド:aliasキーワードとalias_methodの違い

    Rubyでは、既存のメソッドに別名(エイリアス)を付ける方法が2つあります。 alias(キーワード) alias_method(メソッド) どちらも同じ目的で使えますが、挙動が微妙に異なるため、初心者にとって混乱しやすいトピックです。 本記事では、両者の違いを詳しく掘り下げ、しっかりと理解できるように解説していきます。 aliasキーワードとは まずはaliasから見ていきましょう。aliasはRubyのキーワードの一つです(ifやdef、classなどと同じ扱いです)。 基本的な書き方は以下の通りです。 alias print_something puts print_someth