web-dev-qa-db-fra.com

Rails Production - Comment définir la base de clé secrète?

J'essaie donc d'obtenir mon Rails application à déployer en mode production, mais je reçois l'erreur: Missing secret_token et secret_key_base pour un environnement de "production", définissez ces valeurs dans config/secrets.yml

Mon fichier secrets.yml est comme prévu:

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 recherche, je ne sais pas quoi faire avec la base de 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 définir ma clé secrète et la faire fonctionner en mode production?

19
nvrpicurnose

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

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

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

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

En ce qui concerne une solution rapide, essayez ceci:

export SECRET_KEY_BASE=YOUR SECRET BASE

Validez les variables d'environnement et vérifiez si elles ont été définies.

Commander:

env | grep -E "SECRET_TOKEN|SECRET_KEY_BASE"

Si vos valeurs apparaissent, elles 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 n'essaie même de démarrer.

15
JensDebergh

Cette réponse m'a beaucoup aidé. Il vous indique comment configurer le fichier secrets.yml en production et comment le lire depuis l'environnement:

lien d'origine: https://stackoverflow.com/a/26172408/496276

J'ai eu le même problème et je l'ai résolu en créant une variable d'environnement à charger à chaque fois que je me connectais au serveur de production et faisais un mini guide des étapes pour le configurer:

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

J'utilisais Rails 4.1 avec Unicorn v4.8.2, lorsque j'ai essayé de déployer mon application, elle n'a pas démarré correctement et dans le fichier Unicorn.log, j'ai trouvé ce message d'erreur:

"erreur d'application: secret_key_base manquant pour l'environnement de" production ", définissez cette valeur dans config/secrets.yml (RuntimeError)"

Après quelques recherches, j'ai découvert que Rails 4.1 a changé la façon de gérer le secret_key, donc si vous lisez le fichier secrets.yml situé dans [exampleRailsProject] /config/secrets.yml, vous trouverez quelque chose comme ça:

Ne conservez pas les secrets de production dans le référentiel,

lisez plutôt les valeurs de l'environnement. production: secret_key_base: <% = ENV ["SECRET_KEY_BASE"]%> Cela signifie que Rails

vous recommande d'utiliser une variable d'environnement pour secret_key_base dans votre serveur de production, afin de résoudre cette erreur, vous devez suivre ces étapes pour créer une variable d'environnement pour Linux (dans mon cas Ubuntu) dans votre serveur de production:

1.- Dans le terminal de votre serveur de production, exécutez la commande suivante:

$ Rails_ENV = production rake secret Ceci retourne une grande chaîne avec des lettres et des chiffres, copiez cela (nous ferons référence à ce code comme GENERATED_CODE).

2.1- Connectez-vous en tant qu'utilisateur root à votre serveur, recherchez ce fichier et modifiez-le: $ vi/etc/profile

Aller en bas du fichier ("MAJ + G" pour le G majuscule dans le VI)

Écrivez votre variable d'environnement avec le GENERATED_CODE (appuyez sur la touche "i" pour écrire dans le VI), assurez-vous d'être dans une nouvelle ligne à la fin du fichier:

export SECRET_KEY_BASE = GENERATED_CODE Enregistrez les modifications et fermez le fichier (nous poussons la touche "ESC" puis écrivons ": x" et la touche "ENTER" pour sauvegarder et quitter dans le VI)

2.2 Mais si vous vous connectez en tant qu'utilisateur normal, appelons-le example_user pour ce Gist, vous devrez trouver l'un de ces autres fichiers:

$ vi ~/.bash_profile $ vi ~/.bash_login $ vi ~/.profile Ces fichiers sont classés par ordre d'importance, ce qui signifie que si vous avez le premier fichier, vous n'aurez pas besoin d'écrire dans les autres. Donc, si vous avez trouvé ces 2 fichiers dans votre répertoire "~/.bash_profile" et "~/.profile" vous n'aurez qu'à écrire dans le premier "~/.bash_profile", car Linux ne lira que celui-ci et l'autre sera ignoré.

Ensuite, nous allons au bas du fichier ("MAJ + G" pour G majuscule dans VI)

Et nous allons écrire notre variable d'environnement avec notre GENERATED_CODE (Appuyez sur la touche "i" pour écrire dans VI), assurez-vous d'être dans une nouvelle ligne à la fin du fichier:

export SECRET_KEY_BASE = GENERATED_CODE Après avoir écrit le code, enregistrez les modifications et fermez le fichier (nous poussons la touche "ESC" puis écrivons la touche ": x" et "ENTER" pour sauvegarder et quitter dans le VI)

3.- Vous pouvez vérifier que notre variable d'environnement est correctement définie sous Linux avec cette commande:

$ printenv | grep SECRET_KEY_BASE ou avec:

$ echo $ SECRET_KEY_BASE Lorsque vous exécutez cette commande, si tout s'est bien passé, elle vous montrera le GENERATED_CODE d'avant. Enfin, avec toute la configuration effectuée, vous devriez pouvoir déployer sans problème votre application Rails avec Unicorn ou autre).

Lorsque vous fermez votre terminal Shell et que vous vous reconnectez au serveur de production, vous aurez cette variable d'environnement définie et prête à l'utiliser.

Et c'est tout!! J'espère que ce mini guide vous aidera à résoudre cette erreur.

Avertissement: je ne suis pas un gourou de Linux ou Rails, donc si vous trouvez quelque chose de mal ou une erreur, je serai heureux de le réparer!

6
matias salgado

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 fonction de sécurité. De cette façon, si vous archivez ce fichier dans le contrôle de version tel que git ou svn, les valeurs development et test sont partagées, ce qui est bien, mais la production (la valeur celui qui serait utilisé sur un vrai site Web) ne l'est pas, donc personne ne peut regarder la source pour obtenir ce secret.

Quant à la variable utilisée, ENV["SECRET_KEY_BASE"], il s'agit d'une variable d'environnement de l'environnement Rails est exécuté (à ne pas confondre avec Rails "environnement", comme development, test et production). Ces variables d'environnement proviennent du shell. Comme mentionné dans la publication de JensD , vous pouvez définir cette variable d'environnement temporairement avec:

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

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

C'est toutefois temporaire et ce n'est pas une bonne solution finale. Pour une solution finale, consultez cet article qui a un petit bout vers la fin sur l'implémentation dotenv pour charger les secrets de configuration. N'oubliez pas que si vous utilisez le contrôle de version, assurez-vous d'exclure votre .env fichier en cours d'enregistrement!

La configuration de dotenv prend un peu de travail, mais je le recommande vivement plutôt que d'essayer de configurer manuellement ces variables d'environnement.

4
RedBassett

de nos jours (Rails 6) Rails génère une base de clé secrète dans tmp/development_secret.txt pour vous.

et dans l'environnement de production, le mieux est d'avoir SECRET_KEY_BASE en tant que variable env, elle sera récupérée par Rails.

vous pouvez vérifier avec Rails.application.secret_key_base.

devrait vous donner une longue chaîne de chiffres et de caractères de 'a' à 'f' (une chaîne codée hexadécimale de 128 caractères)

0
localhostdotdev