0
votes

I deploying rails project using capistrano 3.0

ror + nginx + unicorn

deploy is so not bad.

but server died during unicorn restart time.

1~2 second died server..

I dont know what i todo..

this is my deploy.rb source..

# -*- encoding : utf-8 -*-
# config valid only for Capistrano 3.1
lock '3.1.0'

require 'unicorn'

#set :whenever_command, "bundle exec whenever"
#require "whenever/capistrano"

set :application, 'projectname'
# Default branch is :master
# ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

# Default deploy_to directory is /var/www/my_app
# set :deploy_to, '/var/www/my_app'

# Default value for :scm is :git
 set :scm, :git

set :repo_url, '[email protected]:gitURL'
# Default value for :format is :pretty
set :branch,  'master'
set :deploy_via, :remote_cache
# set :format, :pretty

# Default value for :log_level is :debug
# set :log_level, :debug

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
# set :linked_files, %w{config/database.yml}

# Default value for linked_dirs is []
# set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

# Default value for default_env is {}
set :default_env, { path: "/root/.rbenv/versions/2.1.0/lib/ruby/gems:/root/.rbenv/versions/2.1.0/bin:$PATH" }
#set :current_deploy_path, "DEPLOY_PATH"

# Default value for keep_releases is 5
# set :keep_releases, 5


set :ssh_options, { :forward_agent => true}
set :user, "user"
set :password, "passwod"


namespace :whenever do
  task :start do 
    on roles(:app) do
      execute("cd #{fetch :current_deploy_path}")
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :bundle, 'exec whenever --update-crontab'
        end
      end
    end
  end
end

namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      # execute :touch, release_path.join('tmp/restart.txt')
    end
  end

  after :publishing, :restart

  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

 before 'deploy:assets:precompile', :link_assets
 task :link_assets do
    on roles(:app), :roles => :app, :except => { :no_release => true } do
      execute("ln -fs #{shared_path}/database.yml #{release_path}/config/database.yml")
    end
  end


#before 'deploy:publishing', :kill_unicorns

  task :kill_unicorns do
    on roles(:app), in: :sequence, wait: 3 do
      execute("if [ -f #{fetch :current_deploy_path}/tmp/pids/unicorn.pid ]; then kill -s QUIT `cat #{fetch :current_deploy_path}/tmp/pids/unicorn.pid`; fi")
    end
  end

  task :make_unicorn do
    on roles(:app), in: :sequence, wait: 3 do
      execute :mkdir, '-p', "#{fetch :current_deploy_path}/tmp/pids"
      execute("cd #{fetch :current_deploy_path}")
      execute("if [ -f #{shared_path}/unicorn.pid ]; then kill -s QUIT `cat #{shared_path}/unicorn.pid`; fi")
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :bundle, 'exec unicorn -D -c config/unicorn.rb -E production'
        end
      end
      execute("cp #{fetch :current_deploy_path}/tmp/pids/unicorn.pid #{shared_path}/unicorn.pid")
    end
 end


#  desc "Update the crontab file"
#  task :update_crontab do #, :roles => :db do
#    on roles(:app), in: :sequence, wait: 3 do
#      execute("cd #{release_path} && bundle exec whenever --update-crontab #{application}")
#    end
#  end

 # after 'deploy:publishing', :kill_unicorns
  after 'deploy:publishing', :make_unicorn
  after 'deploy:finishing', 'whenever:start'

end

and this is my deploy/production.rb

set :domain, "14.63.165.216"
set :rails_env, "production"
set :current_deploy_path, "/geuinea_pig/priday/current"
# Extended Server Syntax
# ======================
# This can be used to drop a more detailed server
# definition into the server list. The second argument
# something that quacks like a hash can be used to set
# extended properties on the server.
server '14.63.165.216', user: 'root', roles: %w{web app db}, primary: true#, my_property: :my_value



set :deploy_to, '/geuinea_pig/priday'
set :ssh_options, {
    user: 'root', # overrides user setting above
    #     keys: %w(/home/user_name/.ssh/id_rsa),
    forward_agent: false,
    #auth_methods: %w(publickey password),
    auth_methods: %w(password),
    password: 'dPffhdPffh1!'
}

this is deploy log in capistrano log

INFO [193203be] Running /usr/bin/env if [ -f /path/shared/unicorn.pid ]; then kill -s QUIT `cat /path/shared/unicorn.pid`; fi on 14.63.165.216
DEBUG [193203be] Command: if [ -f /path/shared/unicorn.pid ]; then kill -s QUIT `cat /path/shared/unicorn.pid`; fi
#---------------------------------
#THIS TIME DIED SERVER 2~3 second 
#---------------------------------
INFO [193203be] Finished in 0.227 seconds with exit status 0 (successful).
DEBUG [05a0c865] Running /usr/bin/env if test ! -d /path/releases/20140706164800; then echo "Directory does not exist '/path/releases/20140706164800'" 1>&2; false; fi on 14.63.165.216
DEBUG [05a0c865] Command: if test ! -d /path/releases/20140706164800; then echo "Directory does not exist '/path/releases/20140706164800'" 1>&2; false; fi
DEBUG [05a0c865] Finished in 0.229 seconds with exit status 0 (successful).
INFO [3cf3c052] Running /usr/bin/env bundle exec unicorn -D -c config/unicorn.rb -E production on 14.63.165.216
DEBUG [3cf3c052] Command: cd /path/releases/20140706164800 && ( PATH=/root/.rbenv/versions/2.1.0/lib/ruby/gems:/root/.rbenv/versions/2.1.0/bin:$PATH RAILS_ENV=production /usr/bin/env bundle exec unicorn -D -c config/unicorn.rb -E production )
INFO [3cf3c052] Finished in 1.061 seconds with exit status 0 (successful).
INFO [07718210] Running /usr/bin/env cp /path/current/tmp/pids/unicorn.pid /path/shared/unicorn.pid on 14.63.165.216
DEBUG [07718210] Command: cp /path/current/tmp/pids/unicorn.pid /path/shared/unicorn.pid
INFO [07718210] Finished in 0.197 seconds with exit status 0 (successful).
1
what about the server logs? - Uri Agassi
Was there an error message in the unicorn error logs anywhere? - jefflunt
UHH are you aware that have you just given everyone root SSH access to your server? - hdgarrood
You need to a) change that password RIGHT NOW. b) disable root SSH access c) switch to key authentication - hdgarrood

1 Answers

0
votes

I would suggest a slower start on Capistrano, if you're new to it? I find it challenging. In fact, I think you're way beyond me. There are so many little things that can go wrong and the logs/output can be a bit overwhelming that I try some simpler cap tasks. I create a weird directory under the home of my deployer user and then run this:

task :dir_exists do
  ask(:dir_to_test, "$home")
  on roles(:all) do |host|
    if test("[ -d #{fetch(:dir_to_test)} ]")
      info "Phew, it's ok, the directory exists!"
    else
      info "Directory #{fetch(:dir_to_test)} does not exist"
    end
  end
end

If that runs, at least I know that I'm communicating with the server and can run things. I had big problems at first mostly having to do with the authentication. I didn't get the whole ssh-add thing. Even yesterday I had to run some new commands on my database and it took me a about two hours to figure out that my syntax was complete crap.

Anyway, the more specific you can be about what is going wrong, the more help that will be offered. By the way, do you really have a top-level directory called "/geuinea_pig/friday/current"? If all of this is capistrano, maybe save these files off and start simpler? I say that because my deploy is alot simpler, maybe you don't need all that? Also, won't backtick execution happen on the local machine (you have backtick cat /path/shared/unicorn.pid backtick)?

Anyway, good luck!