wake-up-neo.com

Wie löse ich den Fehler "Fehlende` secret_key_base` für 'Produktionsumgebung' "(Rails 4.1)

Ich habe eine Rails App (Rails 4.1) von Grund auf neu erstellt und stehe vor einem seltsamen Problem, das ich nicht lösen kann.

Jedes Mal, wenn ich versuche, meine App auf Heroku bereitzustellen, erhalte ich die Fehlermeldung 500:

Fehlendes secret_key_base für die 'Produktions'-Umgebung setzen Sie diesen Wert in config/secrets.yml

Die Datei secret.yml enthält die folgende Konfiguration:

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Auf Heroku habe ich eine Umgebungsvariable "SECRET_KEY_BASE" mit dem Ergebnis des Befehls "Rake Secret" konfiguriert. Wenn ich "heroku config" starte, kann ich die Variable mit dem richtigen Namen und Wert sehen.

Warum erhalte ich immer noch diesen Fehler?

Danke vielmals

158
Paolo Laurenti

Ich hatte das gleiche Problem und löste es, indem ich jedes Mal, wenn ich mich beim Produktionsserver anmeldete, eine Umgebungsvariable zum Laden erstellte und eine Kurzanleitung zu den Schritten zur Konfiguration erstellte:

https://Gist.github.com/pablosalgadom/4d75f30517edc6230a67

Ich habe Rails 4.1 mit Unicorn v4.8.2 verwendet, als ich versuchte, meine App bereitzustellen, wurde sie nicht richtig gestartet und in der Unicorn.log-Datei fand ich folgende Fehlermeldung:

app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)

Nach einigen Recherchen habe ich herausgefunden, dass Rails 4.1 die Verwaltung des secret_key geändert hat. Wenn Sie also die Datei secrets.yml lesen, die sich unter exampleRailsProject/config/secrets.yml Befindet, werden Sie so etwas finden :

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Dies bedeutet, dass Rails empfiehlt, eine Umgebungsvariable für den secret_key_base In Ihrem Produktionsserver zu verwenden. Um diesen Fehler zu beheben, sollten Sie die folgenden Schritte ausführen, um eine Umgebungsvariable für zu erstellen Linux (in meinem Fall Ubuntu) auf Ihrem Produktionsserver:

  1. Führen Sie im Terminal Ihres Produktionsservers den folgenden Befehl aus:

    $ Rails_ENV=production rake secret
    

    Dies gibt eine große Zeichenfolge mit Buchstaben und Zahlen zurück, kopieren Sie diese (wir werden diesen Code als GENERATED_CODE bezeichnen).

  2. Melden Sie sich bei Ihrem Server an

    • Wenn Sie sich als Root anmelden, suchen Sie diese Datei und bearbeiten Sie sie:

      $ vi /etc/profile
      

      Zum Ende der Datei gehen ("UMSCHALT + G" für Großbuchstaben G in VI)

      Schreiben Sie Ihre Umgebungsvariable mit dem GENERATED_CODE (Drücken Sie die "i" -Taste, um in VI zu schreiben). Stellen Sie sicher, dass Sie sich am Ende der Datei in einer neuen Zeile befinden:

      $ export SECRET_KEY_BASE=GENERATED_CODE
      

      Speichern Sie die Änderungen und schließen Sie die Datei (wir drücken die "ESC" -Taste und schreiben dann ": x" und "ENTER" -Taste zum Speichern und Verlassen in VI).

    • Wenn Sie sich jedoch als normaler Benutzer anmelden und "example_user" für dieses Gist nennen, müssen Sie eine der folgenden Dateien finden:

      $ vi ~/.bash_profile
      $ vi ~/.bash_login
      $ vi ~/.profile
      

      Diese Dateien sind in der Reihenfolge ihrer Wichtigkeit angeordnet, dh, wenn Sie die erste Datei haben, müssen Sie die anderen nicht einschreiben. Wenn Sie also diese beiden Dateien in Ihrem Verzeichnis ~/.bash_profile Und ~/.profile Gefunden haben, müssen Sie nur die erste ~/.bash_profile Schreiben, da Linux nur diese und die andere Datei liest wird ignoriert.

      Dann gehen wir zum Ende der Datei ("UMSCHALT + G" für Großbuchstaben G in VI).

      Und wir schreiben unsere Umgebungsvariable mit unserem GENERATED_CODE (Drücken Sie die "i" -Taste, um in VI zu schreiben). Achten Sie darauf, dass Sie sich am Ende der Datei in einer neuen Zeile befinden:

      $ export SECRET_KEY_BASE=GENERATED_CODE
      

      Nachdem Sie den Code geschrieben haben, speichern Sie die Änderungen und schließen Sie die Datei (drücken Sie die Taste "ESC" und schreiben Sie dann ": x" und "ENTER" zum Speichern und Beenden in VI).

  3. Mit diesem Befehl können Sie überprüfen, ob unsere Umgebungsvariable unter Linux richtig eingestellt ist:

    $ printenv | grep SECRET_KEY_BASE
    

    oder mit:

    $ echo $SECRET_KEY_BASE
    

    Wenn Sie diesen Befehl ausführen und alles in Ordnung ist, zeigt er Ihnen den GENERATED_CODE von vorher an. Schließlich sollten Sie nach Abschluss der Konfiguration in der Lage sein, Ihre Rails App problemlos mit Unicorn oder einer anderen App zu implementieren.

Wenn Sie Ihr Shell-Terminal schließen und sich erneut beim Produktionsserver anmelden, ist diese Umgebungsvariable festgelegt und kann verwendet werden.

Und das ist es!! Ich hoffe, diese Kurzanleitung hilft Ihnen, diesen Fehler zu beheben.

Haftungsausschluss: Ich bin kein Linux- oder Rails Guru. Wenn Sie also einen Fehler finden, kann ich ihn gerne beheben!

201
Demi Magus

Ich gehe davon aus, dass Sie Ihren secrets.yml Nicht in der Quellcodeverwaltung aktiviert haben (dh er befindet sich in der .gitignore - Datei). Auch wenn dies nicht Ihre Situation ist, haben es viele andere, die diese Frage sehen, getan, weil sie ihren Code auf Github offengelegt haben und nicht möchten, dass ihr geheimer Schlüssel herumschwebt.

Wenn es nicht in der Quellcodeverwaltung ist, weiß Heroku nichts darüber. Also Rails sucht nach Rails.application.secrets.secret_key_base Und wurde nicht gesetzt, weil Rails durch Prüfen der Datei secrets.yml Gesetzt wurde Die einfache Lösung besteht darin, in die Datei config/environments/production.rb zu wechseln und die folgende Zeile einzufügen:

Rails.application.configure do
    ...
    config.secret_key_base = ENV["SECRET_KEY_BASE"]
    ...
end

Dies weist Ihre Anwendung an, den geheimen Schlüssel mithilfe der Umgebungsvariablen festzulegen, anstatt ihn in secrets.yml Zu suchen. Es hätte mir viel Zeit gespart, dies im Vorfeld zu wissen.

81
Erik Trautman

Fügen Sie der Versionskontrolle config/secrets.yml Hinzu und stellen Sie es erneut bereit. Möglicherweise müssen Sie eine Zeile aus .gitignore Entfernen, damit Sie die Datei festschreiben können.

Ich hatte genau das gleiche Problem und es stellte sich heraus, dass das Boilerplate .gitignore Github für meine Rails Anwendung enthalten config/secrets.yml) Erstellt wurde.

55
danielricecodes

Das hat bei mir funktioniert.

SSH in Ihren Produktionsserver und cd in Ihr aktuelles Verzeichnis, führen Sie bundle exec rake secret Oder rake secret Aus. Sie erhalten eine lange Zeichenfolge als Ausgabe. Kopieren Sie diese Zeichenfolge.

Führen Sie nun Sudo nano /etc/environment Aus.

Am Ende der Datei einfügen

export SECRET_KEY_BASE=rake secret
Ruby -e 'p ENV["SECRET_KEY_BASE"]'

Wenn rake secret Die gerade kopierte Zeichenfolge ist, fügen Sie diese kopierte Zeichenfolge anstelle von rake secret Ein.

Starten Sie den Server neu und testen Sie ihn mit echo $SECRET_KEY_BASE.

12
sumitsv21

Während Sie Initialisierer wie die anderen Antworten verwenden können, ist die herkömmliche Methode Rails 4.1+ die Verwendung des config/secrets.yml. Der Grund für die Rails Die Einführung durch das Team würde den Rahmen dieser Antwort sprengen, aber die TL; DR besagt, dass secret_token.rb die Konfiguration und den Code in Konflikt bringt und ein Sicherheitsrisiko darstellt, da das Token in den Versionsverwaltungsverlauf eingecheckt wird und das einzige System ist, das dies benötigt das produktionsgeheimnis zu kennen ist die produktionsinfrastruktur.

Sie sollten diese Datei zu .gitignore Hinzufügen, so als würden Sie der Quellcodeverwaltung auch nicht config/database.yml Hinzufügen.

Als ich Herokus eigenen Code zum Einrichten von config/database.yml Aus DATABASE_URL In ihrem Buildpack for Ruby referenzierte, landete ich gab das Repo auf und änderte ihn zu Erstellen Sie config/secrets.yml aus der Umgebungsvariablen SECRETS_KEY_BASE.

Da diese Funktion in Rails 4.1 eingeführt wurde, erschien es mir angebracht, ./lib/language_pack/Rails41.rb Zu bearbeiten und diese Funktionalität hinzuzufügen.

Das Folgende ist das Snippet 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 gelesen 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 der erneuten Bereitstellung Ihrer App sicher, dass Sie zuerst Ihre Umgebungsvariable festlegen: Setting SECRET_KEY_BASE in Heroku Dashboard

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 jedes Mal, wenn Sie config/secrets.yml Zu Heroku senden, automatisch Ihren git Push Aus Ihrer Umgebungsvariablen als Teil des Dyno-Erstellungsprozesses.

BEARBEITEN: Herokus eigenes Dokumentation schlägt vor, config/secrets.yml Zum Lesen aus der Umgebungsvariablen zu erstellen, dies impliziert 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.

3
stackunderflow

Sie können die geheimen Schlüssel als Umgebungsvariablen im ~/.bashrc Oder ~/.bash_profile Ihres Servers exportieren:

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

Und dann können Sie Ihren .bashrc Oder .bash_profile Beziehen:

source ~/.bashrc 
source ~/.bash_profile

Gib niemals deine geheimnisse.yml ein

1
alessandrocb

Ich habe eine config/initializers/secret_key.rb - Datei erstellt und nur folgende Codezeile geschrieben:

Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]

Aber ich denke, dass die von @ Erik Trautman gepostete Lösung eleganter ist;)

Edit: Oh, und endlich habe ich diesen Rat auf Heroku gefunden: https://devcenter.heroku.com/changelog-items/426 :)

Genießen!

0
fadehelix

In meinem Fall war das Problem, dass config/master.key befand sich nicht in der Versionskontrolle und ich hatte das Projekt auf einem anderen Computer erstellt.

Der von Rails erstellte Standard-.gitignore schließt diese Datei aus. Da eine Bereitstellung ohne diese Datei nicht möglich ist, muss die Versionskontrolle aktiviert sein, damit die Bereitstellung von jedem Computer eines Teammitglieds aus erfolgen kann .

Lösung: Entfernen Sie das config/master.key Zeile von .gitignore, übertragen Sie die Datei von dem Computer, auf dem das Projekt erstellt wurde, und jetzt können Sie git pull auf dem anderen Computer und stellen Sie von dort aus bereit.

Die Leute sagen, einige dieser Dateien nicht der Versionskontrolle zu unterziehen, ohne eine alternative Lösung anzubieten. Solange Sie nicht an einem Open Source-Projekt arbeiten, sehe ich keinen Grund, nicht alles festzuschreiben, was zum Ausführen des Projekts erforderlich ist, einschließlich der Anmeldeinformationen.

0
Andrew Koster

Auf Nginx/Passenger/Ruby (2.4)/Rails (5.1.1) funktionierte nichts außer:

passenger_env_var im /etc/nginx/sites-available/default im Serverblock.

Quelle: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var

0
Kasperi

dies funktioniert gut https://Gist.github.com/pablosalgadom/4d75f30517edc6230a67 für root-Benutzer sollte bearbeiten

$ /etc/profile

wenn Sie jedoch kein Root sind, sollten Sie den generierten Code wie folgt eingeben

$ ~/.bash_profile

$ ~/.bash_login

$ ~/.profile
0
bung_firman

Demi Magus Antwort funktionierte für mich bis Rails 5.

Auf Apache2/Passenger/Ruby (2.4)/Rails (5.1.6) musste ich setzen

export SECRET_KEY_BASE=GENERATED_CODE

von Demi Magus Antwort in/etc/Apache2/envvars, Ursache/etc/profile scheint ignoriert zu werden.

Quelle: https://www.phusionpassenger.com/library/indepth/environment_variables.html#Apache

0
Florent L.

Ich habe einen Patch, den ich in einer Rails 4.1-App verwendet habe, damit ich weiterhin den Legacy-Schlüsselgenerator verwende (und damit die Abwärtssitzungskompatibilität mit Rails 3 ), indem die secret_key_base leer gelassen wird.

Rails::Application.class_eval do
  # the key_generator will then use ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
  fail "I'm sorry, Dave, there's no :validate_secret_key_config!" unless instance_method(:validate_secret_key_config!)
  def validate_secret_key_config! #:nodoc:
    config.secret_token = secrets.secret_token
    if config.secret_token.blank?
      raise "Missing `secret_token` for '#{Rails.env}' environment, set this value in `config/secrets.yml`"
    end 
  end 
end

Ich habe den Patch seitdem neu formatiert habe ihn Rails als Pull Request eingereicht

0
BF4

Was ich getan habe: Auf meinem Produktionsserver erstelle ich eine Konfigurationsdatei (confthin.yml) für Thin (ich verwende sie) und füge die folgenden Informationen hinzu:

environment: production
user: www-data
group: www-data
SECRET_KEY_BASE: mysecretkeyproduction

Ich starte die App dann mit

thin start -C /whereeveristhefieonprod/configthin.yml

Arbeiten Sie wie ein Zauber und brauchen Sie dann keinen geheimen Schlüssel für die Versionskontrolle

Hoffe, es könnte helfen, aber ich bin sicher, dass das Gleiche mit Unicorn und anderen getan werden könnte.

0