Si bien puede usar inicializadores como las otras respuestas, la forma convencional de Rails 4.1+ es usar el config/secrets.yml
. La razón para que el equipo de Rails presente esto está más allá del alcance de esta respuesta, pero el TL; DR es que secret_token.rb
combina la configuración y el código, además de ser un riesgo de seguridad, ya que el token se registra en el historial de control de fuente y el único sistema que necesita Conocer el token secreto de producción es la infraestructura de producción.
Debería agregar este archivo .gitignore
como tampoco lo haría config/database.yml
con el control de origen.
Haciendo referencia al propio código de Heroku para configurar config/database.yml
desde DATABASE_URL
su Buildpack para Ruby , terminé bifurcando su repositorio y lo modifiqué para crear config/secrets.yml
desde SECRETS_KEY_BASE
la variable de entorno.
Dado que esta característica se introdujo en Rails 4.1, sentí que era apropiado editar ./lib/language_pack/rails41.rb
y agregar esta funcionalidad.
El siguiente es el fragmento del paquete de compilación modificado que creé en mi 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
Por supuesto, puede extender este código para agregar otros secretos (por ejemplo, claves API de terceros, etc.) para que se lean de su variable de entorno:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
De esta manera, puede acceder a este secreto de una manera muy estándar:
Rails.application.secrets.third_party_api_key
Antes de volver a implementar su aplicación, asegúrese de configurar primero su variable de entorno:
A continuación, agregue su paquete de compilación modificado (o sea más que bienvenido a vincular el mío) a su aplicación Heroku (consulte la documentación de Heroku ) y vuelva a implementar su aplicación.
El paquete de compilación creará automáticamente su config/secrets.yml
variable de entorno como parte del proceso de compilación de dinamómetro cada vez que vaya git push
a Heroku.
EDITAR: la propia documentación de Heroku sugiere crear config/secrets.yml
para leer desde la variable de entorno, pero esto implica que debe verificar este archivo en el control de origen. En mi caso, esto no funciona bien ya que tengo secretos codificados para entornos de desarrollo y prueba que prefiero no registrar.