Хотя вы можете использовать инициализаторы, как и другие ответы, традиционным способом 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
и добавить эту функцию.
Ниже приведен фрагмент измененного билда, который я создал в своей компании:
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.
РЕДАКТИРОВАТЬ: собственная документация Heroku предлагает создать config/secrets.yml
для чтения из переменной среды, но это означает, что вы должны проверить этот файл в системе контроля версий. В моем случае это не работает, так как у меня есть жестко закодированные секреты для сред разработки и тестирования, которые я бы предпочел не регистрировать.