Embora você possa usar inicializadores como as outras respostas, a maneira convencional do Rails 4.1+ é usar o config/secrets.yml
. A razão para a equipe do Rails introduzir isso está além do escopo desta resposta, mas o TL; DR é quesecret_token.rb
confunde configuração e código, além de ser um risco à segurança, pois o token é verificado no histórico de controle de origem e o único sistema que precisa ser implementado. conhecer o token secreto de produção é a infraestrutura de produção.
Você deve adicionar esse arquivo da .gitignore
mesma forma que não adicionariaconfig/database.yml
ao controle de origem.
Referenciando próprio código de Heroku para configurar config/database.yml
a partir DATABASE_URL
em sua Buildpack para Ruby , acabei bifurcação sua repo e modificado para criar config/secrets.yml
a partir deSECRETS_KEY_BASE
variável de ambiente.
Desde que esse recurso foi introduzido no Rails 4.1, achei apropriado editar ./lib/language_pack/rails41.rb
e adicionar essa funcionalidade.
A seguir, o snippet do buildpack modificado que criei na minha empresa:
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
Obviamente, você pode estender esse código para adicionar outros segredos (por exemplo, chaves de API de terceiros, etc.) para serem lidos em sua variável de ambiente:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
Dessa forma, você pode acessar esse segredo de uma maneira muito padrão:
Rails.application.secrets.third_party_api_key
Antes de reimplementar seu aplicativo, defina sua variável de ambiente primeiro:
Em seguida, adicione seu pacote de compilação modificado (ou você poderá adicionar um link ao meu) no seu aplicativo Heroku (consulte a documentação do Heroku ) e reimplemente seu aplicativo.
O buildpack criará automaticamente sua config/secrets.yml
variável de ambiente como parte do processo de construção do dyno toda vez que você git push
acessar o Heroku.
EDIT: A própria documentação do Heroku sugere criar config/secrets.yml
para ler a variável de ambiente, mas isso implica que você deve verificar esse arquivo no controle de origem. No meu caso, isso não funciona bem, pois tenho segredos codificados para ambientes de desenvolvimento e teste que prefiro não fazer check-in.