15

Je suis en train de faire mon application rails pour déployer en mode de production, mais je reçois l'erreur: manque secret_token et secret_key_base pour l'environnement « production », définir ces valeurs dans config/secrets.ymlRails Production - Comment définir la base de la clé secrète?

Mon fichier secrets.yml est comme prévu : Je

development: 
    secret_key_base: xxxxxxx 

test: 
    secret_key_base: xxxxxxx 

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

Mais même après Google et la recherche, aucune idée de quoi faire avec la base clé secrète de production. La plupart des informations supposent que j'ai certaines connaissances de base, mais la réalité est que je suis un noob.

Quelqu'un peut-il m'expliquer comment régler ma clé secrète et faire en sorte que cela fonctionne en mode production?

+0

double possible de [Comment résoudre l'erreur « manquant \' un secret \ _key \ _base \ 'pour 'environnement de production' sur Heroku (Rails 4.1)] (http://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for- production-environment-on-h) – mbaitoff

Répondre

11

Les erreurs que vous obtenez indiquent simplement que la variable d'environnement secret_key_base n'est pas définie correctement sur le serveur.

Vous pouvez utiliser divers scripts comme Capistrano qui automatisent le processus de définition avant l'exécution de l'application.

En ce qui concerne une solution rapide, essayez ceci:

export SECRET_KEY_BASE=YOUR SECRET BASE 

Valider les variables d'environnement et vérifier si ceux-ci ont été fixés.

Commande:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

Si vos valeurs pop-up, puis ceux-ci sont définies sur le serveur de production.

Il est également recommandé d'utiliser ENV.fetch(SECRET_KEY) car cela déclenchera une exception avant même que l'application ne tente de démarrer.

+0

Quel devrait être mon jeton secret? J'ai utilisé $ rake secret et ça m'a donné une clé, mais qu'en est-il de la base? – nvrpicurnose

+3

'rake secret' crée une chaîne de clé sûre à utiliser comme' TOKEN' et 'BASE'. Rails a juste besoin de ces fonctionnalités pour fonctionner correctement et faire des choses de sécurité dans les coulisses. – JensDebergh

+0

Les derniers Rails n'ont plus besoin de 'secret_token'; Seul 'secret_key_base' est requis. –

4

Comme vous pouvez le voir, il existe une valeur codée en dur pour les environnements development et test, mais celle pour production provient d'une variable. Tout d'abord, pourquoi de cette façon? C'est une caractéristique de sécurité. De cette façon, si vous vérifiez ce fichier dans le contrôle de version comme git ou svn, les valeurs development et test sont partagées, ce qui est bien, mais le production (celui qui serait utilisé sur un vrai site web) ne l'est pas, donc personne ne peut regarder la source pour obtenir ce secret.

En ce qui concerne la variable utilisée, ENV["SECRET_KEY_BASE"], c'est est géré une variable d'environnement de l'environnement Rails en (à ne pas confondre avec les rails « environnement », comme development, test et production). Ces variables d'environnement proviennent du shell. Comme mentionné dans l » après JensD, vous pouvez définir cette variable d'environnement temporairement:

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

Pour générer un nouveau jeton secret, utilisez la commande rake secret dans la ligne de commande.

Ceci est temporaire, cependant, et n'est pas une bonne solution finale. Pour une solution finale, consultez this article qui a un peu près de la fin sur la mise en œuvre dotenv pour charger les secrets de configuration. N'oubliez pas, si vous utilisez le contrôle de version, veillez à exclure votre fichier .env de l'enregistrement!

La définition de dotenv up demande un peu de travail, mais je le recommande fortement en essayant de configurer manuellement ces variables d'environnement.

+1

Y at-il un tutoriel étape par étape sur la poussée d'une application de rails à la production? Je ne peux pas rassembler tous ces fragments car je n'ai pas les connaissances de base nécessaires – nvrpicurnose

+1

@nvrpicurnose lol la façon d'apprendre est de le faire encore et encore jusqu'à ce qu'il commence à devenir plus facile. Ça fait longtemps que je tourne et arrache les serveurs jusqu'à ce que je l'obtienne enfin. Prend de nombreuses heures et beaucoup de tutoriels pour vraiment l'obtenir. Au moins, c'est comme ça que ça a été pour moi sans que quelqu'un me prenne réellement la main et me montre. Tenez-vous-y et ça devient plus facile. Découvrez la lecture de moi sur cette application de démonstration que j'ai essayé de déployer. Pourrait aider https://github.com/adiakritos/sw-checkin –

21

Vous pouvez générer la clé en utilisant les commandes suivantes

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

Cette réponse m'a beaucoup aidé. Il vous indique comment le fichier config secrets.yml dans la production et la façon de le lire à partir de l'environnement:

lien d'origine: 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!