モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

Rails4のデプロイでCapistrano3の基本的な使い方を把握する

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2014/11/24
最終更新最終更新
2018/10/09
記事区分記事区分
一般公開

目次

    C言語の基礎から応用まで幅広くサポート。初心者がつまずきやすいポイントを重点的に解説します。

    Capistranoはサーバの遠隔操作を自動化する多目的なツールです。以下では特に Rails4 を Capistrano3 でデプロイする基本的な方法をまとめます。Rails の場合は Capistrano の設定が gem で提供されているため、Capistrano の知識がなくても基本的なデプロイはできます。独自にカスタマイズしたい場合など、本ページの内容を越えるものは公式ページを参照してみてください。また、Capistranoは v3 と v2 の違いが大きく、v3 を対象とした以下の内容は v2 には適用できないことに注意してください。

    サンプルアプリケーションの準備

    デプロイするRailsアプリケーションを用意しましょう。ここではbundlerの使用を前提にしています。

    RailsのGemパッケージをbundlerで用意

    $ bundle init
    $ vi Gemfile
    gem "rails", "4.1.8"
    $ bundle install --path vendor/bundle
    

    Railsアプリの雛形を用意

    $ bundle exec rails new myApp --skip-bundle
    

    不要になったのでGemパッケージを削除

    $ rm -f Gemfile
    $ rm -f Gemfile.lock
    $ rm -rf .bundle
    $ rm -rf vendor/bundle
    

    Railsアプリ内で必要なGemパッケージをインストール

    $ cd myApp
    $ vi Gemfile
    gem 'therubyracer', platforms: :ruby
    $ bundle install --path vendor/bundle
    

    インストールしたGemをローカルに保存 (任意)

    $ bundle package
    

    ./vendor/cache/*.gem に保存されます。利点は、誰かがプロジェクトに新規に参加した場合に...

    • WebからGemが消失した場合に備える
    • 高速にbundle installできる
    • オフラインでもbundle installできる

    保存したGemを用いてのインストール方法は以下の通りです。

    $ bundle install --path vendor/bundle --local
    

    Scaffoldで簡易なアプリを作成してアクセス

    $ bundle exec rails generate scaffold myModel field1:string field2:integer field3:date field4:boolean
    $ bundle exec rake db:migrate
    $ bundle exec rails server
    

    アクセスしてみましょう: http://localhost:3000/my_models

    ローカルマシンにおけるデプロイ設定

    Capistrano v3 を用いて、上記手順で用意したアプリケーションをリモートサーバにデプロイしてみましょう。まずはローカルマシンの設定です。

    GitHubへのアップロード

    Capistrano v3 は SCM (source code management) の存在を前提としています。デプロイを行う際、直接ローカルマシンからアップロードするのではなく、リモートサーバでSCMレポジトリからソースコードを取得するためです。ここではSCMの中でもGitを採用します。GitHub, Bitbucket, 社内GitLabなど適当な場所にアップロードします。ここでは GitHub/harubot/capistrano_sample にアップロードしました。

    database.yml は管理から除外するためコピー

    $ cp config/database.yml config/database.yml.example
    

    SSH鍵の生成

    $ ssh-keygen
    

    Gitレポジトリへのアップロード

    $ git init
    $ vi .gitignore
    /vendor/bundle   ← 追記
    /config/database.yml   ← 追記
    $ git add .
    $ git commit -m "first commit"
    $ git remote add origin git@github.com:harubot/capistrano_sample.git
    $ git push -u origin master
    

    Railsアプリ内にCapistranoをインストール

    Capistrano v3 本体に加えて、各種拡張用のGemを rails の Gemfile に追記します。ここでは、rbenv, bundler, passenger の使用を前提にしています。

    また "capistrano-passenger" はこちらの公式ページで紹介されている、デプロイ時にPassengerを再起動するためのツールです。使用方法は、後述のCapfileで「require 'capistrano/passenger'」するだけです。"passenger + apache" ではなく "nginx + unicorn" をHTTPサーバに採用している場合などは不要です。更に "capistrano-withrsync" はリモートサーバからGitレポジトリに直接アクセスできない場合に重宝するGemパッケージです。これについては後述します。

    $ vi Gemfile
    ...
    gem 'capistrano', '3.2.1'
    gem 'capistrano-rails'
    gem 'capistrano-bundler'
    gem 'capistrano-rbenv'
    gem 'capistrano-passenger'
    # gem 'capistrano-withrsync', '0.1.0', require: false
    
    $ bundle update
    $ bundle package  ← 任意です。前述。
    $ git add .
    $ git commit -m 'add capistrano related gems'
    $ git push
    

    capistrano-withrsync について (参考情報)

    例えば社内GitLabにプロジェクトのレポジトリがあり社外サーバにデプロイしなければならない場合、社外サーバから社内のGitLabのレポジトリにアクセスできず、結果としてCapistrano v3 が使用できないという事態が発生します。このような場合の解決策の一つとして capistrano-withrsync があります。これを導入すると、ローカルマシンがGitレポジトリからpullしたものを rsync でリモートサーバに送ることができるようになります。導入は簡単です。前述の通りRailsのGemfileに以下の一行を追記して

    gem 'capistrano-withrsync', '0.1.0', require: false
    

    更に後述のCapfileに以下の一行を追記するだけです。これだけで、特に明示的な設定をすることなく裏で勝手にrsyncしてくれるようになります。

    require 'capistrano/withrsync'
    

    なお "require: false" はWEBrickなどでエラーが発生するためautorequireしないようにする設定です。

    Capistranoの設定ファイルを準備

    以下のコマンドで設定ファイルの雛形を生成します。

    $ bundle exec cap install
    

    Capfileに必要なGemを追記します。

    $ vi Capfile
    ...
    require 'capistrano/rbenv'
    require 'capistrano/bundler'
    require 'capistrano/rails/assets'
    require 'capistrano/rails/migrations'
    require 'capistrano/passenger'
    # require 'capistrano/withrsync'  ← 必要に応じて追記 (前述)
    

    デプロイ設定を以下のファイルに記述します。

    • config/deploy.rb : 共通のデプロイ設定
    • config/deploy/staging.rb : ステージング環境に特化したデプロイ設定
    • config/deploy/production.rb : 本番環境に特化したデプロイ設定

    config/deploy.rb

    # config valid only for Capistrano 3.1
    lock '3.2.1'
    
    set :application, 'capistrano_sample'
    set :repo_url, 'https://github.com/harubot/capistrano_sample.git'
    
    # Default branch is :master
    set :branch, 'master'
    
    # Default value for :scm is :git
    set :scm, :git
    
    # Default value for :format is :pretty
    set :format, :pretty
    
    # Default value for :log_level is :debug
    set :log_level, :debug
    
    # Default value for :pty is false
    set :pty, true
    
    # Default value for :linked_files is []
    set :linked_files, %w{config/database.yml}  ← デプロイ対象としたくないファイルを記載
    
    # Default value for linked_dirs is []      ↓ デプロイ対象としたくないディレクトリを記載
    set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
    
    # Default value for default_env is {} (↓rbenvがシステムインストールされている場合の設定)
    set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }
    
    # Default value for keep_releases is 5
    set :keep_releases, 5
    
    # rbenvの設定 (/usr/local/rbenv に 2.1.3 をインストールすることを想定)
    set :rbenv_type, :system
    set :rbenv_ruby, '2.1.3'
    
    # bundlerを実行する際の引数
    set :bundle_flags, "--deployment --without development test"
    #set :bundle_flags, "--deployment --without development test --local"
    #↑前述の bundle package を利用する場合
    
    # サーバ設定 (公開鍵認証の場合は "password" の項目は不要です)
    set :password, ask('Server password', nil)
    server '192.168.56.11', user: 'capcap', port: 22, password: fetch(:password), roles: %w{web app db}
    # server '192.168.56.12', user: 'capcap', port: 22, password: fetch(:password), roles: %w{web app db}
    # ↑複数サーバーにデプロイする場合
    
    
    namespace :deploy do
    
      desc 'Restart application'
      task :restart do
        on roles(:app), in: :sequence, wait: 5 do
          # Your restart mechanism here, for example:
          # execute :touch, release_path.join('tmp/restart.txt')
        end
      end
    
      after :publishing, :restart
    
      after :restart, :clear_cache do
        on roles(:web), in: :groups, limit: 3, wait: 10 do
          # Here we can do anything such as:
          # within release_path do
          #   execute :rake, 'cache:clear'
          # end
        end
      end
    
    end
    

    config/deploy/staging.rb

    # Default deploy_to directory is /var/www/my_app
    set :deploy_to, '/var/www/capistrano_sample/capistrano_sample.staging'
    
    # If the environment differs from the stage name
    set :rails_env, 'staging'
    

    config/deploy/production.rb

    # Default deploy_to directory is /var/www/my_app
    set :deploy_to, '/var/www/capistrano_sample/capistrano_sample.production'
    
    # If the environment differs from the stage name
    set :rails_env, 'production'
    

    設定ファイルを作成し終えたらコミットしておきましょう。最終的に追加した内容はこちらです。

    リモートサーバにおけるデプロイ設定

    ユーザの作成

    Capistranoでログインするユーザを作成します。パスワードも設定しましょう。

    $ sudo adduser capcap
    $ sudo passwd capcap
    

    各種RPMパッケージのインストール

    インストール済みであれば本作業は不要です。

    $ sudo yum install gcc
    $ sudo yum install gcc-c++
    $ sudo yum install openssl-devel
    $ sudo yum install sqlite-devel
    $ sudo yum install httpd
    

    rbenvのインストール

    インストール済みであれば本作業は不要です。rbenvを /usr/local/rbenv にシステムインストールする手順を記載します。

    インストール先のディレクトリを作成

    $ sudo mkdir /usr/local/rbenv
    $ sudo chmod 775 /usr/local/rbenv
    

    rbenvをインストール

    $ sudo git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
    $ sudo mkdir /usr/local/rbenv/plugins
    $ sudo git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
    

    環境変数の設定

    $ sudo touch /etc/profile.d/rbenv.sh
    $ sudo vi /etc/profile.d/rbenv.sh
    export RBENV_ROOT=/usr/local/rbenv
    export PATH=$RBENV_ROOT/bin:$PATH
    eval "$(rbenv init -)"
    

    rubyおよびbundlerのインストール

    $ sudo su -l
    # rbenv install 2.1.3
    # rbenv rehash
    # rbenv global 2.1.3
    # rbenv exec gem install bundler
    # rbenv rehash
    # exit
    

    デプロイ先のディレクトリを作成

    $ sudo su -l
    # mkdir /var/www/capistrano_sample
    # chown capcap: /var/www/capistrano_sample
    # exit
    
    $ sudo su -l capcap
    $ mkdir -p /var/www/capistrano_sample/capistrano_sample.staging/shared/config/
    $ mkdir -p /var/www/capistrano_sample/capistrano_sample.production/shared/config/
    $ exit
    

    SSH鍵の作成

    以下の手順で生成した鍵をGithubに登録しましょう。

    $ sudo su -l capcap
    $ ssh-keygen
    $ exit
    

    「linked_files」で指定したファイルの設置 ← はまりポイントです。重要です

    パスワード情報が記載されている等の理由でGit管理外になっている、デプロイ対象外にしたいファイルが存在しています。具体的にはdatabase.ymlなどです。このようなファイルは前述の通り deploy.rb における linked_files で指定します。指定することによってデプロイ対象ではなくなるため、何らかの手段で予めアップロードしておく必要があります。Chefでリモートサーバの構成管理をしているのであればレシピに含めておくのが理想的です。そうでない場合、例えばローカルマシンで以下のコマンドを実行して設置しましょう。

    $ scp config/database.yml capcap@192.168.56.11:/var/www/capistrano_sample/capistrano_sample.staging/shared/config/
    $ scp config/database.yml capcap@192.168.56.11:/var/www/capistrano_sample/capistrano_sample.production/shared/config/
    

    デプロイを実行する

    以下のコマンドでリモートサーバにRailsアプリケーションを設置できます。それぞれステージング環境および本番環境へのデプロイコマンドです。Passengerの再起動もなされます。

    $ bundle exec cap staging deploy
    $ bundle exec cap production deploy
    

    以上の基本形に加えてプロジェクトコードのデプロイ時の挙動をカスタマイズするためには、以下のサイトを参考に deploy.rb 等を作り込めばよいです。

    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    C言語の基礎から応用まで幅広くサポート。初心者がつまずきやすいポイントを重点的に解説します。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事

      • レイアウトおよび部分テンプレートに関するまとめ (Rails4)
        レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
        taro三世taro三世9/21/2016に更新
        いいねアイコン画像0
      • Ruby コードスニペット (正規表現)
        sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
        だいふくうさぎだいふくうさぎ4/13/2018に更新
        いいねアイコン画像0
      • OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)
        Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
      • Ruby における日本語のエンコーディング
        日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
        だいふくうさぎだいふくうさぎ3/21/2017に更新
        いいねアイコン画像0
      • Rails3ビューテンプレートの基本的な使用方法 (Ruby)
        Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...