2016-09-21 5 views
8

Ich stelle meine Rails-App mit Capistrano bereit. Ich möchte einige API-Schlüssel auf dem Server als Umgebungsvariable speichern. Diese API-Schlüssel sollten für meine Rails-App verfügbar sein, die mit Capistrano bereitgestellt wird. Auf diese API-Schlüssel sollte auch eine separate Ruby-Datei zugreifen können, die als Daemon ausgeführt wird.Capistrano und API-Schlüssel in ENV-Variablen?

Die Einstellung der API-Schlüssel in Umgebungsvariablen scheint die ideale Lösung zu sein, aber ich kann nicht auf sie in meiner Rails-App mit ENV["SOME_KEY"] zugreifen.

Nach this post, weil capistrano als nicht interaktiv und nicht Login ausgeführt wird, ~/.bashrc und ~/.bash_profile sind nicht geladen. Das Flussdiagramm schlägt vor, dass ich $BASH_ENV verwenden sollte.

Kann ich einfach meine API-Schlüssel in $BASH_ENV hinzufügen und auf sie in meiner Rails-App zugreifen und in der Ruby-Datei, die ein Daemon ist mit ?

Ich denke auch darüber nach, nur die api-Schlüssel zu einer Datei irgendwo auf dem Server hinzuzufügen und symlinking es mit dem Ruby-Datei-Verzeichnis und Rails-Verzeichnis und einfach öffnen und lesen. Wäre das möglich?

+0

Ich habe persönlich entschieden Geheimnisse zu speichern und diese in Dateien in einem Verzeichnis, das nicht in dem Versionskontrollsystem enthalten ist, nachdem ihn mit experimentierte die Umgebungsvariablen immer richtig propagiert werden. Sei bloß vorsichtig! – ollpu

+0

Check-out der Dotenv Juwel, tut es im Grunde, was @ollpu gesagt hat. https://github.com/bkeepers/dotenv – Teddy

+0

@ollpu: Also im Grunde die Dateien manuell zu den Schienen Dir nach der Bereitstellung hinzufügen? Wie liest du diese Dateien, nachdem du sie zum Verzeichnis hinzugefügt hast? – MeesterPatat

Antwort

12

Es gibt ein paar Möglichkeiten, die gut mit Capistrano funktionieren, meiner Erfahrung nach.

rbenv-Vars

Wenn Sie Rubin über Rbenv auf Ihrem Server verwenden, dann sind Sie im Glück. Es gibt ein Rbenv-Plugin namens rbenv-vars, das automatisch Umgebungsvariablen in jeden Ruby-Prozess einfügt, der Ihre Rails-App enthält. Fügen Sie einfach ~/.rbenv/vars auf dem Server mit KEY=value Syntax Ihre Variablen hinzu. Das ist es.

dotenv

Das dotenv Juwel ist eine ähnliche Lösung, aber es funktioniert als ein Juwel Sie Ihre Rails-Anwendung hinzufügen und nicht Rbenv oder andere unterstützende Werkzeuge erfordern. Füge dotenv-rails zu deiner Gemdatei hinzu und stelle sie bereit. Dotenv sucht automatisch nach einer .env.production Datei im Stammverzeichnis Ihrer Rails App. Erstellen Sie für Capistrano eine .env.production-Datei auf dem Server im Verzeichnis shared von Capistrano, und fügen Sie dann .env.production zu :linked_files hinzu. Jetzt wird jede Bereitstellung mit ihr verknüpft. Deklarieren Sie Ihre Variablen mit KEY=value Syntax.

Bashrc

Erklären Sie Ihre Variablen mit export KEY=value Syntax an ganz oben auf der ~/.bashrc Datei auf dem Server. Unter Ubuntu wird diese Datei auch während einer nicht interaktiven SSH-Sitzung ausgewertet. So stellen Sie sicher, dass Sie die Erklärungen stellen auf der Spitze, vor diesem Fall Aussage:

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 

CentOS eine andere Geschichte sein kann, so YMMV.

+0

Dotenv hört sich gut an, aber wie kann ich es lokal testen, bevor ich es bereitstellen kann? – MeesterPatat

+0

dotenv funktioniert lokal genauso. Setzen Sie einfach KEY = value-Variablen in '.env.development' in das root Ihres Rails-Projekts und starten Sie die App dann normal mit' rails server'. Diese Variablen werden über 'ENV' geladen und verfügbar. Möglicherweise müssen Sie zuerst "Federstopp" ausführen, um einen Kaltstart zu gewährleisten. –

1

Ich habe vor einiger Zeit ein Capistrano-Plugin capistrano-env_config für die Verwaltung und Synchronisierung von Umgebungsvariablen über einen Capistrano-Cluster gemacht, das die /etc/environment-Datei bearbeitet, um Umgebungsvariablen im System verfügbar zu machen. Es ist einfach zu verwenden und ähnelt der Einstellung von Umgebungsvariablen mit dem Heroku-Werkzeuggürtel.Hier sind einige Beispiele:

cap env:list 
cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...] 
cap env:sync