Mentre puoi usare gli inizializzatori come le altre risposte, il modo convenzionale di Rails 4.1+ è usare config/secrets.yml
. Il motivo per cui il team di Rails ha introdotto questo aspetto va oltre lo scopo di questa risposta, ma TL; DR è che secret_token.rb
confonde configurazione e codice, oltre a costituire un rischio per la sicurezza poiché il token viene verificato nella cronologia del controllo del codice sorgente e l'unico sistema che deve sapere che il token segreto di produzione è l'infrastruttura di produzione.
Dovresti aggiungere questo file in .gitignore
modo simile a come non aggiungeresti nemmeno config/database.yml
al controllo del codice sorgente.
Facendo riferimento al codice di Heroku per la configurazione config/database.yml
da DATABASE_URL
nel loro Buildpack per Ruby , ho finito per il fork del loro repository e l'ho modificato per creare config/secrets.yml
dalla SECRETS_KEY_BASE
variabile d'ambiente.
Da quando questa funzionalità è stata introdotta in Rails 4.1, ho ritenuto opportuno modificare ./lib/language_pack/rails41.rb
e aggiungere questa funzionalità.
Di seguito è riportato lo snippet del buildpack modificato che ho creato nella mia azienda:
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
Ovviamente puoi estendere questo codice per aggiungere altri segreti (ad esempio chiavi API di terze parti, ecc.) Da leggere dalla variabile di ambiente:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
In questo modo, puoi accedere a questo segreto in un modo molto standard:
Rails.application.secrets.third_party_api_key
Prima di ridistribuire l'app, assicurarsi di impostare prima la variabile di ambiente:
Quindi aggiungi il tuo buildpack modificato (o sei più che benvenuto per collegarti al mio) alla tua app Heroku (vedi la documentazione di Heroku ) e ridistribuisci la tua app.
Il buildpack creerà automaticamente il tuo config/secrets.yml
dalla tua variabile d'ambiente come parte del processo di compilazione del dyno ogni volta che vai git push
su Heroku.
EDIT: la stessa documentazione di Heroku suggerisce di creare config/secrets.yml
una lettura dalla variabile d'ambiente ma questo implica che dovresti controllare questo file nel controllo del codice sorgente. Nel mio caso, questo non funziona bene dal momento che ho segreti hardcoded per ambienti di sviluppo e test che preferirei non fare il check-in.