Хоча ви можете використовувати ініціалізатори, як і інші відповіді, звичайним способом Rails 4.1+ є використання config/secrets.yml
. Причина, щоб команда Rails представила це, виходить за межі цієї відповіді, але TL; DR полягає в тому, що secret_token.rb
конфігурує конфігурацію та код, а також є ризиком для безпеки, оскільки маркер перевіряється в історію управління джерелами і єдина система, якій потрібно знати виробничий секретний знак - це виробнича інфраструктура.
Ви повинні додати цей файл .gitignore
так, як ви також не додали його config/database.yml
до джерела управління.
Посилаючись на власний код Heroku для налаштування config/database.yml
з DATABASE_URL
його Buildpack для Ruby , я закінчив форкінг їх репо і змінив його, щоб створити config/secrets.yml
з SECRETS_KEY_BASE
змінної середовища.
Оскільки ця функція була введена в Rails 4.1, я вважав за доцільне відредагувати ./lib/language_pack/rails41.rb
та додати цю функціональність.
Нижче наведено фрагмент модифікованого buildpack, який я створив у своїй компанії:
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
Звичайно, ви можете розширити цей код, щоб додати інші секрети (наприклад, сторонні ключі API тощо), які слід зчитувати зі змінної вашого середовища:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
Таким чином, ви можете отримати доступ до цієї таємниці дуже стандартним способом:
Rails.application.secrets.third_party_api_key
Перш ніж перерозподілити додаток, не забудьте спочатку встановити змінну середовища:
Потім додайте модифікований пакунок збірки (або ви більше ніж ласкаво просимо зв’язатись з моїм) у свій додаток Heroku (див. Документацію Heroku ) та переустановіть свою програму.
Пакет нарощування автоматично створить вашу config/secrets.yml
зі змінної середовища як частину процесу складання dyno кожного разу, коли ви перейдете git push
на Heroku.
EDIT: Власна документація Heroku пропонує створити config/secrets.yml
для читання з змінної середовища, але це означає, що ви повинні перевірити цей файл у контролі джерела. У моєму випадку це не працює добре, оскільки у мене є жорсткі секрети для розробки та тестування середовищ, які я краще не перевіряю.