Ruby on Railsアプリケーションを本番にデプロイする方法としては、Capistranoを利用するのが一般的です。 この記事では、Capistranoの役割や設定についてまとめてみました。

Capistranoとは

Capistranoは、リモートサーバのオートメーションツールです。 複数台のサーバに対してssh接続し実行することで、ユーザが定義したさまざまな処理を行ないます。

用途はデプロイに限りませんが、デプロイのためのツールとして広く利用されています。

ディレクトリ構成

Capistranoの各設定ファイルは、次のような構成をとります。

$ tree -L 3
.
├── Capfile
└── config
    ├── deploy
    │   └── [stage].rb
    └── deploy.rb

[stage]は、デプロイ対象となるステージを表します。 たとえば本番環境ならproductionとなります。

本番環境にデプロイする際、設定ファイルとしてはdeploy.rbdeploy/production.rbの2つを参照します。 なので、各ステージ共通の設定はdeploy.rb、固有の設定はdeploy/下に書くことになります。

Capfileは、Capistranoで利用するタスクをインクルードするためのファイルです。 ここでインクルードしたタスクが、capコマンドで利用できるようになります。

フロー

Capistranoを実行すると、決められたフローでタスクが逐次実行されます。 標準のフローは公式ドキュメントをご覧ください。

このフローにいろんなタスクを追加することで、サーバに処理を適用できます。

たとえばCapistrano::RailsというGemは、deploy:updatedの後にdeploy:migrateというタスクを追加しています。

サーバの役割

Capistranoにはwebappdbという3つのrole(役割)があります。 サーバは一般的に次の3つの種類:

  • web: nginxなどのWebサーバ
  • app: unicornなどのアプリケーションサーバ
  • db: PostgreSQLなどのDBサーバ

に分けられますが、それぞれに対して別々の処理を適用できるようになっています。

とはいえ小さなサービスでは1台のサーバですべてを担うこともあると思います。 もちろん、こういったケースにも対応できるよう、柔軟な設計になっています。

設定一覧

以下に、よく利用する設定を簡単に説明していきます。 すべての設定は公式ドキュメントにありますので、こちらをご覧ください。

application

アプリケーションの名前を設定します。

deploy_to

アプリケーションのデプロイ先のパスを設定します。

scm

GitやSubversionといったバージョン管理システムの種類を設定します。

repo_url

リポジトリのURLを設定します。

branch

デプロイするブランチを設定します。

keep_releases

ロールバックできるよう、保持するリリースの数を設定します。

pty

sudoを有効にするかどうかを設定します。

log_level

ログとして表示するレベルを設定します。

format

ログの表示方法を設定します。

linked_files

デプロイしたリリース間でシムリンクを張るファイルを設定します。

linked_dirs

デプロイしたリリース間でシムリンクを張るディレクトリを設定します。

設定例

Railsアプリケーションをデプロイするための設定例を以下に示します。 設定の際の参考にしてみてください。

Capfile:

require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'

Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }

config/deploy/production.rb:

set :rails_env, :production

server 'example.com', roles: %w(web app db)

config/deploy.rb:

lock '3.6.0'

set :application, 'example.com'
set :deploy_to, "/var/www/#{fetch(:application)}"
set :scm, :git
set :repo_url, 'git@github.com:example/example.com.git'
set :branch, :master
set :keep_releases, 5
set :pty, true
set :log_level, :debug
set :format, :pretty

append :linked_files, '.env'
append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets'

# Capistrano::Bundler
set :bundle_jobs, 2
set :bundle_env_variables, { nokogiri_use_system_libraries: 1 }

after 'deploy:publishing', 'unicorn:restart'

おわりに

Capistranoは、Railsアプリケーションに限らず、その他の言語で構築されたアプリケーションのデプロイなど、広い用途で使えます。 デプロイの際の参考になればうれしいです。