さて、前回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の設定、そしてデプロイへ・・・))
まとめ
まー色々と書いてきましたが、結局何が言いたかったかというと、
メモだから
ってことです。
色々書きましたが、正直良く分かってません。
なので、これでミスったとか、起動しないとか、そういう場合はあきらめてください。
これはメモなんだ、個人のメモなんだ、そう言い聞かせて、心を落ち着かせてもらえると幸いです。
プログラミングって難しいですよね。
改めて感じた次第でした。
コメント