Railsアプリケーションをcapistrano × GCE(nginx × puma)× CloudSQL(MySQL)× でデプロイ【capistrano設定編】
今回参考にした記事
CapistranoでRailsデプロイ - kumilog.net
A remote server automation and deployment tool written in Ruby.
アジェンダ
capistranoをinstallする
- 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
- アセットのコンパイルやmigrationを実行可能にするため
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
- gitのリモートリポジトリのURL
set :deploy_to
デプロイ先のディレクトリ
set :linked_files/set :linked_dirs
- デプロイ時にshared配下のファイルにシンボリックリンクを貼ってくれる
- ここに記述したファイルを変更した場合は、直接ファイルをアップロードする必要がある
set :rbenv_ruby、set :puma_state、set :puma_conf
- capistrano puma関連の設定
- 詳しくはこちらを参照 capistrano3でpumaの運用ー設定ファイルの管理どうする? - Qiita
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
- デフォルトだとproductionとして実行されるためstagingで使用したい場合はここで指定する
- (参考)Railsアプリを本番環境とステージング環境にデプロイ~capistrano-ext - Qiita
set :puma_env
- capistrano puma関連の設定
- (参照)capistrano3でpumaの運用ー設定ファイルの管理どうする? - Qiita
set :branch, 'master'
- マスターブランチしか無いため、ブランチを聞かないように設定
- (参考)ブランチを都度尋ねる設定
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }