質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

Capistranoでrailsアプリをデプロイしようとするが、unicornで詰まってしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 9,864

yappari

score 16

前提・実現したいこと

http://qiita.com/zaru/items/9e02706b27094ce36902
こちらのサイトを参考にさせていただきまして、railsアプリのデプロイに挑戦しています。
ローカルのCentOSからさくらvpsへのデプロイです。

アプリ自体はrails new sample しただけの空っぽです。

$ bundle exec cap staging deploy:checkまでは成功しました。

発生している問題・エラーメッセージ

途中で、こんなエラーが出てしまいます。

bundler: failed to load command: unicorn (/var/www/myapp/shared/bundle/ruby/2.3.0/bin/unicorn)

該当のソースコード

$ bundle exec cap staging deploy

試したこと

手が出せません

補足のソースコード

Capfile

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

require 'sshkit/sudo'
# https://github.com/capistrano-plugins/capistrano-safe-deploy-to
require 'capistrano/safe_deploy_to'          # 追加

# rbenvを使用している場合
require 'capistrano/rbenv'

# デプロイ先のサーバで、ユーザディレクトリでrbenvをインストールしている場合
set :rbenv_type, :user
set :rbenv_ruby, '2.3.0'

require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

require 'capistrano3/unicorn'

# Rails4から分離したsecrets.ymlの環境変数を .envファイルで管理する
set :linked_files, %w{config/secrets.yml .env}

# タスクを読み込むけど、今回は特に使わない
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }


deploy.rb

lock '3.4.1'

set :application, 'sample'
set :repo_url, 'git@github.com:yappari/sample.git'
set :branch, 'master'
set :deploy_to, '/var/www/myapp'



set :scm, :git
set :log_level, :debug
set :pty, true
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}
set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }
set :keep_releases, 5

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do

  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart'
  end
end


追加
ログ

INFO [47bc3a49] Running $HOME/.rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/myapp/current/config/unicorn/staging.rb -E staging -D  as yappari@(ipアドレス)
 DEBUG [47bc3a49] Command: cd /var/www/myapp/current && ( export PATH="/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="2.3.0" RAILS_ENV="staging" ; $HOME/.rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/myapp/current/config/unicorn/staging.rb -E staging -D  )
 DEBUG [47bc3a49]       bundler: failed to load command: unicorn (/var/www/myapp/shared/bundle/ruby/2.3.0/bin/unicorn)


config/unicorn/staging.rb

@app_path = '/var/www/myapp'
working_directory @app_path + "/current"

worker_processes 2
preload_app true
timeout 30
listen "/tmp/unicorn.sock", :backlog => 64
pid "/var/www/myapp/shared/tmp/pids/unicorn.pid"

stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', ENV['RAILS_ROOT'])
end

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end


config/deploy/staging.rb

set :rails_env, "staging"
set :unicorn_rack_env, "staging"
set :deploy_to, '/var/www/myapp'

user = "yappari"
ipaddress = "(ipアドレス)"

role :app, ["#{user}@#{ipaddress}"]
role :web, ["#{user}@#{ipaddress}"]
role :db,  ["#{user}@#{ipaddress}"]

server '(ipアドレス)', user: 'yappari', roles: %w{web app}

set :ssh_options, {
  keys: %w(/home/vagrant/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey),
  port: (ポート番号)
}


どうかお力を貸していただけないでしょうか?

情報を追加いたしました。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • rifuch

    2016/06/16 00:31

    Capfile(特にrequire周り)とdeploy.rbのサンプルを見せていただけますか?現状では情報不足です。

    キャンセル

  • rifuch

    2016/06/16 11:43

    失敗する所の前のログはどうなっていますか?
    DEBUGモードなら、RuninngとCommand:の行に実際に発行されたコマンドがあるはずです。

    キャンセル

回答 2

check解決した方法

+2

config/unicorn/staging.rbの中の

before_fork do |server, worker|
ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', ENV['RAILS_ROOT'])
end
の部分を
root = "/var/www/myapp/current"
before_exec do |server|
ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile"
end
に書き換えたところ…成功しました。
参考(http://qiita.com/ironsand/items/1bc21f29a590b6f2bb1f)

rifuchさんの仰るとおり、bundle:installがうまくいっていなかったんだと思われます…。
(Gemfileのパスが間違ってた?)

アドバイスのおかげで、なんとかなりました。ありがとうございます。
精進いたします…。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/17 21:58

    無事解決して良かったです。おつかれ様でした

    キャンセル

+1

rbenv環境はいじった事がないので、ちょっと自信が無いですが

bundle execのパスがAPP_ROOT/shared/bundleを指していないのでdeployで行われるbundle:installが有効ではないのでは?というのが予想です。
GEM_HOME,GEM_PATHにAPP_ROOT/shared/bundleあたりのパスを追加するか、
deploy前に、シェルからbundle installして、/usr/local/rbenv/以下にgemがインストールされるようにするかしてみてはどうでしょうか。
(rvmでは、capistranoがbundle execする前に、毎回rvmが参照するgemのパスを設定するためのスクリプトが動いています。APP_ROOT/rvm1scripts/rvm-auto.sh RVM_VERSION bundle exec ... rbenvではどうなのでしょうか)

上記がどうも外しているようであれば、system側にunicornをインストールするために、rbenvsudo gem install unicornとかして見るのも一つの手かもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる