Question Comment stocker les paramètres de déploiement / fichiers de configuration de Node.js?


J'ai travaillé sur quelques applications Node, et j'ai cherché un bon schéma 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 de déploiement, à savoir. quelle base de données à qui parler, quelle socket memcache, adresse e-mail pour les administrateurs et ainsi de suite.

J'ai cherché des modèles similaires pour Node. Juste un fichier de configuration serait bien, donc il ne doit pas être coincé 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 dans le contrôle de source. La même application pourrait bien être déployée sur différents serveurs avec des paramètres très différents, et avoir à faire face à des conflits de fusion et tout ce qui n'est pas mon idée de plaisir.

Donc, y a-t-il une sorte de cadre / outil pour cela, ou est-ce que tout le monde pirate quelque chose ensemble?


569
2018-05-03 12:09


origine


Réponses:


J'utilise un package.json pour mes paquets et un config.js pour ma configuration, qui ressemble à:

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

Je charge la config de mon projet:

var config = require('./config');

et puis je peux accéder à mes choses de config.db_host, config.db_port, etc ... Cela me permet soit d'utiliser des paramètres codés en dur, soit des paramètres stockés dans des variables d'environnement si je ne veux pas stocker de mots de passe dans le contrôle de source.

Je génère aussi un package.json et insérez une section de dépendances:

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

Lorsque je clone le projet sur ma machine locale, je cours npm install installer les paquets. Plus d'infos sur ça ici.

Le projet est stocké dans GitHub, avec des télécommandes ajoutées pour mon serveur de production.


701
2018-05-03 13:54



Vous pouvez demander des fichiers JSON à partir de Node v0.5.x (référencer cette réponse)

config.json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);

217
2018-02-03 23:43



Beaucoup plus tard, j'ai trouvé un très bon module Node.js pour gérer la configuration: nconf.

Un exemple simple:

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

Il prend également en charge les paramètres de stockage dans Redis, en écrivant des fichiers de configuration, et possède une API assez solide, et est également soutenue par l'une des boutiques Node.js les plus respectées, Nodejitsu, en tant que membre de Flatiron initiative-cadre, il devrait donc être assez à l'épreuve du futur.

Check-out nconf à Github.


186
2017-12-19 15:28



Ma solution est assez simple:

Chargez la configuration de l'environnement dans ./config/index.js

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

Définir certaines valeurs par défaut dans ./config/config.global.js

var config = module.exports = {};

config.env = 'development';
config.hostname = 'dev.example.com';

//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';

Remplacer les valeurs par défaut dans ./config/config.test.js

var config = require('./config.global');

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

L'utiliser dans ./models/user.js:

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

Exécution de votre application dans un environnement de test:

NODE_ENV=test node ./app.js

Ceci est expliqué plus en détail ici: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/


82
2017-11-26 23:20



Vous pourriez aussi regarder dotenv qui suit les principes d'un 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 facile:

var dotenv = require('dotenv');
dotenv.load();

Ensuite, il vous suffit de créer un fichier .env et de mettre vos paramètres comme suit:

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

C'est dotenv pour nodejs.


30
2018-04-30 00:59



Est-ce que vous utilisez npm pour lancer vos scripts (env etc)?

Si tu utilises .env fichiers, vous pouvez les inclure dans votre package.json et utilisez npm pour les sources / les démarrer.

Exemple:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

puis exécutez les scripts npm:

$ npm start-dev

C'est décrit ici https://gist.github.com/ericelliott/4152984 Tout le crédit à Eric Elliot


29
2017-10-22 23:54



Vous pourriez aussi regarder node-config qui charge le fichier de configuration en fonction de $ HOST et $ NODE_ENV variable (un peu comme RoR): Documentation.

Cela peut être très utile pour différents paramètres de déploiement (development, test ou production).


23
2018-04-23 17:54



Fais simplement un simple settings.js avec exports:

exports.my_password = 'value'

Ensuite, dans votre script, faites un require:

var settings = require('./settings.js');

Tous vos paramètres seront désormais disponibles via settings variable:

settings.my_password // 'value'

20
2018-01-27 16:47