15

Così sto cercando di ottenere il mio rotaie app per distribuire in modalità di produzione, ma ottengo l'errore: Manca secret_token e secret_key_base per l'ambiente 'di produzione', impostare questi valori in config/secrets.ymlProduzione di rotaie - Come impostare la base della chiave segreta?

Il mio file secrets.yml è come previsto :

development: 
    secret_key_base: xxxxxxx 

test: 
    secret_key_base: xxxxxxx 

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

Ma anche dopo Google e la ricerca, non ho idea di cosa fare con la base della chiave di produzione segreta. La maggior parte delle informazioni là fuori presuppone di avere certe conoscenze di base, ma la realtà è che sono un noob.

Qualcuno può spiegarmi come impostare la mia chiave segreta e farlo funzionare in modalità produzione?

+0

Eventuali duplicati di [Come risolvere l'errore "Missing \' segreto \ _key \ _base \ 'per l'ambiente di 'produzione' su Heroku (Rails 4.1)] (http://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for- production-environment-on-h) – mbaitoff

risposta

11

Gli errori che si verificano indicano che la variabile di ambiente per secret_key_base non è impostata correttamente sul server.

È possibile utilizzare vari script come capistrano che automatizzano il processo di impostazione di questi prima dell'esecuzione dell'applicazione.

Per quanto riguarda una soluzione rapida provare questo:

export SECRET_KEY_BASE=YOUR SECRET BASE 

Convalidare le variabili di ambiente e verificare se questi sono stati impostati.

Comando:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

Se i valori pop-up allora questi sono impostati sul server di produzione.

Inoltre, è consigliabile utilizzare ENV.fetch(SECRET_KEY) in quanto ciò solleva un'eccezione prima che l'app tenti di avviarsi.

+0

Quale dovrebbe essere il mio token segreto? Ho usato $ rake secret e mi ha dato una chiave, ma per quanto riguarda la base? – nvrpicurnose

+3

'rake secret' crea una stringa di chiavi sicura da usare come' TOKEN' e 'BASE'. Rails ha bisogno solo di questi per funzionare correttamente e fare un po 'di sicurezza dietro le quinte. – JensDebergh

+0

Gli ultimi Rails non necessitano più di 'secret_token'; è richiesto solo 'secret_key_base'. –

4

Come si può vedere, esiste un valore con hardcoded per gli ambienti development e test, ma quello per production deriva da una variabile. Prima di tutto, perché in questo modo? È una funzione di sicurezza. In questo modo, se si controlla questo file nel controllo di versione come git o svn, i valori development e test vengono condivisi, il che va bene, ma lo production (quello che verrebbe utilizzato su un sito Web reale) non lo è, quindi nessuno può guardare la fonte per ottenere quel segreto.

quanto riguarda la variabile utilizzata, ENV["SECRET_KEY_BASE"], questa è una variabile ambiente dalle rotaie ambientali è eseguito in (da non confondere con le rotaie "ambiente", come development, test e production). Queste variabili d'ambiente provengono dalla shell. Come accennato in post JensD 's, è possibile impostare questa variabile di ambiente temporaneo con:

export SECRET_TOKEN=YOUR SECRET TOKEN 
export SECRET_KEY_TOKEN=YOUR SECRET BASE 

Per generare un nuovo token segreto, utilizzare il comando rake secret nella riga di comando.

Ciò è temporaneo, tuttavia, e non una buona soluzione finale. Per una soluzione finale, controlla this article, che ha un rapido bit vicino alla fine implementando dotenv per caricare i segreti di configurazione. Ricorda, se usi il controllo della versione, assicurati di escludere il tuo file .env dall'effettivo check-in!

L'impostazione di dotenv up richiede un po 'di lavoro, ma consiglio vivamente di provare a configurare manualmente queste variabili di ambiente.

+1

Esiste un tutorial passo passo su come spingere un'app per rails in produzione? Non riesco a mettere insieme tutti questi frammenti poiché non ho le conoscenze di base necessarie – nvrpicurnose

+1

@nvrpicurnose lol il modo per imparare è quello di farlo ancora e ancora fino a quando non inizia a diventare più facile. Sto girando su e abbattendo i server più e più volte per molto tempo fino a quando finalmente ho capito. Ci vogliono molte ore e molti tutorial per ottenerlo davvero. Almeno, è così che è stato per me senza che qualcuno mi tenesse davvero per mano e mi mostrasse. Attenersi ad esso e diventa più facile. Controlla la lettura di questa app dimostrativa che ho provato a distribuire. Potrebbe aiutare https://github.com/adiakritos/sw-checkin –

21

è possibile generare la chiave utilizzando i seguenti comandi

$ irb 
>> require 'securerandom' 
=> true 
>> SecureRandom.hex(64) 
=> "3fe397575565365108556c3e5549f139e8078a8ec8fd2675a83de96289b30550a266ac04488d7086322efbe573738e7b3ae005b2e3d9afd718aa337fa5e329cf" 
>> exit 
6

Questa risposta mi ha aiutato molto. Egli vi indica come config file secrets.yml nella produzione e come leggerlo dall'ambiente:

link originale: https://stackoverflow.com/a/26172408/4962760

I had the same problem and I solved it by creating an environment variable to be loaded every time that I logged in to the production server and made a mini guide of the steps to configure it:

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

I was using Rails 4.1 with Unicorn v4.8.2, when I tried to deploy my app it didn't start properly and in the unicorn.log file I found this error message:

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

After some research I found out that Rails 4.1 changed the way to manage the secret_key, so if you read the secrets.yml file located at [exampleRailsProject]/config/secrets.yml you'll find something like this:

Do not keep production secrets in the repository,

instead read values from the environment. production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> This means that rails

recommends you to use an environment variable for the secret_key_base in your production server, in order to solve this error you should follow this steps to create an environment variable for Linux (in my case Ubuntu) in your production server:

1.- In the terminal of your production server execute the next command:

$ RAILS_ENV=production rake secret This returns a large string with letters and numbers, copy that (we will refer to that code as GENERATED_CODE).

2.1- Login as root user to your server, find this file and edit it: $ vi /etc/profile

Go to the bottom of the file ("SHIFT + G" for capital G in VI)

Write your environment variable with the GENERATED_CODE (Press "i" key to write in VI), be sure to be in a new line at the end of the file:

export SECRET_KEY_BASE=GENERATED_CODE Save the changes and close the file (we push "ESC" key and then write ":x" and "ENTER" key for save and exit in VI)

2.2 But if you login as normal user, lets call it example_user for this gist, you will need to find one of this other files:

$ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profile These files are in order of importance, that means that if you have the first file, then you wouldn't need to write in the others. So if you found this 2 files in your directory "~/.bash_profile" and "~/.profile" you only will have to write in the first one "~/.bash_profile", because Linux will read only this one and the other will be ignored.

Then we go to the bottom of the file ("SHIFT + G" for capital G in VI)

And we will write our environment variable with our GENERATED_CODE (Press "i" key to write in VI), be sure to be in a new line at the end of the file:

export SECRET_KEY_BASE=GENERATED_CODE Having written the code, save the changes and close the file (we push "ESC" key and then write ":x" and "ENTER" key for save and exit in VI)

3.- You can verify that our environment variable is properly set in Linux with this command:

$ printenv | grep SECRET_KEY_BASE or with:

$ echo $SECRET_KEY_BASE When you execute this command, if everything went ok, it will show you the GENERATED_CODE from before. Finally with all the configuration done you should be able to deploy without problems your Rails app with Unicorn or other.

When you close your shell terminal and login again to the production server you will have this environment variable set and ready to use it.

And thats it!! I hope this mini guide help you to solve this error.

Disclaimer: I'm not a Linux or Rails guru, so if you find something wrong or any error I will be glad to fix it!