J'ai travaillé sur quelques applications Node et je cherchais un bon modèle de stockage des paramètres liés au déploiement. Dans le monde Django (d'où je viens), la pratique courante serait d'avoir un settings.py
fichier contenant les paramètres standard (fuseau horaire, etc.), puis un local_settings.py
pour les paramètres spécifiques au déploiement, c'est-à-dire. à quelle base de données parler, à quel socket memcache, adresse e-mail pour les administrateurs, etc.
Je cherchais des modèles similaires pour Node. Juste un fichier de configuration serait bien, donc il n'a pas besoin d'être brouillé avec tout le reste app.js
, mais je trouve important d'avoir un moyen d'avoir une configuration spécifique au serveur dans un fichier qui n'est pas en contrôle de source. La même application pourrait bien être déployée sur différents serveurs avec des paramètres extrêmement différents, et avoir à gérer des conflits de fusion et tout cela n'est pas mon idée du plaisir.
Existe-t-il une sorte de cadre / outil pour cela, ou est-ce que tout le monde pirate quelque chose ensemble?
Réponses:
J'utilise un
package.json
pour mes packages et unconfig.js
pour ma configuration, qui ressemble à:Je charge la config de mon projet:
et puis je peux accéder à mes affaires
config.db_host
,config.db_port
etc ... Cela me permet d' utiliser soit des paramètres ou des paramètres hardcoded stockés dans les variables environnementales si je ne veux pas stocker les mots de passe dans le contrôle source.Je génère également un
package.json
et insère une section de dépendances:Lorsque je clone le projet sur ma machine locale, je cours
npm install
pour installer les packages. Plus d'informations à ce sujet ici .Le projet est stocké dans GitHub, avec des télécommandes ajoutées pour mon serveur de production.
la source
Vous pouvez exiger des fichiers JSON à partir de Node v0.5.x ( référençant cette réponse )
config.json:
app.js:
la source
Beaucoup plus tard, j'ai trouvé un assez bon module Node.js pour gérer la configuration: nconf .
Un exemple simple:
Il prend également en charge le stockage des paramètres dans Redis , l'écriture de fichiers de configuration, et dispose d'une API assez solide, et est également soutenu par l'une des boutiques Node.js les plus respectées, Nodejitsu , dans le cadre de l' initiative de framework Flatiron , il devrait donc être assez évolutif.
Découvrez nconf sur Github .
la source
Ma solution est assez simple:
Chargez la configuration de l'environnement dans ./config/index.js
Définissez quelques valeurs par défaut dans ./config/config.global.js
Remplacez les valeurs par défaut dans ./config/config.test.js
L'utiliser dans ./models/user.js:
Exécution de votre application dans un environnement de test:
la source
NODE_ENV
défaut «développement». Vous devriez plutôt vérifier la «production».Vous pouvez également consulter dotenv qui suit les principes d'une application à douze facteurs .
J'avais l'habitude d'utiliser node-config, mais j'ai créé dotenv pour cette raison. Il a été complètement inspiré par la bibliothèque dotenv de ruby.
L'utilisation est assez simple:
Ensuite, il vous suffit de créer un fichier .env et d'y mettre vos paramètres comme ceci:
C'est dotenv pour nodejs.
la source
foreman run node xx.js
il sera automatiquement lu dans votre fichier .env..env
fichier dans votre processus de contrôle de version ou de déploiement.Utilisez-vous npm pour démarrer vos scripts (env, etc.)?
Si vous utilisez des
.env
fichiers, vous pouvez les inclure dans votre fichierpackage.json
et utiliser npm pour les source / démarrer.Exemple:
puis exécutez les scripts npm:
Son décrit ici https://gist.github.com/ericelliott/4152984 Tous les crédits à Eric Elliot
la source
source : not found
source
(ou simplement,.
) est une commande intégrée dans des shells Unix (Bash, etc.) pour lire et exécuter des commandes à partir du fichier donné, dans le shell actuel . Autrement dit, les commandes ne sont pas exécutées dans un sous-shell. L'effet de cela dans cet exemple est que les variables d'environnement définies dansprod.env
sont ajoutées au shell courant et donc transmises à tout processus enfant généré par ce shell. Vous semblez utiliser Windows CMD. Voir cette question pour plus de détails.dev.env
etprod.env
, mais d'avoir un seul.env
fichier par déploiement.Vous pouvez également consulter node-config qui charge le fichier de configuration en fonction de la variable $ HOST et $ NODE_ENV (un peu comme RoR): documentation .
Cela peut être très utile pour différents paramètres de déploiement (
development
,test
ouproduction
).la source
Faites simplement un simple
settings.js
avecexports
:Ensuite, dans votre script, faites
require
:Tous vos paramètres seront désormais disponibles via
settings
variable:la source
Je vais jeter mon chapeau sur le ring ici car aucune de ces réponses ne concerne tous les composants critiques dont presque tous les systèmes ont besoin. Considérations:
Voici comment je fais ma configuration:
config.default.private.js
- Dans le contrôle de version, ce sont des options de configuration par défaut qui ne peuvent être vues que par votre backend.config.default.public.js
- Dans le contrôle de version, ce sont des options de configuration par défaut qui peuvent être vues par le backend et le frontendconfig.dev.private.js
- Si vous avez besoin de différents paramètres par défaut privés pour le dev.config.dev.public.js
- Si vous avez besoin de valeurs par défaut publiques différentes pour le dev.config.private.js
- Pas dans le contrôle de version, ce sont des options spécifiques à l'environnement qui remplacentconfig.default.private.js
config.public.js
- Pas dans le contrôle de version, ce sont des options spécifiques à l'environnement qui remplacentconfig.default.public.js
keys/
- Un dossier où chaque fichier stocke un secret différent d'une sorte. Ce n'est pas non plus sous contrôle de version (les clés ne doivent jamais être sous contrôle de version).J'utilise des fichiers javascript simples pour la configuration, j'ai donc toute la puissance de la jauge javascript (y compris les commentaires et la possibilité de faire des choses comme charger le fichier de configuration par défaut dans le fichier spécifique à l'environnement afin qu'ils puissent ensuite être remplacés). Si vous souhaitez utiliser des variables d'environnement, vous pouvez les charger à l'intérieur de ces fichiers de configuration (je vous déconseille cependant d'utiliser des vars env pour la même raison que je ne recommande pas d'utiliser des fichiers json - vous n'avez pas la puissance d'un langage de programmation pour construire votre config).
La raison pour laquelle chaque clé se trouve dans un fichier séparé est à l'usage du programme d'installation. Cela vous permet d'avoir un programme d'installation qui crée des clés sur la machine et les stocke dans le dossier des clés. Sans cela, votre programme d'installation peut échouer lorsque vous chargez votre fichier de configuration qui ne peut pas accéder à vos clés. De cette façon, vous pouvez parcourir le répertoire et charger tous les fichiers clés qui se trouvent dans ce dossier sans avoir à vous soucier de ce qui existe et de ce qui n'existe pas dans une version donnée de votre code.
Puisque vous avez probablement des clés chargées dans votre configuration privée, vous ne voulez certainement pas charger votre configuration privée dans un code frontal. Bien qu'il soit probablement strictement plus idéal de séparer complètement votre base de code frontend de votre backend, la plupart du temps, PITA est une barrière suffisamment grande pour empêcher les gens de le faire, donc une configuration privée vs publique. Mais il y a deux choses que je fais pour empêcher le chargement d'une configuration privée dans le frontend:
Une dernière chose: votre configuration doit être chargée dans le navigateur via un fichier complètement distinct de tout autre code frontal. Si vous regroupez votre code frontal, la configuration publique doit être construite comme un ensemble complètement distinct. Sinon, votre configuration n'est plus vraiment la configuration - c'est juste une partie de votre code. La configuration doit pouvoir être différente sur différentes machines.
la source
Condamné est une autre option qui ajoute un schéma de validation. Comme nconf, il prend en charge le chargement des paramètres à partir de n'importe quelle combinaison de variables d'environnement, d'arguments, de fichiers et d'objets json.
Exemple du README:
Article de mise en route: Apprivoiser les configurations avec node-convict
la source
Vous pouvez utiliser Konfig pour les fichiers de configuration spécifiques à l'environnement. Il charge automatiquement les fichiers de configuration json ou yaml, il a une valeur par défaut et des fonctionnalités de configuration dynamique.
Un exemple du repo Konfig:
En développement:
En production, supposons que nous commençons l'application avec
$ NODE_ENV=production PORT=4567 node app.js
Plus de détails: https://github.com/vngrs/konfig
la source
Je vais créer un dossier comme config un nom de fichier
config.js
et plus tard j'utiliserai ce fichier partout où requis comme ci-dessousExemple de config.js
Ensuite, si je veux utiliser ce fichier de configuration quelque part
Je vais d'abord importer comme ci-dessous
var config = require('./config');
et je peux accéder aux valeurs ci-dessous
la source
Utilisez simplement le
npm
moduleconfig
(plus de 300000 téléchargements)https://www.npmjs.com/package/config
Node-config organise les configurations hiérarchiques pour les déploiements de vos applications.
Il vous permet de définir un ensemble de paramètres par défaut et de les étendre à différents environnements de déploiement (développement, qa, staging, production, etc.).
la source
Il est préférable de séparer les configurations «développement» et «production» .
J'utilise la manière suivante: Voici mon fichier config / index.js :
Pour exiger la configuration, utilisez ce qui suit:
Vous pouvez ensuite utiliser votre objet de configuration:
la source
module.exports = config;
à la fin duconfig/index.js
fichierJe suis un peu en retard dans le jeu, mais je n'ai pas trouvé ce dont j'avais besoin ici - ou ailleurs - alors j'ai écrit quelque chose moi-même.
Mes exigences pour un mécanisme de configuration sont les suivantes:
settings-overrides.js
- qui a la même apparence mais permet des remplacements de configuration àsettings.js
. L'idée ici est de modifier facilement la configuration sans changer le code. Je le trouve utile pour les saas.Même si je me soucie moins des environnements de support - le vous expliquera comment l'ajouter facilement à ma solution
Explication
undefined
signifie que cette propriété est requisenull
signifie qu'il est facultatifmeConf
- actuellement le code est ciblé vers un fichier sousapp
.meConf
est les fichiers de substitution qui sont ciblésconf/dev
- qui sont ignorés par mes vcs.publicConfiguration
- sera visible du front-end et du back-end.privateConfiguration
- sera visible uniquement depuis le back-end.sendPublicConfiguration
- une route qui exposera la configuration publique et l'affectera à une variable globale. Par exemple, le code ci-dessous exposera la configuration publique en tant que variable globale myConf dans le front-end. Par défaut, il utilisera le nom de la variable globaleconf
.app.get ("/ backend / conf", require ("conf"). sendPublicConfiguration);
Logique des remplacements
Ajout de la prise en charge de l'environnement
Même si je ne trouve pas un "support d'environnement" utile, peut-être que quelqu'un le fera.
Pour ajouter la prise en charge de l'environnement, vous devez remplacer l'instruction meConf require par quelque chose comme ceci (pseudocode)
if (environnement == "production") {meConf = require ("../ conf / dev / meConf"). production; }
if (environnement == "développement") {meConf = require ("../ conf / dev / meConf"). development; }
De même, vous pouvez avoir un fichier par environnement
et importez le bon. Le reste de la logique reste le même.
la source
undefined
signifie vraiment «requis» etnull
signifie «facultatif». donc le bac jaune est pour les plastiques et le bleu pour le papier brouillon? bien, mais a dû lire le manuel avant de jeter cette litière.un exemple alternatif que je viens d'utiliser parce que je voulais plus de flexibilité qu'un fichier .json typique mais que je ne voulais pas qu'il soit extrait dans une bibliothèque qui nécessiterait une dépendance, c'est quelque chose comme ça. Fondamentalement, l'exportation d'une fonction invoquée immédiatement renvoyait un objet avec les valeurs que je voulais définir. Donne beaucoup de flexibilité.
Il y a une bien meilleure explication avec un exemple complet ici. Utilisation de fichiers de configuration dans Node.js
la source
Je sais que c'est un très vieux post. Mais je veux partager mon module pour configurer les variables d'environnement, je pense que c'est une solution très flexible. Voici le module json-configurator
Ensuite, vous pouvez utiliser
process.env.NODE_ENV
pour obtenir toutes les variables de votre environnement.la source
En plus du module nconf mentionné dans cette réponse et de node-config mentionné dans cette réponse , il existe également node-iniparser et IniReader , qui semblent être des analyseurs de fichiers de configuration .ini plus simples.
la source
iniparser
souligne fièrement le fait qu'ils savent comment analyser les sections dans la config ... en 2013 ... si vous avez besoin d'une imbrication plus profonde, dites-vous[foo/bar]
?[foo\bar]
?bar.baz=42
?bar/baz=42
?bar\baz=42
?bar:baz=42
? comment dites-vous42
est un nombre? il pourrait s'agir d'un texte à tous les chiffres! - à partir de XML, lancez YAML, lancez WIN.INI, embrassez JSON, les soucis disparaissent.Je viens de publier récemment un petit module pour charger tout type de fichiers de configuration. C'est assez simple, vous pouvez le vérifier sur https://github.com/flesler/config-node
la source
Vous pouvez utiliser pconf: https://www.npmjs.com/package/pconf
Exemple:
la source
Voici une approche soignée inspirée de cet article . Il ne nécessite aucun package supplémentaire, à l'exception du package lodash omniprésent . De plus, il vous permet de gérer les valeurs par défaut imbriquées avec des remplacements spécifiques à l'environnement.
Tout d'abord, créez un dossier de configuration dans le chemin racine du package qui ressemble à ceci
voici le fichier index.js
Supposons maintenant que nous avons un defaults.json comme
et development.json comme ça
si vous faites
config = require('./config')
ici, c'est ce que vous obtiendrezNotez que vous obtenez toutes les valeurs par défaut, à l'exception de celles définies dans les fichiers spécifiques à l'environnement. Vous pouvez donc gérer une hiérarchie de configuration. L'utilisation
defaultsDeep
garantit que vous pouvez même avoir des valeurs par défaut imbriquées.la source
Pour ceux qui visitent ce vieux fil, voici un package que je trouve bon.
https://www.npmjs.org/package/config
la source
J'ai essayé certaines des solutions suggérées ici, mais je n'en ai pas été satisfait, j'ai donc créé mon propre module. On l'appelle
mikro-config
et la principale différence est qu'il respecte la convention sur la configuration, vous pouvez donc simplement avoir besoin du module et commencer à l'utiliser.Vous stockez votre configuration dans des fichiers js simples ou json à partir du
/config
dossier. D'abord, il charge ledefault.js
fichier, puis tous les autres fichiers du/config
répertoire, puis il charge la configuration spécifique à l'environnement basée sur une$NODE_ENV
variable.Il permet également de remplacer cette configuration pour le développement local avec
local.js
ou spécifique à l'environnement/config/env/$NODE_ENV.local.js
.Vous pouvez le regarder ici:
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
la source
Pendant longtemps, j'ai utilisé l'approche mentionnée dans la solution ici. Il existe cependant une préoccupation quant à la sécurité des secrets en texte clair. Vous pouvez utiliser un autre package par dessus
config
pour que les bits de sécurité soient pris en charge.Vérifiez ceci: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
la source