Хороший вопрос - я пробовал много разных вещей, но моя стратегия состоит в том, чтобы все было просто.
- Не используйте God или Monit или что-либо, что запускается от имени root, требуя, чтобы тот же пользователь, который запускает ваше приложение, имел права sudo для его перезапуска. Учитывая недавние события в области безопасности rails, последнее, что вам нужно, это то, чтобы у пользователя вашего приложения была хорошая возможность получить root.
- Вместо этого используйте задачу
rake
или thor
для запуска / остановки / перезапуска задач.
- Используйте
nohup
, чтобы демонизировать процесс.
Вот некоторые очень простые задачи, которые могут управлять простыми фоновыми задачами с помощью resque
, например:
class Resque < Thor
desc "start", "Starts resque workers"
def start
system('(PIDFILE=/tmp/resque-myapp.pid nohup rake resque:work QUEUES="*" &) &')
end
desc "stop", "Stops resque workers"
def stop
pidfile = '/tmp/resque-myapp.pid'
if File.exist?(pidfile)
pid = File.open(pidfile).first.to_i
puts "Killing process #{pid}..."
system("kill -QUIT #{pid}")
File.delete(pidfile)
sleep(5)
else
puts "No resque pidfile found"
end
end
end
Тогда в вашем deploy.rb
файле:
after 'deploy', "resque:restart"
namespace :resque do
task :restart do
puts "Stopping resque workers.."
run("cd #{current_path} && thor resque:stop", :options => { :pty => true })
puts "Starting resque workers.."
run("cd #{current_path} && thor resque:start > /dev/null 2>&1 &", :options => { :pty => true })
end
end
Эта стратегия может работать даже с RVM, если это интересно. Вам нужно что-то подобное перед командой перезагрузки, в дополнение к обычным rvm-capistrano
задачам:
after 'deploy:setup', 'thor:install'
namespace :thor do
task :install do
puts "Installing thor..."
run_locally('cap rvm:install_gem GEM=thor')
end
end
after "deploy", "rvm:trust_rvmrc"
namespace :rvm do
task :trust_rvmrc do
run "rvm rvmrc trust #{release_path}"
end
end
И, наконец, что не менее важно, с помощью RVM лучше поместить в ~/.bashrc
то, что установщик обычно разделяет между этим файлом и .bash_profile
, и убедитесь, что режим файла - 0400, чтобы он не перекрывался программа установки RVM:
PATH=$HOME/.rvm/bin:/usr/local/bin/:$PATH # Add RVM to PATH for scripting
export PATH
export RAILS_ENV=production
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"