2011-08-25 17 views
7

Tengo una aplicación de Rails que usa Amazon S3 para almacenar los archivos adjuntos de Paperclip. Mi archivo database.yml especifica diferentes cubos S3 para desarrollo, prueba y producción.Diferentes cubos S3 para la aplicación de etapas frente a la aplicación de producción

Tengo dos aplicaciones en Heroku: una aplicación de producción y una 'aplicación de etapas' para probar el código en el prelanzamiento de la plataforma.

El sistema actual tiene un defecto importante: utiliza el mismo cucharón S3 para la preparación y producción. ¿Cómo puedo configurar mi sistema para que use diferentes cubos dependiendo esencialmente de si escribo git push production master o git push staging master?

+0

¿cómo se escribe su clip conf? – apneadiving

+0

Apnea, ¿de qué archivo está hablando? – sscirrus

+0

en sus modelos, ¿cómo pasa su configuración s3 a clip? – apneadiving

Respuesta

12

Heroku le permite configurar lo que quiera a través de variables de entorno persistentes que cada dyno/proceso en una aplicación se inicia. Las variables de entorno no se comparten entre las versiones de producción y producción de la misma aplicación. Aprovecha esto

has_attached_file :photo, 
    :styles => ..., 
    :path => ..., 
    :storage => :s3, 
    :bucket => ENV['S3_BUCKET'], # <--- over here 
    :s3_credentials => { 
    :access_key_id => ENV['S3_KEY'], 
    :secret_access_key => ENV['S3_SECRET'] 
    } 

continuación:

# Configure the "staging" instance 
$ heroku config:add \ 
    RACK_ENV=production \ 
    S3_KEY=my-staging-key \ 
    S3_SECRET=my-staging-secret \ 
    S3_BUCKET=my-staging-bucket \ 
    --app my-staging-app-name 

# Configure the "production" instance 
$ heroku config:add \ 
    RACK_ENV=production \ 
    S3_KEY=my-production-key \ 
    S3_SECRET=my-production-secret \ 
    S3_BUCKET=my-production-bucket \ 
    --app my-production-app-name 

Tenga en cuenta que cada instancia de su aplicación tiene un RACK_ENV=production. No utilice entornos Rails para diferenciar entre instancias de su aplicación. Por el contrario, su aplicación debe esperar que las variables de entorno se utilicen para configurar aspectos específicos de la instancia.

+0

Sí, configuré 'RACK_ENV = production' en la instancia de" preparación ". Esto se debe a que, en Heroku, puede usar las variables de entorno para toda su configuración. No necesita la ayuda de los entornos de Rails para esto. En su 'producción.rb' puede, por supuesto, establecer una propiedad en función de la presencia, ausencia o valor de una variable de entorno, y esto es lo que debe hacer en su entorno de" estadificación "de Heroku. – yfeldblum

+0

¡Gracias por esta respuesta súper útil! Mi pregunta es cuando trato de cambiar el entorno usando RACK_ENV = development y RAILS_ENV = development, sigo recibiendo errores que dicen 'Error R10 (Boot timeout) -> El proceso web no se pudo vincular a $ PORT dentro de los 60 segundos posteriores al lanzamiento' ¿porqué es eso? –

1

Establecer configuración: agregar RACK_ENV = puesta en escena en su caja de transición, y luego en su código puede especificar el cucharón dependiendo del entorno. Por ejemplo:

if Rails.env.production? 
    has_attached_file :photo, 
    :styles => ..., 
    :path => ..., 
    :storage => :s3, 
    :bucket => 'your_prod_bucket', 
    :s3_credentials => { 
     :access_key_id => ENV['S3_KEY'], 
     :secret_access_key => ENV['S3_SECRET'] 
    } 
    else 
    has_attached_file :photo, 
    :styles => ..., 
    :path => ..., 
    :storage => :s3, 
    :bucket => 'your_staging_bucket', 
    :s3_credentials => { 
     :access_key_id => ENV['S3_KEY'], 
     :secret_access_key => ENV['S3_SECRET'] 
    } 

    end 

Este post heroku también parecen sugerir que se puede lograr esto simplemente mediante el uso de diferentes credenciales s3 para la estadificación y la producción. Supongo que tendrías que hacer alguna configuración por parte de Amazon también. De todos modos, eche un vistazo para ver si ayuda. http://devcenter.heroku.com/articles/config-vars

+3

Guardaría las credenciales en config/environments/y evitaría la lógica condicional que podría estar dispersa en todo el código. – d11wtq

Cuestiones relacionadas