2016-03-22 4 views
0

Kurz sehen:Rake nicht Rails.application.secrets

  1. scheint, dass Rake keinen Zugang zu Rails.application.secrets
  2. was ist der Zweck der config/secrets.yml in config/database.yml Datei dann hat?

In lang:

Wenn ich laufen

RAILS_ENV=production rake db:migrate 

ich den Fehler Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO) bekommen, obwohl ich die entsprechenden Werte in config/database.yml angegeben und der Benutzer verbinden sollte nicht 'root' sein. Dies ist ein Auszug aus dem jeweiligen Konfigurationsdateien:

# config/database.yml 
production: 
    <<: *default 
    adapter: mysql2 
    host: localhost 
    database: <%= Rails.application.secrets[:database][:name] %> 
    username: <%= Rails.application.secrets[:database][:username] %> 
    password: <%= Rails.application.secrets[:database][:password] %> 

# config/secrets.yml 
production: 
    secret_key_base: very-long-blah-blah-blah 
    database: 
    name: app_db_name 
    username: app_db_user 
    password: app_db_password 

Es scheint, dass rake keinen Zugang zu Rails.application.secrets hat. Durchführung der Migration erfolgreich ist, wenn ich in database.yml zum Beispiel explizit erforderlichen Werte gesetzt, wie folgt:

production: 
    <<: *default 
    adapter: mysql2 
    host: localhost 
    database: <%= Rails.application.secrets[:database][:name] || 'app_db_name' %> 
    username: <%= Rails.application.secrets[:database][:username] || 'app_db_user' %> 
    password: <%= Rails.application.secrets[:database][:password] || 'app_db_password' %> 

Die oben beweist, dass Rails.application.secrets[:database][:name] nichts auflöst.

Zugriff auf Rails.application.secrets in rake? Wäre das die richtige Lösung?

Ich weiß, dass ich ENV[VARNAME] verwenden kann, um geheime Abschnitte von config/database.yml zu füllen. Aber was ist der Zweck von config/secrets.yml Datei dann?

Außerdem benutze ich Passenger, was bedeutet, dass Variablen in .bashrc wird wahrscheinlich nicht zugänglich für den Webserver (Ich hatte dieses Problem mit secret_key_base). Daher versuche ich die Verwendung von Umgebungsvariablen zu vermeiden. Ich will nicht, dass all meine Geheimnisse auf dem ganzen Server verschüttet werden.

Schienen-4.2.2, Ubuntu LTS 14.04

+0

glaube nicht, das die Gesamtheit des Problems ist aber Sie haben die Produktion Host als localhost gesetzt. Wie sieht Ihre Produktionskonfiguration auf dem Server aus? Ich weiß, dass du kein Heroku verwendest, aber was ist mit dem Ausführen von 'heroku config' gleichzusetzen? – toddmetheny

+0

Passenger hat keine Probleme mit Umgebungsvariablen, die in '.bashrc' gesetzt sind. –

+0

@toddmethheny, was ist falsch daran,' localhost' zu haben? Die Anwendung und die Datenbank werden auf dem Sicherungsserver ausgeführt, und nach meinem Verständnis darf sich die Anwendung mithilfe von mysql socket als 'app_db_user' @ 'localhost' mit der Datenbank verbinden. –

Antwort

1

Ich habe nicht so verschachtelte Inhalte für die secrets.yml wie Sie haben, auch die release notes nicht über eine solche Art gesehen. Sie sollten mit dem folgenden Code gerade fein

# config/secrets.yml 
production: 
    secret_key_base: very-long-blah-blah-blah 
    name: app_db_name 
    username: app_db_user 
    password: app_db_password 

Und im database.yml

# config/database.yml 
production: 
    <<: *default 
    adapter: mysql2 
    host: localhost 
    database: <%= Rails.application.secrets.name %> 
    username: <%= Rails.application.secrets.username %> 
    password: <%= Rails.application.secrets.password %> 
+1

danke. Das funktioniert und sieht einfacher aus.Ich zahle den Preis für folgen jemandes Rezept im Internet gefunden :( –

+0

Wenn ich Adapter aus der secrets.yml übergeben, wirft es diesen Fehler Konnte 'active_record/connection_adapters/_adapter' nicht laden. Stellen Sie sicher, dass der Adapter in config/database.yml ist gültig Wenn Sie einen anderen Adapter als 'mysql2', 'postgresql' oder 'sqlite3' verwenden, fügen Sie dem Gemfile das erforderliche Adapter-Juwel hinzu. (LoadError) –