Mặc dù bạn có thể sử dụng các công cụ khởi tạo như các câu trả lời khác, cách Rails 4.1+ thông thường là sử dụng config/secrets.yml
. Lý do để nhóm Rails giới thiệu điều này nằm ngoài phạm vi của câu trả lời này, nhưng TL; DR là secret_token.rb
liên kết cấu hình và mã cũng như rủi ro bảo mật vì mã thông báo được kiểm tra trong lịch sử kiểm soát nguồn và hệ thống duy nhất cần phải biết mã thông báo bí mật sản xuất là cơ sở hạ tầng sản xuất.
Bạn nên thêm tệp này vào .gitignore
giống như bạn sẽ không thêm config/database.yml
vào kiểm soát nguồn.
Tham khảo mã riêng Heroku của lập config/database.yml
từ DATABASE_URL
trong họ Buildpack cho Ruby , tôi đã kết thúc forking repo của họ và sửa đổi nó để tạo ra config/secrets.yml
từ SECRETS_KEY_BASE
biến môi trường.
Vì tính năng này được giới thiệu trong Rails 4.1, tôi cảm thấy nó phù hợp để chỉnh sửa ./lib/language_pack/rails41.rb
và thêm chức năng này.
Sau đây là đoạn trích từ gói xây dựng đã sửa đổi mà tôi đã tạo tại công ty của mình:
class LanguagePack::Rails41 < LanguagePack::Rails4
# ...
def compile
instrument "rails41.compile" do
super
allow_git do
create_secrets_yml
end
end
end
# ...
# writes ERB based secrets.yml for Rails 4.1+
def create_secrets_yml
instrument 'ruby.create_secrets_yml' do
log("create_secrets_yml") do
return unless File.directory?("config")
topic("Writing config/secrets.yml to read from SECRET_KEY_BASE")
File.open("config/secrets.yml", "w") do |file|
file.puts <<-SECRETS_YML
<%
raise "No RACK_ENV or RAILS_ENV found" unless ENV["RAILS_ENV"] || ENV["RACK_ENV"]
%>
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
SECRETS_YML
end
end
end
end
# ...
end
Tất nhiên, bạn có thể mở rộng mã này để thêm các bí mật khác (ví dụ: khóa API của bên thứ ba, v.v.) để được đọc khỏi biến môi trường của bạn:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
Bằng cách này, bạn có thể truy cập bí mật này theo một cách rất chuẩn:
Rails.application.secrets.third_party_api_key
Trước khi triển khai lại ứng dụng của bạn, hãy đảm bảo đặt biến môi trường của bạn trước:
Sau đó, thêm gói xây dựng đã sửa đổi của bạn (hoặc bạn được chào đón để liên kết với tôi) vào ứng dụng Heroku của bạn (xem tài liệu của Heroku ) và triển khai lại ứng dụng của bạn.
Buildpack sẽ tự động tạo của bạn config/secrets.yml
từ biến môi trường của bạn như là một phần của quy trình xây dựng dyno mỗi khi bạn git push
đến Heroku.
EDIT: Tài liệu riêng của Heroku đề nghị tạo config/secrets.yml
để đọc từ biến môi trường nhưng điều này ngụ ý bạn nên kiểm tra tệp này trong kiểm soát nguồn. Trong trường hợp của tôi, điều này không hoạt động tốt vì tôi có các bí mật được mã hóa cứng cho các môi trường phát triển và thử nghiệm mà tôi không muốn kiểm tra.