Während Sie Initialisierer wie die anderen Antworten verwenden können, besteht die herkömmliche Methode von Rails 4.1+ darin, die zu verwenden config/secrets.yml
. Der Grund für das Rails-Team, dies einzuführen, liegt außerhalb des Rahmens dieser Antwort, aber der TL; DR besteht darin, dass secret_token.rb
Konfiguration und Code zusammengeführt werden und ein Sicherheitsrisiko darstellt, da das Token in den Versionsverwaltungsverlauf eingecheckt wird und das einzige System ist, das dies benötigt Ich weiß, dass das Produktionsgeheimnis die Produktionsinfrastruktur ist.
Sie sollten diese Datei .gitignore
so hinzufügen config/database.yml
, als würden Sie sie auch nicht zur Quellcodeverwaltung hinzufügen .
Referenzierung Heroku eigenen Code für die Einrichtung config/database.yml
von DATABASE_URL
ihrer Buildpack für Ruby , landete ich ihre Repo - gabeln und modifiziert es schaffen config/secrets.yml
von SECRETS_KEY_BASE
Umgebungsvariablen.
Da diese Funktion in Rails 4.1 eingeführt wurde, hielt ich es für angemessen, ./lib/language_pack/rails41.rb
diese Funktionalität zu bearbeiten und hinzuzufügen.
Das Folgende ist der Ausschnitt aus dem modifizierten Buildpack, das ich in meiner Firma erstellt habe:
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
Sie können diesen Code natürlich erweitern, um andere Geheimnisse (z. B. API-Schlüssel von Drittanbietern usw.) hinzuzufügen, die aus Ihrer Umgebungsvariablen ausgelesen werden sollen:
...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>
Auf diese Weise können Sie auf ganz normale Weise auf dieses Geheimnis zugreifen:
Rails.application.secrets.third_party_api_key
Stellen Sie vor dem erneuten Bereitstellen Ihrer App sicher, dass Sie zuerst Ihre Umgebungsvariable festlegen:
Fügen Sie dann Ihr modifiziertes Buildpack (oder Sie können gerne einen Link zu meinem erstellen) zu Ihrer Heroku-App hinzu (siehe Herokus Dokumentation ) und stellen Sie Ihre App erneut bereit.
Das Buildpack erstellt Ihre config/secrets.yml
Variable automatisch als Teil des Dyno- Erstellungsprozesses aus Ihrer Umgebungsvariablen, wenn Sie git push
zu Heroku gehen.
BEARBEITEN: Herokus eigene Dokumentation schlägt vor, config/secrets.yml
aus der Umgebungsvariablen zu lesen, dies bedeutet jedoch, dass Sie diese Datei in die Quellcodeverwaltung einchecken sollten. In meinem Fall funktioniert dies nicht gut, da ich Geheimnisse für Entwicklungs- und Testumgebungen fest codiert habe, die ich lieber nicht einchecken möchte.