Problema: o Apache / Passenger não reconhece o RVM
Eu tenho uma instalação multiusuário do RVM, de acordo com as instruções canônicas:
link
Eu editei /etc/profile.d/rvm.sh para incluir a seguinte linha para que o Ruby 1.9 seja a versão usada para todos os usuários logados:
rvm use --default 1.9.2
Eu tenho pelo menos 3 usuários no meu sistema:
-
ubuntu (o usuário padrão que uso para executar todas as tarefas interativas)
-
passageiro (este é o usuário para as tarefas de implantação)
-
www-data (este é presumivelmente o usuário que configuro para atender a solicitações httpd)
Quando conectado de forma interativa a ubuntu e passageiro , o seguinte retorna corretamente:
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
No entanto, o usuário www-data , que realmente atende a essas solicitações, nunca executa /etc/profile.d/rvm.sh (ou qualquer coisa no profile.d, para esse assunto). Como resultado, o seguinte acontece sempre quando conectado como usuário www-data:
$ ruby -v
ruby 1.8.7 (2010-08-16 patchlevel 302) [x86_64-linux]
Como resultado disso, o Bundler roda muito bem na minha sandbox de desenvolvimento com a versão correta do Ruby, mas craps com um tipo de erro "Não foi possível instalar o Gem on Ruby 1.8" ao executar:
$ cap deploy
<snip>
* executing "cd /var/www/app/releases/20111031001406 && bundle install --gemfile /var/www/app/releases/20111031001406/Gemfile --path /var/www/app/shared/bundle --deployment --quiet --without development test"
servers: ["example.com"]
[example.com] executing command
</snip>
(example.com e app são espaços reservados para meu servidor e aplicativo reais)
O erro que recebo é a melodia de "O gem do linecache requer o Ruby > 1.9)", que é como eu sei que o Ruby 1.9.2 não está rodando é o problema.
Como faço para o Apache reconhecer o RVM e a versão em Ruby que eu quero?
(O RVM e o Ruby que eu quero estão instalados, de acordo com o padrão multiusuário, dentro de / usr / local / rvm
Eu tenho seguido todas as instruções que consigo pensar muitas vezes, mas claramente sinto falta de algo aqui. Qualquer orientação aqui seria muito apreciada.
FWIW, este é o meu script de implantação do Capistrano:
# if you're still using the script/reapear helper you will need
# # these http://github.com/rails/irs_process_scripts
#
# # bundler bootstrap
require 'bundler/capistrano'
set :nice_name, "App"
set :application, "app"
set :domain, "example.com"
role :web, "#{domain}" # Your HTTP server, Apache/etc
role :app, "#{domain}" # This may be the same as your 'Web' server
role :db, "#{domain}", :primary => true # This is where Rails migrations will run
# # server details
set :default_run_options, {:pty => true}
set :ssh_options, {:forward_agent => true, :keys => "/path_to/ssh.key"}
#ssh_options[:keys] = [File.join(ENV["HOME"], ".ssh", "id_rsa")]
set :deploy_to, "/var/www/#{application}/"
set :user, "passenger"
set :use_sudo, false
# repo details
set :scm, :git
set :scm_username, "githubuser"
set :repository, "git://github.com/githubuser/app.git"
set :branch, "master"
set :git_enable_submodules, 1
# tasks
namespace :deploy do
task :start, :roles => :app do
run "touch #{current_release}/tmp/restart.txt"
end
task :stop, :roles => :app do
# Do nothing.
end
desc "Restart Application"
task :restart, :roles => :app do
run "touch #{current_release}/tmp/restart.txt"
end
desc "Symlink shared resources on each release - not used"
task :symlink_shared, :roles => :app do
#run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
end
namespace :passenger do
desc "Restart Application"
task :restart do
run "touch #{current_path}/tmp/restart.txt"
end
end
after :deploy, "passenger:restart"
after 'deploy:update_code', 'deploy:symlink_shared'