Ne jamais coder en dur des informations sensibles (identifiants de compte, mots de passe, etc.) . Créez plutôt un fichier pour stocker ces informations sous forme de variables d'environnement (paires clé/valeur), et excluez ce fichier de votre système de gestion du code source. Par exemple, en ce qui concerne Git (système de gestion du code source), excluez ce fichier en l'ajoutant à . gitignore :
-bash> echo '/config/app_environment_variables.rb' >> .gitignore
/config/app_environment_variables.rb
ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'
De même, ajoutez les lignes suivantes à /config/environment.rb
entre le require
et la Application.initialize
ligne :
# Load the app's custom environment variables here, so that they are loaded before environments/*.rb
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)
C'est ça !
Comme le dit le commentaire ci-dessus, en faisant cela vous allez charger vos variables d'environnement avant environments/*.rb
ce qui signifie que vous pourrez faire référence à vos variables à l'intérieur de ces fichiers (par ex. environments/production.rb
). C'est un grand avantage par rapport au fait de mettre votre fichier de variables d'environnement à l'intérieur de /config/initializers/
.
À l'intérieur de app_environment_variables.rb
il n'y a pas besoin de distinguer les environnements dans la mesure où développement o production parce que vous ne livrerez jamais ce fichier dans votre système de gestion du code source. développement par défaut. Mais si vous avez besoin de définir quelque chose de spécial pour l'élément test (ou pour les occasions où vous testez production mode localement ), il suffit d'ajouter un bloc conditionnel en dessous de toutes les autres variables :
if Rails.env.test?
ENV['HTTP_USER'] = 'testuser'
ENV['HTTP_PASS'] = 'testpass'
end
if Rails.env.production?
ENV['HTTP_USER'] = 'produser'
ENV['HTTP_PASS'] = 'prodpass'
end
Chaque fois que vous mettez à jour app_environment_variables.rb
redémarrez le serveur d'applications. En supposant que vous utilisiez des logiciels comme Apache/Passenger ou rails server
:
-bash> touch tmp/restart.txt
Dans votre code, faites référence aux variables d'environnement comme suit :
def authenticate
authenticate_or_request_with_http_basic do |username, password|
username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
end
end
Notez que dans app_environment_variables.rb
vous devez spécifier booléens y numéros como chaînes de caractères (par exemple ENV['SEND_MAIL'] = 'false'
pas seulement false
y ENV['TIMEOUT'] = '30'
pas seulement 30
), sinon vous obtiendrez les erreurs can't convert false into String
y can't convert Fixnum into String
respectivement.
Stockage et partage d'informations sensibles
Le dernier noeud à faire est : comment partager ces informations sensibles avec vos clients et/ou partenaires ? Pour assurer la continuité des activités (par exemple, si vous êtes frappé par une étoile filante, comment vos clients et/ou partenaires pourront-ils reprendre l'exploitation complète du site ? L'envoi de ces informations par e-mail ou par courrier électronique n'est pas sûr et mène au désordre. Le stockage dans des Google Docs partagés n'est pas mauvais (si tout le monde utilise https), mais une application dédiée au stockage et au partage de petits détails comme les mots de passe serait idéale.
Comment définir les variables d'environnement sur Heroku
Si vous avez un seul environnement sur Heroku :
-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'
Si vous avez environnements multiples sur Heroku :
-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging
-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production
Foreman et .env
De nombreux développeurs utilisent Foreman (installé avec le Ceinture d'outils Heroku ) à exécuter leurs applications localement (plutôt que d'utiliser des logiciels comme Apache/Passenger ou rails server
). Foreman et Heroku utilisent Procfile
pour déclarer quelles commandes sont exécutées par votre application La transition du développement local à Heroku est donc transparente à cet égard. J'utilise Foreman et Heroku dans chaque projet Rails, donc cette commodité est formidable. Mais voici le problème Foreman charge les variables d'environnement stockées dans /.env
via dotenv mais malheureusement dotenv ne fait qu'analyser le fichier pour trouver key=value
paires ces paires ne deviennent pas des variables immédiatement, donc vous ne pouvez pas faire référence à des variables déjà définies (pour garder les choses DRY), et vous ne pouvez pas non plus faire du "Ruby" là-dedans (comme indiqué ci-dessus avec les conditionnelles), ce que vous pouvez faire en /config/app_environment_variables.rb
. Par exemple, en ce qui concerne le maintien de l'anonymat, je fais parfois ce genre de choses :
ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO'] = ENV['SUPPORT_EMAIL']
C'est pourquoi j'utilise Foreman pour exécuter mes applications localement, mais je n'utilise pas son système de gestion de la qualité. .env
pour le chargement des variables d'environnement ; j'utilise plutôt Foreman en conjonction avec l'application /config/app_environment_variables.rb
décrite ci-dessus.
1 votes
Notez que la commande bash doit être
export admin_password="secret"
pasexport admin_password = "secret"
.