Node.js 배포 설정 / 구성 파일을 저장하는 방법은 무엇입니까?
저는 몇 가지 Node 앱을 작업하고 있으며 배포 관련 설정을 저장하는 좋은 패턴을 찾고 있습니다. Django 세계 (내가 출신)에서 일반적인 관행은 settings.py
표준 설정 (시간대 등)이 포함 된 파일과 local_settings.py
배포 특정 설정, 즉. 대화 할 데이터베이스, memcache 소켓, 관리자를위한 이메일 주소 등.
Node.js와 비슷한 패턴을 찾고 있습니다. 구성 파일 만 있으면 좋을 것이므로에서 다른 모든 항목에 얽매일 app.js
필요는 없지만 소스 제어에없는 파일에서 서버 별 구성을 갖는 방법이 중요하다는 것을 알게되었습니다. 동일한 앱을 매우 다른 설정으로 여러 서버에 배포 할 수 있으며 병합 충돌을 처리해야하는 것은 내 생각이 아닙니다.
그래서이를위한 어떤 종류의 프레임 워크 / 도구가 있습니까, 아니면 모두가 스스로 무언가를 해킹합니까?
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);
훨씬 나중에 구성 관리를위한 매우 좋은 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를 가지고 있으며 , Flatiron 프레임 워크 이니셔티브의 일부로 더 존경받는 Node.js 상점 중 하나 인 Nodejitsu의 지원을받습니다 . 상당히 미래 지향적입니다.
Github에서 nconf를 확인하십시오 .
내 솔루션은 매우 간단합니다.
./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/ 에서 자세히 설명합니다.
12 단계 앱 의 원칙을 따르는 dotenv 를 살펴볼 수도 있습니다 .
나는 node-config를 사용했지만 그 이유로 dotenv를 만들었습니다. 루비의 dotenv 라이브러리에서 완전히 영감을 받았습니다.
사용법은 매우 쉽습니다.
var dotenv = require('dotenv');
dotenv.load();
그런 다음 .env 파일을 만들고 다음과 같이 설정을 넣습니다.
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name
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
)에 매우 유용 할 수 있습니다 .
다음 settings.js
과 exports
같이 간단하게 수행하십시오 .
exports.my_password = 'value'
그런 다음 스크립트에서 다음을 수행하십시오 require
.
var settings = require('./settings.js');
이제 모든 설정을 settings
변수 를 통해 사용할 수 있습니다 .
settings.my_password // 'value'
이 답변 중 어느 것도 거의 모든 시스템에 필요한 모든 중요한 구성 요소를 다루지 않기 때문에 여기에 내 모자를 던질 것입니다. 고려 사항 :
- 공개 구성 (프런트 엔드에서 볼 수 있음) 대 비공개 구성 (guy mograbi가이 문제를 맞았습니다). 그리고 이들을 별도로 보관해야합니다.
- 열쇠와 같은 비밀
- 기본값과 환경 별 재정의
- 프런트 엔드 번들
내 구성을 수행하는 방법은 다음과 같습니다.
config.default.private.js
-버전 제어에서 이들은 백엔드에서만 볼 수있는 기본 구성 옵션입니다.config.default.public.js
-버전 제어에서 이들은 백엔드 및 프런트 엔드에서 볼 수있는 기본 구성 옵션입니다.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/
-각 파일이 어떤 종류의 다른 비밀을 저장하는 폴더. 이것은 또한 버전 제어하에 있지 않습니다 (키는 버전 제어하에 있어서는 안됩니다).
구성을 위해 평범한 자바 스크립트 파일을 사용하므로 자바 스크립트 언어의 모든 기능을 사용할 수 있습니다 (주석 및 환경 별 파일에 기본 구성 파일을로드하는 등의 작업을 수행 할 수있는 기능 포함). 환경 변수를 사용하려면 해당 구성 파일 내에서로드 할 수 있습니다 (따라서 json 파일 사용을 권장하지 않는 것과 같은 이유로 env vars를 사용하지 않는 것이 좋습니다. 구성 할 프로그래밍 언어의 힘이 없습니다. 귀하의 구성).
각 키가 별도의 파일에있는 이유는 설치 프로그램 용입니다. 이를 통해 컴퓨터에 키를 생성하고 키 폴더에 저장하는 설치 프로그램을 가질 수 있습니다. 이것이 없으면 키에 액세스 할 수없는 구성 파일을로드 할 때 설치 프로그램이 실패 할 수 있습니다. 이런 식으로 디렉토리를 탐색하고 해당 폴더에있는 모든 키 파일을로드 할 수 있습니다. 이는 코드의 특정 버전에 무엇이 있는지 걱정할 필요가 없습니다.
당신은 아마 개인 구성에로드 키를 가지고 있기 때문에, 당신은 확실히 어떤 프론트 엔드 코드에서 개인 설정을로드하지 않습니다. 프론트 엔드 코드베이스를 백엔드에서 완전히 분리하는 것이 훨씬 더 이상적 일 수 있지만, PITA는 사람들이이를 수행하지 못하도록 충분히 큰 장벽이므로 개인 구성과 공개 구성을 비교합니다. 하지만 프런트 엔드에 비공개 구성이로드되는 것을 방지하기 위해 내가하는 두 가지 작업이 있습니다.
- 내 프런트 엔드 번들에 비공개 구성에있는 비밀 키 중 하나가 포함되지 않았는지 확인하는 단위 테스트가 있습니다.
- 백엔드 코드와 다른 폴더에 프런트 엔드 코드가 있고 "config.js"라는 두 개의 다른 파일이 있습니다. 백엔드의 경우 config.js는 비공개 구성을로드하고 프런트 엔드의 경우 공개 구성을로드합니다. 그런 다음 항상 필요 ( 'config')하고 그것이 어디에서 왔는지 걱정하지 마십시오.
마지막으로, 구성은 다른 프런트 엔드 코드 와는 완전히 별개의 파일을 통해 브라우저에로드되어야합니다 . 프런트 엔드 코드를 번들로 묶는 경우 공개 구성은 완전히 별도의 번들로 빌드되어야합니다. 그렇지 않으면 구성이 더 이상 실제 구성이 아닙니다. 코드의 일부일뿐입니다. 구성은 다른 컴퓨터에서 다를 수 있어야합니다.
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로 구성 길들이기
환경 별 구성 파일에 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
자세한 내용 : https://github.com/vngrs/konfig
파일 이름을 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');
}
});
'개발' 및 '프로덕션' 구성 을 분리하는 것이 좋습니다 .
다음과 같은 방법으로 사용합니다. 다음은 내 config / index.js 파일입니다.
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];
구성 개체를 사용할 수 있습니다.
const ip_address = config.ip_address;
const port = config.port;
npm
모듈 만 사용 config
(300,000 회 이상 다운로드)
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
게임이 조금 늦었지만 여기나 다른 곳에서 필요한 것을 찾을 수 없어서 직접 썼습니다.
구성 메커니즘에 대한 요구 사항은 다음과 같습니다.
- 프런트 엔드를 지원합니다. 프런트 엔드가 구성을 사용할 수없는 경우 어떤 점이 중요합니까?
- 지원
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
. 내 vcs에서 무시되는meConf
대상 재정의 파일입니다conf/dev
.publicConfiguration
-프런트 엔드와 백 엔드에서 볼 수 있습니다.privateConfiguration
-백엔드에서만 볼 수 있습니다.sendPublicConfiguration
-공개 구성을 노출하고 전역 변수에 할당하는 경로입니다. 예를 들어 아래 코드는 프런트 엔드에서 공용 구성을 전역 변수 myConf로 노출합니다. 기본적으로 전역 변수 이름을 사용합니다conf
.app.get ( "/ backend / conf", require ( "conf"). sendPublicConfiguration);
재정의 논리
- privateConfiguration은 publicConfiguration 및 meConf와 병합됩니다.
- publicConfiguration은 각 키에 재정의가 있는지 확인하고 해당 재정의를 사용합니다. 이런 식으로 우리는 사적인 것을 노출하지 않습니다.
환경 지원 추가
"환경 지원"이 유용하지 않더라도 누군가는 유용 할 것입니다.
환경 지원을 추가하려면 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
올바른 것을 가져옵니다. 나머지 논리는 동일하게 유지됩니다.
일반적인 .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
하여 환경에 대한 모든 변수를 가져올 수 있습니다.
받는 사람 또한 nconf 모듈 에서 언급 이 답변 하고, 노드 설정 에서 언급 이 답변 도있다 노드 iniparser 및 IniReader 간단 .INI 구성 파일 파서 것으로 보인다.
최근에 모든 유형의 구성 파일을로드 할 수있는 작은 모듈을 출시했습니다. 매우 간단합니다. https://github.com/flesler/config-node 에서 확인할 수 있습니다.
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
}
이 오래된 스레드를 방문하는 사람들을 위해 여기에 좋은 패키지가 있습니다.
https://www.npmjs.org/package/config
여기에서 몇 가지 제안 된 솔루션을 시도했지만 만족스럽지 않아 자체 모듈을 만들었습니다. 호출 mikro-config
되고 주요 차이점은 구성에 대한 규칙을 준수하므로 모듈을 요구하고 사용을 시작할 수 있다는 것입니다.
구성을 일반 js 또는 /config
폴더의 json 파일에 저장합니다. 먼저 default.js
파일을 /config
로드 한 다음 디렉토리 에서 다른 모든 파일을 로드 한 다음 $NODE_ENV
변수를 기반으로 환경 별 구성을로드합니다 .
또한 로컬 개발을 위해 local.js
또는 특정 환경에 대해이 구성을 재정의 할 수 있습니다 /config/env/$NODE_ENV.local.js
.
여기에서 볼 수 있습니다.
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
오랫동안 여기 솔루션에 언급 된 접근 방식을 사용했습니다. 그러나 일반 텍스트의 비밀 보안에 대한 우려가 있습니다. config
보안 비트가 처리되도록 다른 패키지를 사용할 수 있습니다 .
이것을 확인하십시오 : https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
'Program Tip' 카테고리의 다른 글
SpringData JPA에서 CrudRepository와 JpaRepository 인터페이스의 차이점은 무엇입니까? (0) | 2020.10.03 |
---|---|
C #을 사용하여 .NET에서 현재 사용자 이름을 얻으려면 어떻게해야합니까? (0) | 2020.10.03 |
MySQL 데이터베이스 / 테이블 / 열이 어떤 문자 집합인지 어떻게 알 수 있습니까? (0) | 2020.10.02 |
이론적으로 사이클 당 최대 4 개의 FLOP을 달성하려면 어떻게해야합니까? (0) | 2020.10.02 |
부트 스트래핑이란 무엇입니까? (0) | 2020.10.02 |