Ik ben bezig geweest met een paar Node apps, en ik'ben op zoek geweest naar een goed patroon voor het opslaan van deployment-gerelateerde instellingen. In de Django wereld (waar ik vandaan kom), is het gebruikelijk om een settings.py
bestand te hebben met de standaard instellingen (tijdzone, etc), en dan een local_settings.py
voor deployment specifieke instellingen, bijvoorbeeld met welke database te praten, welke memcache socket, e-mail adres voor de admins en ga zo maar door.
Ik ben op zoek geweest naar vergelijkbare patronen voor Node. Gewoon een config bestand zou mooi zijn, zodat het niet hoeft te worden gepropt met al het andere in app.js
, maar ik vind het belangrijk om een manier te hebben om server-specifieke configuratie in een bestand te hebben dat niet in source control is. Dezelfde app zou wel eens op verschillende servers kunnen draaien met totaal verschillende instellingen, en te maken krijgen met conflicten over samenvoegingen en zo, is niet mijn idee van lol.
Dus is hier een soort framework/tool voor, of hackt iedereen gewoon zelf iets in elkaar?
Ik gebruik een package.json
voor mijn pakketten en een config.js
voor mijn configuratie, die er als volgt uitziet:
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;
Ik laad de config van mijn project:
var config = require('./config');
en dan kan ik mijn dingen benaderen vanuit config.db_host
, config.db_port
, enz... Dit laat me toe om ofwel hardcoded parameters te gebruiken, of parameters opgeslagen in omgevingsvariabelen als ik geen'wachtwoorden wil opslaan in bronbeheer.
Ik genereer ook een package.json
en voeg een dependencies sectie in:
"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"
}
Wanneer ik het project kloon naar mijn lokale machine, voer ik npm install
uit om de pakketten te installeren. Meer info daarover hier.
Het project is opgeslagen in GitHub, met remotes toegevoegd voor mijn productie server.
Veel later, vond ik een vrij goede Node.js module voor het beheren van configuratie: nconf.
Een eenvoudig voorbeeld:
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'));
Het ondersteunt ook het opslaan van instellingen in Redis, het schrijven van configuratiebestanden, en heeft een vrij solide API, en wordt ook ondersteund door een van de meer gerespecteerde Node.js winkels, Nodejitsu, als onderdeel van het Flatiron framework initiatief, dus het zou vrij toekomstbestendig moeten zijn.
Bekijk nconf op Github.
Je zou ook kunnen kijken naar node-config die configuratie bestand laadt afhankelijk van $HOST en __$NODE_ENV__ variabele (een beetje zoals RoR) : documentation.
Dit kan handig zijn voor verschillende deployment settings (development
, test
of production
).