Pracowałem nad kilkoma aplikacjami Node i szukałem dobrego wzorca przechowywania ustawień związanych z wdrażaniem. W świecie Django (skąd pochodzę) powszechną praktyką byłoby posiadanie settings.py
pliku zawierającego ustawienia standardowe (strefa czasowa itp.), A następnie local_settings.py
ustawienia specyficzne dla wdrożenia, tj. z jaką bazą danych rozmawiać, z jakim gniazdem memcache, adresem e-mail dla administratorów i tak dalej.
Szukałem podobnych wzorów dla Węzła. Po prostu plik konfiguracyjny byłby fajny, więc nie trzeba go zacinać z całą resztą app.js
, ale uważam, że ważne jest, aby mieć sposób na konfigurację specyficzną dla serwera w pliku, który nie jest pod kontrolą źródła. Ta sama aplikacja mogłaby zostać wdrożona na różnych serwerach przy bardzo różnych ustawieniach i konieczności radzenia sobie z konfliktami scalania i wszystkim, co nie jest moim pomysłem na zabawę.
Czy jest w tym jakiś jakiś szkielet / narzędzie, czy może wszyscy sami coś razem zhakują?
Odpowiedzi:
Używam a
package.json
dla moich pakietów iconfig.js
dla mojej konfiguracji, która wygląda następująco:Ładuję konfigurację z mojego projektu:
i wtedy mogę uzyskać dostęp do moich rzeczy z
config.db_host
,config.db_port
itd ... To pozwala mi użyć sztywno parametry lub parametrów zapisanych w zmiennych środowiskowych, jeśli nie chcesz zapisywać hasła w kontroli źródła.Generuję również
package.json
i wstawiam sekcję zależności:Kiedy klonuję projekt na moją maszynę lokalną, biegam,
npm install
aby zainstalować pakiety. Więcej informacji na ten temat tutaj .Projekt jest przechowywany w GitHub, z pilotami dodanymi do mojego serwera produkcyjnego.
źródło
Możesz wymagać plików JSON od Node v0.5.x ( odwołując się do tej odpowiedzi )
config.json:
app.js:
źródło
Znacznie później znalazłem całkiem niezły moduł Node.js do zarządzania konfiguracją: nconf .
Prosty przykład:
Obsługuje również przechowywanie ustawień w Redis , pisanie plików konfiguracyjnych i ma dość solidny interfejs API, a także jest wspierany przez jeden z bardziej szanowanych sklepów Node.js, Nodejitsu , w ramach inicjatywy frameworku Flatiron , więc powinno być dość przyszłościowe.
Sprawdź nconf na Github .
źródło
Moje rozwiązanie jest dość proste:
Załaduj konfigurację środowiska do ./config/index.js
Zdefiniuj niektóre wartości domyślne w ./config/config.global.js
Zastąp wartości domyślne w ./config/config.test.js
Używając go w ./models/user.js:
Uruchamianie aplikacji w środowisku testowym:
źródło
NODE_ENV
domyślnie jest to „programowanie”. Zamiast tego powinieneś sprawdzić „produkcję”.Możesz także spojrzeć na dotenv, który jest zgodny z założeniami aplikacji dwunastoczynnikowej .
Kiedyś korzystałem z node-config, ale z tego powodu stworzyłem dotenv. Został całkowicie zainspirowany biblioteką dotenv Ruby.
Użycie jest dość łatwe:
Następnie wystarczy utworzyć plik .env i umieścić tam swoje ustawienia w następujący sposób:
To jest dotenv dla nodejs.
źródło
foreman run node xx.js
tego automatycznie odczyta również w pliku .env..env
pliku do procesu kontroli wersji lub procesu wdrażania.Czy używacie npm do uruchamiania skryptów (env itp.)?
Jeśli używasz
.env
plików, możesz dołączyć je do swojegopackage.json
i użyć npm do ich źródła / uruchomienia.Przykład:
następnie uruchom skrypty npm:
Jest to opisane tutaj https://gist.github.com/ericelliott/4152984 Wszystkie podziękowania dla Erica Elliota
źródło
source : not found
source
(lub po prostu.
) to wbudowane polecenie w powłokach uniksowych (Bash itp.) Do odczytu i wykonywania poleceń z podanego pliku w bieżącej powłoce . Oznacza to, że polecenia nie są wykonywane w podpowłoce. Efektem tego w tym przykładzie jest to, że zmienne środowiskowe zdefiniowane wprod.env
są dodawane do bieżącej powłoki, a zatem przekazywane do dowolnego procesu potomnego odradzanego przez tę powłokę. Wygląda na to, że używasz Windows CMD. Zobacz to pytanie, aby uzyskać więcej informacji.dev.env
iprod.env
posiadanie jednego.env
pliku na wdrożenie.Możesz także zajrzeć do config-node, który ładuje plik konfiguracyjny w zależności od $ HOST i zmiennej $ NODE_ENV (trochę jak RoR): dokumentacja .
To może być bardzo przydatne dla różnych ustawień programowych (
development
,test
lubproduction
).źródło
Po prostu zrób proste
settings.js
zexports
:Następnie w skrypcie wykonaj
require
:Wszystkie twoje ustawienia będą teraz dostępne poprzez
settings
zmienną:źródło
Mam zamiar rzucić tu kapelusz na ring, ponieważ żadna z tych odpowiedzi nie dotyczy wszystkich krytycznych komponentów, których właściwie potrzebuje każdy system. Uwagi:
Oto jak wykonuję moją konfigurację:
config.default.private.js
- W kontroli wersji są to domyślne opcje konfiguracji, które mogą być widoczne tylko przez backend.config.default.public.js
- W kontroli wersji są to domyślne opcje konfiguracji, które mogą być widoczne przez backend i frontendconfig.dev.private.js
- Jeśli potrzebujesz różnych ustawień domyślnych dla dev.config.dev.public.js
- Jeśli potrzebujesz różnych publicznych ustawień domyślnych dla programisty.config.private.js
- Brak kontroli wersji, są to opcje specyficzne dla środowiska, które zastępująconfig.default.private.js
config.public.js
- Brak kontroli wersji, są to opcje specyficzne dla środowiska, które zastępująconfig.default.public.js
keys/
- Folder, w którym każdy plik przechowuje inny sekret. To również nie jest pod kontrolą wersji (klucze nigdy nie powinny być pod kontrolą wersji).Używam zwykłych plików javascript do konfiguracji, więc mam pełną moc językowego języka javascript (w tym komentarze i możliwość robienia rzeczy takich jak ładowanie domyślnego pliku konfiguracyjnego do pliku specyficznego dla środowiska, aby można je było następnie zastąpić). Jeśli chcesz użyć zmiennych środowiskowych, możesz załadować je do tych plików konfiguracyjnych (odradzam używanie env vars z tego samego powodu, dla którego nie polecam używania plików json - nie masz mocy języka programowania do zbudowania Twoja konfiguracja).
Powodem, dla którego każdy klucz znajduje się w osobnym pliku, jest użycie przez instalatora. To pozwala mieć instalatora, który tworzy klucze na komputerze i przechowuje je w folderze kluczy. Bez tego instalator może się nie powieść po załadowaniu pliku konfiguracyjnego, który nie może uzyskać dostępu do kluczy. W ten sposób możesz przeglądać katalog i ładować dowolne pliki kluczy znajdujące się w tym folderze bez martwienia się o to, co istnieje, a czego nie ma w żadnej wersji kodu.
Ponieważ prawdopodobnie masz klucze załadowane w konfiguracji prywatnej, zdecydowanie nie chcesz ładować konfiguracji prywatnej w żadnym kodzie interfejsu użytkownika. Chociaż prawdopodobnie jest to bardziej idealne rozwiązanie, aby całkowicie oddzielić bazę kodu frontendu od backendu, wiele razy PITA jest wystarczająco dużą barierą, aby uniemożliwić ludziom to zrobić, a więc konfigurację prywatną lub publiczną. Ale robię dwie rzeczy, aby zapobiec ładowaniu prywatnej konfiguracji w interfejsie:
I ostatnia rzecz: twoja konfiguracja powinna zostać załadowana do przeglądarki za pomocą zupełnie osobnego pliku niż jakikolwiek inny kod frontendowy. Jeśli dołączysz kod frontendu, konfiguracja publiczna powinna zostać zbudowana jako całkowicie oddzielny pakiet. W przeciwnym razie twoja konfiguracja nie jest już tak naprawdę konfiguracją - to tylko część kodu. Konfiguracja musi być inna na różnych komputerach.
źródło
Skazanie to kolejna opcja, która dodaje schemat sprawdzania poprawności. Podobnie jak nconf, obsługuje ładowanie ustawień z dowolnej kombinacji zmiennych środowiskowych, argumentów, plików i obiektów json.
Przykład z pliku README:
Artykuł wprowadzający: Oswajanie konfiguracji za pomocą węzła skazującego
źródło
Możesz użyć Konfig do plików konfiguracyjnych specyficznych dla środowiska. Ładuje automatycznie pliki konfiguracyjne json lub yaml, ma wartość domyślną i funkcje konfiguracji dynamicznej.
Przykład z repozytorium Konfig:
W fazie rozwoju:
Załóżmy, że w produkcji zaczynamy od aplikacji
$ NODE_ENV=production PORT=4567 node app.js
Więcej informacji: https://github.com/vngrs/konfig
źródło
Utworzę folder jako nazwę pliku konfiguracji,
config.js
a później będę go używać wszędzie tam, gdzie jest to wymagane, jak poniżejPrzykład config.js
Więc jeśli chcę gdzieś użyć tego pliku konfiguracyjnego
Najpierw zaimportuję jak poniżej
var config = require('./config');
i mogę uzyskać dostęp do wartości jak poniżej
źródło
Wystarczy użyć
npm
modułuconfig
(ponad 300 000 pobrań)https://www.npmjs.com/package/config
Node-config organizuje hierarchiczne konfiguracje dla wdrożeń aplikacji.
Pozwala zdefiniować zestaw parametrów domyślnych i rozszerzyć je dla różnych środowisk wdrażania (programowanie, qa, przemieszczanie, produkcja itp.).
źródło
Lepiej oddzielić konfiguracje „programistyczne” i „produkcyjne” .
Używam następującego sposobu: Oto mój plik config / index.js :
Aby wymagać konfiguracji użyj:
Następnie możesz użyć obiektu konfiguracji:
źródło
module.exports = config;
na końcuconfig/index.js
plikuJestem trochę spóźniony w grze, ale nie mogłem znaleźć tego, czego potrzebowałem tutaj - ani nigdzie indziej - więc sam coś napisałem.
Moje wymagania dotyczące mechanizmu konfiguracji są następujące:
settings-overrides.js
- która wygląda tak samo, ale umożliwia zastąpienie konfiguracji wsettings.js
. Chodzi tutaj o łatwą modyfikację konfiguracji bez zmiany kodu. Uważam, że jest to przydatne do saas.Mimo że mniej zależy mi na wspieraniu środowisk - wyjaśnię, jak łatwo to dodać do mojego rozwiązania
Wyjaśnienie
undefined
oznacza, że ta właściwość jest wymagananull
oznacza, że jest opcjonalnymeConf
- obecnie kod jest kierowany do pliku poniżejapp
.meConf
jest nadpisuje pliki, do których jest skierowaneconf/dev
- co jest ignorowane przez moje vcs.publicConfiguration
- będą widoczne z przodu i tyłu.privateConfiguration
- będzie widoczny tylko z zaplecza.sendPublicConfiguration
- trasa, która ujawni konfigurację publiczną i przypisze ją do zmiennej globalnej. Na przykład poniższy kod ujawni konfigurację publiczną jako zmienną globalną myConf w interfejsie. Domyślnie użyje globalnej nazwy zmiennejconf
.app.get („/ backend / conf”, wymagają („conf”). sendPublicConfiguration);
Logika przesłonięć
Dodanie obsługi środowiska
Chociaż nie uważam, że „wsparcie środowiska” jest przydatne, może ktoś to zrobi.
Aby dodać obsługę środowiska, musisz zmienić instrukcję meConf na coś takiego (pseudokod)
if (środowisko == „produkcja”) {meConf = wymagają („../ conf / dev / meConf”). produkcja; }
if (środowisko == „rozwój”) {meConf = wymagany („../ conf / dev / meConf”). development; }
Podobnie możesz mieć plik na środowisko
i zaimportuj właściwy. Reszta logiki pozostaje taka sama.
źródło
undefined
tak naprawdę oznacza „wymagane” inull
„opcjonalne”. więc żółty pojemnik jest na plastik, a niebieski na złom? dobrze, ale musiałem przeczytać instrukcję przed podrzuceniem tego miotu.alternatywny przykład, którego właśnie użyłem, ponieważ chciałem większej elastyczności niż typowy plik .json, ale nie chciałem abstrakcji go do biblioteki wymagającej zależności, jest coś takiego. Zasadniczo eksport funkcji wywoływanej natychmiast, która zwróciła obiekt o wartościach, które chciałem ustawić. Daje dużą elastyczność.
Istnieje o wiele lepsze wytłumaczenie z pełnym przykładem tutaj. Używanie plików konfiguracji w Node.js
źródło
Wiem, że to naprawdę stary post. Ale chcę udostępnić mój moduł do konfigurowania zmiennych środowiskowych, myślę, że jest to bardzo elastyczne rozwiązanie. Oto moduł json-konfigurator
Następnie możesz użyć,
process.env.NODE_ENV
aby uzyskać wszystkie zmienne dla swojego środowiska.źródło
Oprócz modułu nconf wspomnianego w tej odpowiedzi i węzła config wspomnianego w tej odpowiedzi , istnieją również węzły iniparser i IniReader , które wydają się być prostszymi parserami plików konfiguracyjnych .ini.
źródło
iniparser
dumą podkreśla fakt, że wiedzą, jak parsować sekcje w konfiguracji ... w 2013 ... jeśli potrzebujesz głębszego zagnieżdżenia, prawda[foo/bar]
?[foo\bar]
?bar.baz=42
?bar/baz=42
?bar\baz=42
?bar:baz=42
? skąd wiesz, że42
jest liczbą? może to być tekst składający się z samych cyfr! - podrzuć XML, podrzuć YAML, podrzuć WIN.INI, obejrzyj JSON, zmartwienia zniknęły.Niedawno wydałem mały moduł do ładowania dowolnego rodzaju plików konfiguracyjnych. Jest to dość proste, możesz to sprawdzić na https://github.com/flesler/config-node
źródło
Możesz użyć pconf: https://www.npmjs.com/package/pconf
Przykład:
źródło
Oto schludne podejście inspirowane tym artykułem . Nie wymaga żadnych dodatkowych pakietów oprócz wszechobecnego pakietu Lodash . Ponadto pozwala zarządzać zagnieżdżonymi ustawieniami domyślnymi za pomocą nadpisywania specyficznego dla środowiska.
Najpierw utwórz folder konfiguracji w ścieżce katalogu głównego pakietu, który wygląda następująco
tutaj jest plik index.js
Załóżmy teraz, że mamy plik defaults.json
i development.json tak
jeśli to zrobisz
config = require('./config')
, otrzymaszZauważ, że otrzymujesz wszystkie wartości domyślne oprócz tych zdefiniowanych w plikach specyficznych dla środowiska. Możesz więc zarządzać hierarchią konfiguracji. Używanie
defaultsDeep
zapewnia, że możesz mieć zagnieżdżone wartości domyślne.źródło
Dla tych, którzy odwiedzają ten stary wątek, tutaj jest pakiet, który uważam za dobry.
https://www.npmjs.org/package/config
źródło
Wypróbowałem tutaj niektóre z proponowanych rozwiązań, ale nie byłem z nich zadowolony, więc stworzyłem własny moduł. Nazywa się,
mikro-config
a główna różnica polega na tym, że honoruje konwencję nad konfiguracją, więc możesz po prostu wymagać modułu i zacząć z niego korzystać.Przechowujesz swoją konfigurację w zwykłych plikach js lub json z
/config
folderu. Najpierw ładujedefault.js
plik, następnie wszystkie inne pliki z/config
katalogu, a następnie ładuje konfigurację specyficzną dla środowiska na podstawie$NODE_ENV
zmiennej.Pozwala również zastąpić tę konfigurację dla rozwoju lokalnego
local.js
lub specyficznego dla środowiska/config/env/$NODE_ENV.local.js
.Możesz na to spojrzeć tutaj:
https://www.npmjs.com/package/mikro-config
https://github.com/B4nan/mikro-config
źródło
Przez długi czas korzystałem z podejścia wymienionego w rozwiązaniu tutaj. Istnieją jednak obawy dotyczące bezpieczeństwa tajemnic w postaci czystego tekstu. Możesz użyć innego pakietu na wierzchu,
config
aby zająć się bitami bezpieczeństwa.Sprawdź to: https://www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/
źródło