rails deploy app ruby-on-rails deployment passenger capistrano

deploy - Configuración del entorno de la aplicación Ruby on Rails usando Capistrano en Phusion Passenger



passenger ruby nginx (4)

Tengo 2 entornos, producción y puesta en escena , y estoy usando Capistrano con gema capistrano-ext.

Cuando realizo la puesta en escena utilizando Capistrano y reinicio el pasajero, me gustaría que la aplicación implementada se ejecute en la preparación sin embargo, se ejecuta en la producción predeterminada

Intenté establecer:

set :rails_env, "staging"

en mi receta de despliegue, pero esto no tuvo efecto.

Soy consciente de que esto se puede hacer configurando un host virtual en Apache, pero estoy usando un alojamiento compartido, por lo que no tengo acceso. Mi anfitrión ofrece este consejo:

agregue lo siguiente a environment.rb: ENV [''RAILS_ENV''] = ''staging''

Pero esto no me ayuda a automatizar el proceso con Capistrano.


La forma correcta de resolver esto es configurar el entorno Rails en su configuración de pasajero. Obtenga su proveedor de alojamiento compartido para configurarlo para usted. En Apache se hace con la directiva RailsEnv.

Si REALMENTE no puede hacer eso, podría considerar colocar un TERRIBLE HACK como este en la parte superior del preinicializador de Rails (config / preinitializer):

forced_environment = ''./config/force_environment'' if File.exists?(forced_environment) ENV[''RAILS_ENV''] = File.new(forced_environment).readline.chomp end

... que establecerá el entorno antes de cargar Rails a la cadena en ese archivo config / force_environment. Para su servidor de escenario podría establecer ''escenario'' como el entorno.

Este es un terrible, terrible hack. Su experiencia puede ser diferente.


Lo que está haciendo cuando configura :rails_env, "staging" está configurando el entorno para la migración. En otras palabras, es un entorno que solo se establece cuando se está ejecutando Capistrano. Si lo entiendo correctamente, desea cambiar el entorno cuando ejecute su aplicación, no la implementación.

Para responder a su pregunta, necesitaré saber cómo está iniciando (iniciando) su aplicación.

Si está utilizando Phusion Passenger, deberá editar su RAILS_ENV para el pasajero

Dado que estás en un entorno compartido, probablemente querrás ir con la ruta .htaccess.


Lo que necesita es la directiva de entorno en su configuración nginx. Si está utilizando Apache, debería haber una directiva similar allí. (debería ser fácil de google)

server { listen 80; passenger_enabled on; rails_env staging; server_name foo.com; root /your/app/path; }

No se puede cambiar esto con solo capistrano.


Puede usar un gancho capistrano para crear archivos en el servidor o vincularlos desde, por ejemplo, shared/ cuando se implementa.

Para los carriles 2.3:

En su servidor web, cree el archivo shared/preinitializer.rb :

ENV[''RAILS_ENV''] = ''staging''

Luego agregue esto a su Capfile (o posiblemente config/deploy.rb si está usando una versión más nueva de capistrano con Rails 2.x)

after ''deploy:symlink'', ''localize:copy_shared_configurations'' namespace :localize do desc ''copy shared configurations to current'' task :copy_shared_configurations, :roles => [:app] do # I put database.yml here to keep deployed db credentials out of git %w[ preinitializer.rb ].each do |f| run "ln -nsf #{shared_path}/#{f} #{current_path}/config/#{f}" end end end

Para rieles 3

Debido a los cambios en la secuencia de inicialización de Rails 3, config/preinitializer.rb no se carga hasta que se carga config/environment.rb . Así que para Rails 3, desea modificar config/environment.rb solo en el servidor. Puede hacer esto con una configuración similar a la de Rails 2 anterior, pero utilizando una copia de enlace simbólico de config/environment.rb , y agregando el paso de eliminar el archivo existente antes de intentar establecer un enlace simbólico.

Otra opción sería sobrescribir el environment.rb en el servidor de capistrano. En su config/deploy.rb :

after ''deploy:symlink'', ''localize:munge_environment'' namespace :localize do desc ''munge environment.rb to set staging environment'' task :munge_environment, :roles => [:app] do new_env = "ENV[''RAILS_ENV''] = ''staging''/n" + File.read(Rails.root.join(''config'', ''environment.rb'')) put new_env, "#{current_path}/config/environment.rb" end end