Ich habe mit Rails 4.1 eine Rails-Anwendung von Grund auf neu erstellt und stehe vor einem seltsamen Problem, das ich nicht lösen kann.
Jedes Mal, wenn ich versuche, meine Anwendung auf Heroku bereitzustellen, wird die Fehlermeldung 500 angezeigt:
Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
Die secret.yml
Datei enthält die folgende Konfiguration:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Auf Heroku habe ich die SECRET_KEY_BASE
Umgebungsvariable " " mit dem Ergebnis des rake secret
Befehls konfiguriert . Wenn ich starte heroku config
, kann ich die Variable mit dem richtigen Namen und Wert sehen.
Warum erhalte ich diesen Fehler immer noch?
ruby-on-rails
ruby
heroku
ruby-on-rails-4
Paolo Laurenti
quelle
quelle
secret.yml
odersecrets.yml
?Antworten:
Ich hatte das gleiche Problem und löste es, indem ich eine Umgebungsvariable erstellte, die jedes Mal geladen werden sollte, wenn ich mich beim Produktionsserver anmeldete, und eine Kurzanleitung der Schritte zum Konfigurieren erstellte:
Ich habe Rails 4.1 mit Unicorn v4.8.2 verwendet und als ich versuchte, meine Anwendung bereitzustellen, wurde sie nicht richtig gestartet und in der
unicorn.log
Datei fand ich folgende Fehlermeldung:Nach einigen Recherchen habe ich herausgefunden, dass Rails 4.1 die Art und Weise der Verwaltung geändert hat.
secret_key
Wenn Sie also diesecrets.yml
Datei unter lesen,exampleRailsProject/config/secrets.yml
finden Sie Folgendes:Dies bedeutet, dass Rails Ihnen empfiehlt, eine Umgebungsvariable für die
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 Linux (in meinem Fall Ubuntu) auf Ihrem Produktionsserver zu erstellen:Führen Sie im Terminal Ihres Produktionsservers Folgendes aus:
Dies gibt eine große Zeichenfolge mit Buchstaben und Zahlen zurück. Kopieren Sie das, als das wir diesen Code bezeichnen werden
GENERATED_CODE
.Melden Sie sich bei Ihrem Server an
Wenn Sie sich als Root anmelden, suchen Sie diese Datei und bearbeiten Sie sie:
Gehen Sie mit Shift+ G(Großbuchstabe "G") in vi zum Ende der Datei .
Schreiben Sie Ihre Umgebungsvariable mit
GENERATED_CODE
und drücken Sie i, um in vi einzufügen. Stellen Sie sicher, dass Sie am Ende der Datei in einer neuen Zeile stehen:Speichern Sie die Änderungen und schließen Sie die Datei mit Escund dann "
:x
" und Enterzum Speichern und Beenden in vi.Wenn Sie sich jedoch als normaler Benutzer anmelden, nennen wir es "
example_user
" für diesen Kern. Sie müssen eine dieser anderen Dateien finden:Diese Dateien sind in der Reihenfolge ihrer Wichtigkeit angeordnet. Wenn Sie also die erste Datei haben, müssen Sie die anderen nicht bearbeiten. Wenn Sie diese beiden Dateien in Ihrem Verzeichnis gefunden haben
~/.bash_profile
und~/.profile
nur die erste schreiben müssen,~/.bash_profile
liest Linux nur diese und die andere wird ignoriert.Dann gehen wir erneut mit Shift+ zum Ende der Datei Gund schreiben die Umgebungsvariable mit unserer erneuten
GENERATED_CODE
Verwendung ierneut. Fügen Sie am Ende der Datei eine neue Zeile hinzu:Nachdem Sie den Code geschrieben haben, speichern Sie die Änderungen und schließen Sie die Datei mit Escerneut und "
:x
" und Enterzum Speichern und Beenden.Mit diesem Befehl können Sie überprüfen, ob unsere Umgebungsvariable unter Linux richtig eingestellt ist:
oder mit:
Wenn Sie diesen Befehl ausführen und alles in Ordnung ist, wird Ihnen das
GENERATED_CODE
von zuvor angezeigt. Nach Abschluss der Konfiguration sollten Sie in der Lage sein, Ihre Rails-Anwendung problemlos mit Unicorn oder einem anderen Tool bereitzustellen.Wenn Sie Ihre Shell schließen und sich erneut beim Produktionsserver anmelden, ist diese Umgebungsvariable festgelegt und kann verwendet werden.
Und das ist es! Ich hoffe, dieser Mini-Guide hilft Ihnen, diesen Fehler zu beheben.
Haftungsausschluss: Ich bin kein Linux- oder Rails-Guru. Wenn Sie also etwas falsch finden oder einen Fehler finden, kann ich ihn gerne beheben.
quelle
Ich gehe davon aus, dass Sie Ihre
secrets.yml
Quellcodeverwaltung nicht eingecheckt haben (dh sie befindet sich in der.gitignore
Datei). Auch wenn dies nicht Ihre Situation ist, haben es viele andere Personen getan, die diese Frage sehen, weil sie ihren Code auf Github verfügbar gemacht haben und nicht möchten, dass ihr geheimer Schlüssel herumschwebt.Wenn es nicht in der Quellcodeverwaltung ist, weiß Heroku nichts davon. Rails sucht also
Rails.application.secrets.secret_key_base
und es wurde nicht festgelegt, da Rails es durch Überprüfen dersecrets.yml
Datei festlegt, die nicht vorhanden ist. Die einfache Problemumgehung besteht darin, in Ihreconfig/environments/production.rb
Datei zu gehen und die folgende Zeile hinzuzufügen:Dadurch wird Ihre Anwendung angewiesen, den geheimen Schlüssel mithilfe der Umgebungsvariablen festzulegen, anstatt ihn zu suchen
secrets.yml
. Es hätte mir viel Zeit gespart, dies von vornherein zu wissen.quelle
Figaro
undheroku_secrets
tu nichts, es sei denn, Rails weiß, dass dasSECRET_KEY_BASE
lebtENV
. Ich hatte mit diesem Gedanken zu kämpfen, dass Rails, wenn die Konfigurationsvariable auf Heroku existieren würde, sie nur aufgrund ihrer Existenz aufgreifen würde, aber jetzt scheint es offensichtlich, dass Rails wissen müsste, wo sie suchen müssen. Ich habe mich gefragt, wie ich Code auf Github haben kann, ohne mir Gedanken über die geheime Schlüsselbasis machen zu müssen. jetzt weiß ich.production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Bedeutet das nicht auch, dass der eigentliche geheime Schlüssel nicht offengelegt wird? Besteht das Risiko, Entwickler- und Testschlüssel in festgeschriebenen Secrets.yml offenzulegen, wenn es sich nur um Seed- und Testdaten handelt?In
config/secrets.yml
der Versionskontrolle und bereitstellen wieder. Möglicherweise müssen Sie eine Zeile aus entfernen,.gitignore
damit Sie die Datei festschreiben können.Ich hatte genau das gleiche Problem und es stellte sich heraus, dass das
.gitignore
für meine Rails-Anwendung erstellte Boilerplate Github enthalten warconfig/secrets.yml
.quelle
Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]
würde funktionieren und den Fehler entfernen, ohnesecrets.yml
zur Quelle hinzuzufügen .rails new
(in diesem Fall eine Gem-Datei, deren Gemrails
die Version hat4.2.4
), wird die Dateiconfig/secrets.yml
generiert. Es enthält vorgenerierte geheime Schlüssel für die Entwicklungs- und Testumgebung und liest den geheimen Schlüssel für die Produktionsumgebung aus einer Umgebungsvariablen :secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
. Mir scheint, dass es absolut sicher und in der Tat nützlich ist, diesesecrets.yml
Datei in der Versionskontrolle zu halten , vorausgesetzt, man definiert dort nie den geheimen Schlüssel.Das hat bei mir funktioniert.
cd
Führen Sie SSH in Ihren Produktionsserver und in Ihr aktuelles Verzeichnis aus, führen Sie es ausbundle exec rake secret
oderrake secret
kopieren Sie diese Zeichenfolge, wenn Sie eine lange Zeichenfolge als Ausgabe erhalten.Jetzt renn
sudo nano /etc/environment
.Fügen Sie am Ende der Datei ein
Wo
rake secret
sich die gerade kopierte Zeichenfolge befindet, fügen Sie diese kopierte Zeichenfolge anstelle von einrake secret
.Starten Sie den Server neu und testen Sie ihn durch Ausführen
echo $SECRET_KEY_BASE
.quelle
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, dasssecret_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ügenconfig/database.yml
, als würden Sie sie auch nicht zur Quellcodeverwaltung hinzufügen .Referenzierung Heroku eigenen Code für die Einrichtung
config/database.yml
vonDATABASE_URL
ihrer Buildpack für Ruby , landete ich ihre Repo - gabeln und modifiziert es schaffenconfig/secrets.yml
vonSECRETS_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:
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:
Auf diese Weise können Sie auf ganz normale Weise auf dieses Geheimnis zugreifen:
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 Siegit 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.quelle
Sie können die geheimen Schlüssel als Umgebungsvariablen auf dem
~/.bashrc
oder~/.bash_profile
Ihres Servers exportieren :Und dann können Sie Ihre
.bashrc
oder.bash_profile
:Verpflichte niemals deine Geheimnisse
quelle
In meinem Fall bestand das Problem darin, dass die
config/master.key
Versionskontrolle nicht durchgeführt wurde und ich das Projekt auf einem anderen Computer erstellt hatte.Der von Rails erstellte Standard-Gitignore schließt diese Datei aus. Da die Bereitstellung ohne diese Datei nicht möglich ist, muss sie in der Versionskontrolle sein, damit sie von jedem Computer eines Teammitglieds aus bereitgestellt werden kann.
Lösung: Entfernen Sie die
config/master.key
Zeile von.gitignore
, schreiben Sie die Datei von dem Computer fest, auf dem das Projekt erstellt wurde, und jetzt können Sie siegit pull
auf dem anderen Computer bereitstellen und von dort aus bereitstellen.Die Leute sagen, dass einige dieser Dateien nicht der Versionskontrolle übergeben werden sollen, 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.
quelle
secrets.yml
Datei gibt, die in den letzten Rails-Versionen veraltet war. Diese Frage zum Stapelüberlauf selbst hat eine Menge Antworten, und fast alle verwenden diese alte API.Bei Rails6 hatte ich das gleiche Problem, da mir folgende Dateien fehlten. Nachdem ich sie hinzugefügt hatte, wurde das Problem behoben:
Stellen Sie sicher, dass Sie diese Dateien haben. !!!
quelle
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:
Ich starte dann die App mit
Arbeiten Sie wie ein Zauber und brauchen Sie dann nicht den geheimen Schlüssel für die Versionskontrolle
Ich hoffe, es könnte helfen, aber ich bin sicher, dass das Gleiche mit Unicorn und anderen gemacht werden könnte.
quelle
Ich habe einen Patch, den ich in einer Rails 4.1-App verwendet habe, damit ich den Legacy-Schlüsselgenerator (und damit die Abwärtssitzungskompatibilität mit Rails 3) weiterhin verwenden kann, indem die secret_key_base leer bleibt.
Ich habe den Patch seitdem neu formatiert und als Pull-Request an Rails gesendet
quelle
Ich habe eine
config/initializers/secret_key.rb
Datei erstellt und nur die folgende Codezeile geschrieben:Aber ich denke, dass die von @Erik Trautman veröffentlichte Lösung eleganter ist;)
Edit: Oh, und schließlich habe ich diesen Rat auf Heroku gefunden: https://devcenter.heroku.com/changelog-items/426 :)
Genießen!
quelle
Dies funktioniert gut https://gist.github.com/pablosalgadom/4d75f30517edc6230a67 für Root-Benutzer sollte bearbeiten
Wenn Sie jedoch kein Root sind, sollten Sie den generierten Code wie folgt eingeben
quelle
Auf Nginx / Passenger / Ruby (2.4) / Rails (5.1.1) funktionierte nichts anderes als:
passenger_env_var
in/etc/nginx/sites-available/default
im Serverblock.Quelle: https://www.phusionpassenger.com/library/config/nginx/reference/#passenger_env_var
quelle
Demi Magus Antwort funktionierte für mich bis Rails 5.
Auf Apache2 / Passenger / Ruby (2.4) / Rails (5.1.6) musste ich setzen
von Demi Magus Antwort in / etc / apache2 / envvars, Ursache / etc / Profil scheint ignoriert zu werden.
Quelle: https://www.phusionpassenger.com/library/indepth/environment_variables.html#apache
quelle
Ich hatte das gleiche Problem, nachdem ich die .gitignore-Datei von https://github.com/github/gitignore/blob/master/Rails.gitignore verwendet hatte
Alles hat gut geklappt, nachdem ich die folgenden Zeilen in der .gitignore-Datei kommentiert habe.
quelle