rails デプロイへの道:さくらVPSリベンジ編⑥(Capistrano設定)

さて、前回Unicornの設定(rails デプロイへの道:さくらVPSリベンジ編⑤(Production環境用のアプリ設定とUnicorn設定))まで書いたので、今回からデプロイツールである「Capistrano」の設定について書き残したいと思います。

Capistranoの設定は主に4つ

  • Capfile
  • config/deploy.rb
  • config/deploy/production.rb
  • lib/capistrano/tasks/unicorn.cap

以上のファイルをいじっていきますが、その前に、

$ cap install

をしましょう。

これで必要なファイルができるはずです。

それではまず「Capfile」から!

さくらVPSにまっさらな状態からRuby2.1.0+Rails4.2.1+nginx+unicorn+capistranoの環境を構築したのでやんわり手順を書いた。

Capistrano で Rails アプリケーションの自動デプロイ

を参考に作業しましたので、あしからず。

スポンサーリンク
ピエロ広告ーレクタングル大

「Capfile」

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

require 'capistrano/rbenv'
set :rbenv_type, :user
set :rbenv_ruby, '2.3.0'
require 'capistrano/bundler'
require 'capistrano3/unicorn'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

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

上記サイトを参考にこんな感じで書きました。

とりあえず何やってるかよく分かってないんですが、こんな感じで書いておきました。

個人的には、このファイルはCapistranoでどの機能を使うかって設定なのかなーと思っています。

ってことで、次に行きます。

config/deploy.rb

lock '3.2.1'  #Capistranoのバージョン

set :application, 'アプリ名'
set :repo_url, '任意のリモートリポジトリURL'
set :deploy_to, 'デプロイするディレクトリ'

set :branch, 'master'
set :default_stage, "development"
set :scm, :git
set :deploy_via, :remote_cache

set :log_level, :debug
set :pty, true # sudo に必要
set :bundle_binstubs, nil

# Shared に入るものを指定
set :linked_files, %w{config/database.yml config/secrets.yml}
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}

# Unicorn
set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"

# 5回分のreleasesを保持する
set :keep_releases, 5

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  # アプリの再起動を行うタスク
  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :mkdir, '-p', release_path.join('tmp')
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  # linked_files で使用するファイルをアップロードするタスク
  # deployが行われる前に実行する必要がある。
  desc 'upload important files'
  task :upload do
    on roles(:app) do |host|
      execute :mkdir, '-p', "#{shared_path}/config"
      upload!('config/database.yml',"#{shared_path}/config/database.yml")
      upload!('config/secrets.yml',"#{shared_path}/config/secrets.yml")
    end
  end

  # webサーバー再起動時にキャッシュを削除する
  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 :rm, '-rf', release_path.join('tmp/cache')
      end
    end
  end

  # Flow の before, after のタイミングで上記タスクを実行
  before :started, 'deploy:upload'
  after :finishing, 'deploy:cleanup'

  # Unicorn 再起動タスク
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart' # lib/capustrano/tasks/unicorn.cap 内処理を実行
  end
end

ここも、書いある通りにやりました。

自分の環境に合わせて設定してください。

正直、いらないものとかもあると思うんですが、素人的には何かを消して詰まるのが嫌なので、とりあえず色々といれてます。

難しいですね・・・

config/deploy/production.rb

set :stage, :production
set :branch, 'master'

role :app, %w{サーバーの作業用ユーザー@IPアドレス}
role :web, %w{サーバーの作業用ユーザー@IPアドレス}
role :db, %w{サーバーの作業用ユーザー@IPアドレス}

set :ssh_options, {
  keys: [File.expand_path('~/.ssh/insecure_private_key')],
  forward_agent: true,
  auth_methods: %w(publickey)
}

ssh_optionは、鍵認証でサーバーに接続したかったので、このようにしました。

forword_agent:true オプションは、ローカルの秘密鍵をリモートリポジトリでも使えるようにするものです。

本来だったら、ローカル → リモートリポジトリ → サーバー という流れでデプロイするので、

ローカル(ローカル秘密鍵) ⇔ リモートリポジトリ(ローカル公開鍵)
サーバー(サーバー秘密鍵) ⇔ リモートリポジトリ(サーバー公開鍵)

とそれぞれのやり取りに、秘密鍵が必要となるのですが、サーバーに秘密鍵を置くのはセキュリティ的によくないんだそう。

そこで、forword_agent:true オプションでローカルの秘密鍵をリモートリポジトリとサーバーでやり取りするときも使えるようにすることで、サーバーに秘密鍵を置かなくても、鍵認証でssh接続できるというわけです。

ローカル(ローカル秘密鍵) → リモートリポジトリ(ローカル秘密鍵を保持) → サーバー(ローカル公開鍵)

とこんな感じで使えるわけです。

便利ですね!

lib/capistrano/tasks/unicorn.cap

namespace :unicorn do
  task :environment do
    set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"
    set :unicorn_config, "#{current_path}/config/unicorn/#{fetch(:rails_env)}.rb"
  end

  def start_unicorn
    within current_path do
    execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D"
    end
  end

  def stop_unicorn
    execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})"
  end

  def reload_unicorn
    execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})"
  end

  def force_stop_unicorn
    execute :kill, "$(< #{fetch(:unicorn_pid)})"
  end

  desc "Start unicorn server"
  task :start => :environment do
    on roles(:app) do
      start_unicorn
    end
  end

  desc "Stop unicorn server gracefully"
  task :stop => :environment do
    on roles(:app) do
      stop_unicorn
    end
  end

  desc "Restart unicorn server gracefully"
  task :restart => :environment do
    on roles(:app) do
      if test("[ -f #{fetch(:unicorn_pid)} ]")
        reload_unicorn
      else
        start_unicorn
      end
    end
  end

  desc "Stop unicorn server immediately"
  task :force_stop => :environment do
    on roles(:app) do
      force_stop_unicorn
    end
  end
end

これはUnicorn起動設定に関するファイルだそうで、デプロイするときのUnicornの設定ファイルだと思えばわかりやすいかもしれません。

ちょっとこれも何書いているかわからないんですが、デプロイ時のUnicornの動きと勝手に思っています。

長くなりましたが、これでCapistranoの設定は終了です。

本当にCapistranoの設定周りは謎が多いので、どっかミスってたらごめんなさい。

そして次は最終回です!(rails デプロイへの道:さくらVPSリベンジ編⑦(gitの設定、そしてデプロイへ・・・)

まとめ

まー色々と書いてきましたが、結局何が言いたかったかというと、

メモだから

ってことです。

色々書きましたが、正直良く分かってません。

なので、これでミスったとか、起動しないとか、そういう場合はあきらめてください。

これはメモなんだ、個人のメモなんだ、そう言い聞かせて、心を落ち着かせてもらえると幸いです。

プログラミングって難しいですよね。

改めて感じた次第でした。

スポンサーリンク
ピエロ広告ーレクタングル大
ピエロ広告ーレクタングル大

フォローする