私はいくつかのNodeアプリに取り組んできました、そして私はデプロイメント関連の設定を保存する良いパターンを探しています。 Djangoの世界(私の出身)では、一般的なやり方は標準設定(timezoneなど)を含むsettings.py
ファイルを作成し、次にデプロイメント固有の設定のためのlocal_settings.py
を作成することです。どのデータベースと通信するか、どのmemcacheソケット、管理者用のEメールアドレスなど。
私はNodeについても同様のパターンを探しています。設定ファイルだけでいいので、app.js
内の他のすべてのファイルでぎゅうぎゅう詰めする必要はありませんが、ソース管理ではないファイルにサーバー固有の設定を含める方法を持つことが重要です。まったく異なる設定で、同じアプリケーションを異なるサーバー間に配置することもでき、マージの競合に対処する必要があり、それがすべて私の楽しみの考えではありません。
それで、これに対する何らかの種類のフレームワーク/ツールがありますか、それとも誰もが自分自身で何かを一緒にハックしますか?
かなり後で、構成を管理するためのかなり良いNode.jsモジュールを見つけました: nconf 。
簡単な例:
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'));
また、設定を Redis に保存すること、構成ファイルを書き込むことをサポートし、かなり堅実なAPIを持ちます。また、より尊敬されるNode.jsショップの1つ Nodejits =、 Flatiron フレームワークイニシアチブの一環として、かなり将来性があるはずです。
Githubのnconf をご覧ください。
私は自分のパッケージにpackage.json
を、私の設定にconfig.js
を使っています。
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;
プロジェクトから設定をロードします。
var config = require('./config');
これで、config.db_Host
、config.db_port
などから自分のものにアクセスできます。これにより、ハードコードされたパラメータ、またはパスワードをソース管理に格納したくない場合は環境変数に格納されたパラメータを使用できます。
私はまたpackage.json
を生成し、依存関係セクションを挿入します。
"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"
}
プロジェクトを自分のローカルマシンに複製するとき、私はnpm install
を実行してパッケージをインストールします。それについてのより多くの情報 ここ 。
プロジェクトはGitHubに保存されており、私の本番サーバー用にリモートが追加されています。
Node v0.5.x以降でJSONファイルを要求することができます( この回答を参照してください )
config.json:
{
"username" : "root",
"password" : "foot"
}
app.js:
var config = require('./config.json');
log_in(config.username, config.password);
私の解決策はかなり簡単です。
環境設定を./config/index.jsにロードします。
var env = process.env.NODE_ENV || 'development'
, cfg = require('./config.'+env);
module.exports = cfg;
./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';
./config/config.test.js内のデフォルトをオーバーライドする
var config = require('./config.global');
config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';
module.exports = config;
./models/user.jsでそれを使う:
var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
テスト環境でアプリを実行する
NODE_ENV=test node ./app.js
これについては、ここで詳しく説明します。 http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/
また、 dotenv を見ることもできます。これは、 12要素アプリの原則 に従っています。
以前はnode-configを使用していましたが、そのためにdotenvを作成しました。それはRubyのdotenvライブラリに完全に触発されました。
使い方はとても簡単です。
var dotenv = require('dotenv');
dotenv.load();
次に、.envファイルを作成して、そこに設定を追加します。
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name
Nodejsの場合は、 dotenv です。
スクリプトを起動するのにnpmを使用しているのですか(envなど)?
.env
ファイルを使用する場合は、それらをpackage.json
に含め、npmを使用してそれらをソース/開始することができます。
例:
{
"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": "*"
}
}
それからnpmスクリプトを実行します。
$ npm start-dev
その説明はここにあります https://Gist.github.com/ericelliott/4152984 Eric Elliotへのすべての功績
$ Host および $ NODE_ENV 変数(RoRに少し似ています)に応じて設定ファイルをロードする node-config を見ることもできます: documentation 。
これは、さまざまなデプロイメント設定(development
、test
、またはproduction
)に非常に便利です。
exports
を付けて単純なsettings.js
を実行するだけです。
exports.my_password = 'value'
それから、あなたのスクリプトで、require
をしてください:
var settings = require('./settings.js');
設定はすべてsettings
変数で利用可能になります。
settings.my_password // 'value'
これらの答えはどれも、ほとんどすべてのシステムが必要とするすべての重要なコンポーネントに対処するものではないので、ここで私の帽子をリングに入れるつもりです。考慮事項:
これが私の設定方法です。
config.default.private.js
- バージョン管理では、これらはあなたのバックエンドからしか見えないデフォルトの設定オプションです。config.default.public.js
- バージョン管理において、これらはバックエンド と frontendで見ることができるデフォルトの設定オプションです。config.dev.private.js
- devに異なるプライベートデフォルトが必要な場合.config.dev.public.js
- devに対して異なるパブリックデフォルトが必要な場合.config.private.js
- バージョン管理ではなく、これらはconfig.default.private.js
をオーバーライドする環境固有のオプションです。config.public.js
- バージョン管理ではなく、これらはconfig.default.public.js
をオーバーライドする環境固有のオプションです。keys/
- 各ファイルが異なる種類の秘密を格納するフォルダー。これもバージョン管理下にはありません(キーをバージョン管理下にしないでください)。私は設定のために普通のjavascriptファイルを使っているので、私はjavascript言語のフルパワーを持っています(コメントや環境設定ファイルにデフォルトの設定ファイルをロードして上書きできるようにする能力を含みます)。環境変数を使用したい場合は、それらの設定ファイル内にそれらをロードすることができます(私はjsonファイルの使用を推奨しないのと同じ理由でenv varsの使用をお勧めしません - 構築するプログラミング言語の力がありません)あなたの設定)。
各キーが別々のファイルに入っているのは、インストーラが使用するためです。これにより、マシン上でキーを作成してそれらをキーフォルダーに保存するインストーラーを作成できます。これがないと、キーにアクセスできない設定ファイルをロードしたときにインストーラが失敗する可能性があります。これにより、存在するものと特定のバージョンのコードに存在しないものを気にせずに、ディレクトリ内を移動してそのフォルダ内のキーファイルをロードできます。
おそらくあなたのプライベート設定にキーがロードされているので、 間違いなく フロントエンドコードでプライベート設定をロードしたくないでしょう。フロントエンドのコードベースをバックエンドから完全に分離することがおそらくより厳密に理想的ですが、多くの場合、PITAは人々がそれを実行するのを防ぐのに十分な大きな障壁であり、したがってプライベート対パブリックの設定です。しかし、プライベート設定がフロントエンドにロードされないようにするために私がすることが2つあります。
最後にもう一つ:あなたの設定は他のフロントエンドコードのどれよりも 完全に 別々のファイルを通してブラウザにロードされるべきです。フロントエンドコードをバンドルする場合、パブリック設定は完全に別のバンドルとして構築されるべきです。そうでなければ、あなたの設定は実際にはもう設定されていません - それはあなたのコードのほんの一部です。 Configはマシンごとに異なる必要があります。
環境固有の設定ファイルには Konfig を使用できます。それは自動的にJSONまたはYAMLの設定ファイルをロードし、それはデフォルト値と動的な設定機能を持っています。
Konfigレポからの例:
File: config/app.json
----------------------------
{
"default": {
"port": 3000,
"cache_assets": true,
"secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
},
"development": {
"cache_assets": false
},
"test": {
"port": 3001
},
"staging": {
"port": #{process.env.PORT},
"secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
},
"production": {
"port": #{process.env.PORT},
"secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
}
}
開発中:
> config.app.port
3000
プロダクションでは、$ NODE_ENV=production PORT=4567 node app.js
でアプリケーションを起動するとします
> config.app.port
4567
Convict は検証用のスキーマを追加する別のオプションです。 nconfと同様に、環境変数、引数、ファイル、およびjsonオブジェクトの任意の組み合わせから設定をロードすることをサポートします。
READMEからの例:
var convict = require('convict');
var conf = convict({
env: {
doc: "The applicaton environment.",
format: ["production", "development", "test"],
default: "development",
env: "NODE_ENV"
},
ip: {
doc: "The IP address to bind.",
format: "ipaddress",
default: "127.0.0.1",
env: "IP_ADDRESS",
},
port: {
doc: "The port to bind.",
format: "port",
default: 0,
env: "PORT"
}
});
入門記事: node-convictを使った設定の調整
私はconfigとしてconfig.js
として命名するファイルとしてフォルダを作成し、後で私は以下のように必要に応じてこのファイルを使用します
Config.jsの例
module.exports = {
proxyURL: 'http://url:port',
Twitter: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
},
GOOGLE: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
},
FACEBOOK: {
consumerkey: 'yourconsumerkey',
consumerSecrete: 'yourconsumersecrete'
}
}
それから私はどこかにこの設定ファイルを使用したい場合
以下のように最初にインポートします
var config = require('./config');
そして私は以下のように値にアクセスすることができます
const oauth = OAuth({
consumer: {
key: config.Twitter.consumerkey,
secret: config.Twitter.consumerSecrete
},
signature_method: 'HMAC-SHA1',
hash_function(base_string, key) {
return crypto.createHmac('sha1', key).update(base_string).digest('base64');
}
});
典型的な.jsonファイルよりも高い柔軟性を求めていたが、依存関係を必要とするライブラリに抽象化したくなかったので、私が使用した代替例はこのようなものです。基本的には、すぐに呼び出された関数をエクスポートすると、設定したい値を持つオブジェクトが返されます。多くの柔軟性を与えます。
module.exports = function(){
switch(node_env){
case 'dev':
return
{ var1 = 'development'};
}
}();
ここには完全な例でもっと良い説明があります。 Node.jsで設定ファイルを使用する
これは本当に古い投稿です。しかし、環境変数を設定するためのモジュールを共有したいのですが、それは非常に柔軟なソリューションだと思います。これがモジュール json-configurator です
var configJson = {
'baseUrl': 'http://test.com',
'$prod_baseUrl': 'https://prod.com',
'endpoints': {
'users': '<%= baseUrl %>/users',
'accounts': '<%= baseUrl %>/accounts'
},
foo: 'bar',
foobar: 'foobar',
$prod_foo: 'foo in prod',
$test_foo: 'foo in test',
deep:{
veryDeep: {
publicKey: 'abc',
secret: 'secret',
$prod_secret: 'super secret'
}
}
};
var config = require('json-configurator')(configJson, 'prod');
console.log(config.deep.veryDeep.secret)
// super secret
console.log(config.endpoints.users)
// https://prod.com/users
そうすれば、process.env.NODE_ENV
を使って自分の環境のすべての変数を取得できます。
私はもう少し遅れてゲームをしていますが、私がここで必要なものを見つけることができませんでした。
構成メカニズムに関する私の要件は以下のとおりです。
settings-overrides.js
をサポート - これは同じように見えますが、settings.js
での設定の上書きを許可します。ここでの考え方は、コードを変更せずに設定を簡単に変更することです。私はそれがsaasに役立つと思います。私は環境のサポートについてはあまり気にしていませんが、それを私のソリューションに簡単に追加する方法を説明します
var publicConfiguration = {
"title" : "Hello World"
"demoAuthToken" : undefined,
"demoUserId" : undefined,
"errorEmail" : null // if null we will not send emails on errors.
};
var privateConfiguration = {
"port":9040,
"adminAuthToken":undefined,
"adminUserId":undefined
}
var meConf = null;
try{
meConf = require("../conf/dev/meConf");
}catch( e ) { console.log("meConf does not exist. ignoring.. ")}
var publicConfigurationInitialized = false;
var privateConfigurationInitialized = false;
function getPublicConfiguration(){
if (!publicConfigurationInitialized) {
publicConfigurationInitialized = true;
if (meConf != null) {
for (var i in publicConfiguration) {
if (meConf.hasOwnProperty(i)) {
publicConfiguration[i] = meConf[i];
}
}
}
}
return publicConfiguration;
}
function getPrivateConfiguration(){
if ( !privateConfigurationInitialized ) {
privateConfigurationInitialized = true;
var pubConf = getPublicConfiguration();
if ( pubConf != null ){
for ( var j in pubConf ){
privateConfiguration[j] = pubConf[j];
}
}
if ( meConf != null ){
for ( var i in meConf ){
privateConfiguration[i] = meConf[i];
}
}
}
return privateConfiguration;
}
exports.sendPublicConfiguration = function( req, res ){
var name = req.param("name") || "conf";
res.send( "window." + name + " = " + JSON.stringify(getPublicConfiguration()) + ";");
};
var prConf = getPrivateConfiguration();
if ( prConf != null ){
for ( var i in prConf ){
if ( prConf[i] === undefined ){
throw new Error("undefined configuration [" + i + "]");
}
exports[i] = prConf[i];
}
}
return exports;
undefined
は、このプロパティが必須であることを意味しますnull
はオプションであることを意味しますmeConf
- 現在、コードはapp
の下のファイルをターゲットにしています。 meConf
はconf/dev
をターゲットとする上書きファイルです - これは私のvcsでは無視されます。publicConfiguration
- フロントエンドとバックエンドから見えます。privateConfiguration
- バックエンドからのみ見えるようになります。sendPublicConfiguration
- パブリック設定を公開し、それをグローバル変数に割り当てるルート。例えば、以下のコードは、フロントエンドでパブリック設定をグローバル変数myConfとして公開します。デフォルトではグローバル変数名conf
を使います。
app.get( "/ backend/conf"、必須( "conf")。sendPublicConfiguration);
「環境サポート」は役に立ちませんが、誰かが役に立つかもしれません。
環境サポートを追加するには、meConf requireステートメントを次のようなものに変更する必要があります(疑似コード)
if(environment == "production"){meConf = require( "../ conf/dev/meConf")。production; }
if(environment == "development"){meConf = require( "../ conf/dev/meConf")。development; }
同様に、あなたは環境ごとにファイルを持つことができます
meConf.development.js
meConf.production.js
正しいものをインポートしてください。他のロジックは同じです。
'development' と 'production' configsを分離するのが良いでしょう。
私は次のように使います:これが私の config/index.js fileです。
const config = {
dev : {
ip_address : '0.0.0.0',
port : 8080,
mongo :{
url : "mongodb://localhost:27017/story_box_dev",
options : ""
}
},
prod : {
ip_address : '0.0.0.0',
port : 3000,
mongo :{
url : "mongodb://localhost:27017/story_box_prod",
options : ""
}
}
}
設定には以下を使用する必要があります。
const config = require('../config')[process.env.NODE_ENV];
あなたがあなたのconfigオブジェクトを使うことができるより:
const ip_address = config.ip_address;
const port = config.port;
npm
モジュールconfig
を使うだけです(300000以上のダウンロード)
https://www.npmjs.com/package/config
Node-configはあなたのアプリのデプロイのための階層的な設定を整理します。
これにより、一連のデフォルトパラメータを定義し、それらをさまざまなデプロイメント環境(開発、QA、ステージング、プロダクションなど)に拡張できます。
$ npm install config
$ mkdir config
$ vi config/default.json
{
// Customer module configs
"Customer": {
"dbConfig": {
"Host": "localhost",
"port": 5984,
"dbName": "customers"
},
"credit": {
"initialLimit": 100,
// Set low for development
"initialDays": 1
}
}
}
$ vi config/production.json
{
"Customer": {
"dbConfig": {
"Host": "prod-db-server"
},
"credit": {
"initialDays": 30
}
}
}
$ vi index.js
var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);
if (config.has('optionalFeature.detail')) {
var detail = config.get('optionalFeature.detail');
//...
}
$ export NODE_ENV=production
$ node index.js
あなたはpconfを使うことができます: https://www.npmjs.com/package/pconf
例:
var Config = require("pconf");
var testConfig = new Config("testConfig");
testConfig.onload = function(){
testConfig.setValue("test", 1);
testConfig.getValue("test");
//testConfig.saveConfig(); Not needed
}
nconfモジュール に記載されている この回答 、および node-config に記載されている この回答 には もあります。 node-iniparser および IniReader 。これらは、より単純な.ini構成ファイルパーサーのように見えます。
私は最近、あらゆるタイプの設定ファイルをロードするための小さなモジュールをリリースしました。それはかなり簡単です、あなたは https://github.com/flesler/config-node でそれをチェックすることができます
長い間、私はここの解決策で述べたアプローチを使用していました。しかし、平文での秘密の安全性について懸念があります。セキュリティビットが処理されるようにconfig
の上に別のパッケージを使うことができます。
これをチェックしてください: https://www.attosol.com/secure-application-secrets-using-masterkey-in-Azure-key-vault/
この古いスレッドを訪れている人のためにここに私は良いことがわかっているパッケージです。
私はここで提案された解決策のいくつかを試してみましたが、それらに満足していなかったので、私は私自身のモジュールを作成しました。それはmikro-config
と呼ばれ、主な違いはそれが設定よりも規約を尊重するということです、それであなたはただモジュールを要求してそれを使い始めることができます。
あなたはあなたの設定を普通のjsか/config
フォルダからのjsonファイルに保存します。最初にdefault.js
ファイルをロードし、次に/config
ディレクトリから他のすべてのファイルをロードし、次に$NODE_ENV
変数に基づいて環境固有の構成をロードします。
ローカル開発用のこの設定をlocal.js
または環境固有の/config/env/$NODE_ENV.local.js
で上書きすることもできます。
あなたはここでそれを見てみることができます: