2011-08-25 48 views
7

Tôi có ứng dụng Rails sử dụng Amazon S3 để lưu trữ tệp đính kèm Paperclip. Tệp database.yml của tôi chỉ định các nhóm S3 khác nhau để phát triển, thử nghiệm và sản xuất.Xô S3 khác nhau cho ứng dụng dàn dựng và ứng dụng sản xuất

Tôi có hai ứng dụng trên Heroku - một ứng dụng sản xuất và 'ứng dụng dàn dựng' để thử nghiệm mã trên nền tảng trước khi ra mắt.

Hệ thống hiện tại có lỗ hổng quan trọng - nó sử dụng cùng một thùng S3 để dàn dựng và sản xuất. Làm cách nào tôi có thể thiết lập hệ thống của mình để sử dụng các nhóm khác nhau tùy thuộc vào việc tôi viết git push production master hoặc git push staging master?

+0

làm thế nào để bạn viết conf kẹp giấy? – apneadiving

+0

Ngưng thở, bạn đang nói về tập tin nào? – sscirrus

+0

trong các mô hình của bạn, làm thế nào để bạn vượt qua cấu hình s3 của bạn để kẹp giấy? – apneadiving

Trả lời

12

Heroku cho phép bạn định cấu hình bất cứ điều gì bạn thích qua biến môi trường liên tục mà mọi dyno/quy trình trong một ứng dụng được bắt đầu. Các biến môi trường không được chia sẻ giữa các phiên bản dàn dựng và sản xuất của cùng một ứng dụng. Tận dụng điều này.

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'] 
    } 

Sau đó:

# 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 

Lưu ý rằng mỗi thể hiện của ứng dụng của bạn có một RACK_ENV=production. Không sử dụng môi trường Rails để phân biệt giữa các phiên bản của ứng dụng của bạn. Thay vào đó, ứng dụng của bạn sẽ mong đợi rằng các biến môi trường được sử dụng để cấu hình các khía cạnh cụ thể của từng cá thể.

+0

Có, tôi đặt 'RACK_ENV = production' trong thể hiện" dàn dựng ". Điều này là do, trên Heroku, bạn có thể sử dụng các biến môi trường cho tất cả cấu hình của bạn. Bạn không cần sự trợ giúp của môi trường Rails cho việc này. Trong 'production.rb' của bạn, bạn có thể thiết lập một thuộc tính dựa trên sự hiện diện, vắng mặt, hoặc giá trị của một biến môi trường, và đây là những gì bạn nên làm trong môi trường" dàn dựng "Heroku của bạn. – yfeldblum

+0

Cảm ơn câu trả lời hữu ích này! Câu hỏi của tôi là khi tôi cố gắng thay đổi môi trường bằng cách sử dụng RACK_ENV = development và RAILS_ENV = development, tôi tiếp tục nhận được lỗi có nội dung 'Error R10 (Boot timeout) -> Web process không liên kết với $ PORT trong vòng 60 giây khởi chạy,' tại sao vậy? –

1

Đặt cấu hình: thêm RACK_ENV = dàn dựng trên hộp dàn trang của bạn và sau đó trong mã của bạn, bạn có thể chỉ định nhóm tùy thuộc vào môi trường. Ví dụ:

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 

Bài đăng heroku này cũng dường như gợi ý rằng bạn có thể đạt được điều này đơn giản bằng cách sử dụng thông tin xác thực s3 khác để dàn dựng và sản xuất. Tôi đoán bạn sẽ phải làm một số cấu hình trên mặt của amazon là tốt. Dù sao, hãy xem liệu nó có giúp ích gì không. http://devcenter.heroku.com/articles/config-vars

+3

Tôi sẽ lưu trữ thông tin đăng nhập trong cấu hình/môi trường/và tránh logic điều kiện có khả năng phân tán trong toàn bộ mã. – d11wtq

Các vấn đề liên quan