Wie speichert man Node.js Deployment-Einstellungen/Konfigurationsdateien?

Ich habe an ein paar Node-Apps gearbeitet, und ich habe nach einem guten Muster für die Speicherung von einsatzbezogenen Einstellungen gesucht. In der Django-Welt (wo ich herkomme) ist es üblich, eine Datei "settings.py" zu haben, die die Standardeinstellungen (Zeitzone usw.) enthält, und dann eine "local_settings.py" für einsatzspezifische Einstellungen, z.B. welche Datenbank angesprochen werden soll, welcher Memcache-Socket, E-Mail-Adresse für die Administratoren und so weiter.

Ich habe nach ähnlichen Mustern für Node gesucht. Nur eine Konfigurationsdatei wäre schön, damit sie nicht mit allem anderen in app.js eingeklemmt werden muss, aber ich finde es wichtig, eine Möglichkeit zu haben, serverspezifische Konfiguration in einer Datei zu haben, die nicht in der Quellcodekontrolle ist. Dieselbe Anwendung könnte durchaus auf verschiedenen Servern mit völlig unterschiedlichen Einstellungen eingesetzt werden, und sich mit Merge-Konflikten und all dem herumschlagen zu müssen, ist nicht meine Vorstellung von Spaß.

Gibt es also eine Art Framework/Tool dafür, oder bastelt sich jeder selbst etwas zusammen?

Ich verwende eine package.json für meine Pakete und eine config.js für meine Konfiguration, die wie folgt aussieht:

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;

Ich lade die Konfiguration aus meinem Projekt:

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

und dann kann ich auf meine Sachen über config.db_host, config.db_port, etc. zugreifen. So kann ich entweder hart kodierte Parameter verwenden oder Parameter, die in Umgebungsvariablen gespeichert sind, wenn ich keine Passwörter in der Versionsverwaltung speichern möchte.

Ich generiere auch eine package.json und füge einen Abschnitt mit Abhängigkeiten ein:

"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"
}

Wenn ich das Projekt auf meinen lokalen Rechner klone, lasse ich npm install laufen, um die Pakete zu installieren. Mehr Informationen dazu hier.

Das Projekt ist in GitHub gespeichert, wobei Remotes für meinen Produktionsserver hinzugefügt wurden.

Kommentare (18)
Lösung

Viel später fand ich ein ziemlich gutes Node.js-Modul zur Verwaltung der Konfiguration: nconf.

Ein einfaches Beispiel:

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'));

Es unterstützt auch das Speichern von Einstellungen in Redis, das Schreiben von Konfigurationsdateien und hat eine ziemlich solide API. Außerdem wird es von einem der angeseheneren Node.js-Läden, Nodejitsu, als Teil der Flatiron-Framework-Initiative unterstützt, so dass es ziemlich zukunftssicher sein sollte.

Schauen Sie sich nconf auf Github an.

Kommentare (15)

Sie können auch node-config verwenden, das die Konfigurationsdatei abhängig von den Variablen $HOST und __$NODE_ENV__ lädt (ein wenig wie RoR): documentation.

Dies kann sehr nützlich sein für verschiedene Bereitstellungseinstellungen (Entwicklung, Test oder Produktion).

Kommentare (0)