DesignAssembler

備忘録に近い

CapistranoでAWS(nginx+unicorn)にデプロイ

Capistrano

Ruby製のデプロイツールです。

編集したファイル

アプリケーション側

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

サーバー側

/etc/nginx/conf.d/myapp.conf

実際の編集は以下のサイトを参考にしました。ありがとうございます。

qiita.com

設定

config/secrets.ymlとconfig/database.ymlをshared/config/にコピーします。

config/deploy.rbに以下を追加します

set :linked_files, %w{ config/database.yml config/secrets.yml }

以下のコマンドでapp_root/sharedディレクトリを作成します。

$ cap deploy:check:make_linked_dirs

コピーのためのタスクを作りました。

lib/capistrano/tasks/cp_config_files.rakeを新規作成します。

#lib/capistrano/tasks/cp_config_files.rake
namespace :cp_config_files 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 cp_files
    root_dir = '/home/ec2-user/rails_app'
    within current_path do
      execute "cp #{root_dir}/config/database.yml #{root_dir}/shared/config/database.yml;cp #{root_dir}/config/secrets.yml #{root_dir}/shared/config/secrets.yml"
    end
  end

 desc "cp database.yml & secrets.yml"
  task :cp => :environment do
    on roles(:app) do
      cp_files
    end
  end
end

以下のコマンドでタスクcap cp_config_files:cp が作成されているか確認します。

$ cap --tasks

確認できれば以下のコマンドで実行します。

$ cap staging cp_config_files:cp

これでshared/configにファイルが配置されました。

次のコマンドでシムリンクを張ります。

$ cap staging deploy:symlink:linked_files

以下のコマンドでデプロイします。

bundle exec cap staging deploy

これでデプロイはできますが、デプロイ中のbundle installにやたらと時間がかかるのでチューニングが必要です。

出たエラー

shared/config/database.ymlとsecrets.ymlがないと怒られる

ERROR linked file /home/ec2-user/rails_app/shared/config/database.yml does not exist on 52.24.77.156

ruby on rails - Capistrano: linked file database.yml does not exist on my.server.ipadress - Stack Overflow

手でやれとの事・・・・

上述の通りタスクを作りました。

参考

totutotu.hatenablog.com