gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

Railsアプリケーションをcapistrano × GCE(nginx × puma)× CloudSQL(MySQL)× でデプロイ【capistrano設定編】

今回参考にした記事

CapistranoでRailsデプロイ - kumilog.net

A remote server automation and deployment tool written in Ruby.

アジェンダ

  1. capistranoをinstallする
  2. Capfileを編集
  3. deploy.rbを編集
  4. production.rbを編集

capistranoをinstallする

  1. Gemfileに記載する
gem 'capistrano', '~> 3.11.0', require: false

group :development do
  # capistrano
  gem 'capistrano', '= 3.5.0'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano3-puma'
end
capistrano-bundler
  • デプロイ時にbundle installなどを実行可能にするため
capistrano-rbenv
  • rbenvのrubyを使用するため
capistrano-rails
capistrano3-puma
  • デプロイ時のpumaの起動・再起動を可能にするため

bundle installすると必要なファイルが自動で生成される

Capfileを編集

Capfileとは

capistrano全体の設定ファイル

require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/migrations'
require 'capistrano/puma'
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

requireでモジュールを読み込むのがメイン。 Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } はタスクを別ファイルで追加して読み込む。 今回はtask配下に読み込まない。

deploy.rbを編集

デプロイ時の挙動を記載したファイル。

全体
lock '3.5.0'

set :application, 'book_memo_api'
set :repo_url, 'git@github.com:kskgit/book_memo_api.git'

set :deploy_to, '/var/www/book_memo_api'

set :linked_files, fetch(:linked_files, []).push('config/database.yml', 'config/cable.yml', 'config/master.key')
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets')

set :rbenv_ruby, '2.6.5'
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_conf, "#{shared_path}/config/puma.rb"

namespace :deploy do
  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

namespace :upload do
  %w(database cable).each do |name|
    desc "upload config/#{name}.yml"
    task :"#{name}" do
      on roles(:app), in: :sequence do |host|
        execute :mkdir, '-p', "#{shared_path}/config"
        upload!("config/#{name}.yml","#{shared_path}/config/#{name}.yml")
      end
    end
  end
end
set :application
  • アプリケーションの名前
set :repo_url
set :deploy_to

デプロイ先のディレクト

set :linked_files/set :linked_dirs
  • デプロイ時にshared配下のファイルにシンボリックリンクを貼ってくれる
  • ここに記述したファイルを変更した場合は、直接ファイルをアップロードする必要がある
set :rbenv_ruby、set :puma_state、set :puma_conf
namespace :deploy do
  • デプロイ時の挙動を記載。デフォルトから特に変更せず。
namespace :upload do
  • configファイルやymlファイルのアップロード時の挙動を記載。デフォルトから特に変更せず。

production.rbを編集

production環境へdeployする際の挙動を追加。 deploy.rbとの違いは、特に環境に依存する内容を記載する点。 

全体
server 'XX.XX.XX.XX', user: 'USER_NAME', roles: %w[web app db]

set :default_env,
    'RACK_ENV' => 'production',
    'RAILS_ENV' => 'production'

set :asset_sync_enabled, false

set :puma_conf, "#{shared_path}/config/puma.rb"
set :pty, false

set :ssh_options, {
  keys: %w[/.ssh/id_rsa],
  forward_agent: true,
  auth_methods: %w[publickey],
  port: XXXX
}

set :rails_env, :production
set :puma_env, :production

set :branch, 'master'
server 'XX.XX.XX.XX', user: 'USER_NAME', roles: %w[web app db]
  • server:デプロイ先サーバのIPアドレス
  • user:サーバに接続するユーザ名
  • roles:サーバの役割。今回のデプロイ先のサーバにて、webサーバ・アプリケーションサーバ・DBサーバの役割を担ってもらうので3つを記載。
set :default_env
set :asset_sync_enabled, false set :pty, false
  • デフォルトの設定のまま
set :ssh_options
  • サーバにsshする際の情報を記載する
  • dockerコンテナ内に、ローカルのid_rsaフォルダをマウントしておらず、ローカルからssh接続出来るけどdeploy時はssh出来ないっっ・・・!!ってなったので注意(あまり無いタイプのハマり方かもしれませんが)
    volumes:
      - .:/api
      - ~/.ssh/id_rsa:/.ssh/id_rsa
set :rails_env
set :puma_env
set :branch, 'master'
  • マスターブランチしか無いため、ブランチを聞かないように設定
  • (参考)ブランチを都度尋ねる設定
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

Preparing Your Application