0

我正在重新审视一个有一段时间没有更新的项目。

production/online环境中,它使用定义在以下位置的环境变量:

openshift online console> applications> deployments> my node app>environment

development/offline环境中,它使用定义在以下位置的环境变量:

./src/js/my_modules/local_settings(此文件被 忽略.gitignore

代码看起来像:

// check which environment we are in 
if (process.env.MONGODB_USER) {
    var online_status = "online";
}
else {
    var online_status = "offline";
}

// if online, use environment variables defined in red hat openshift  
if (online_status === 'online') {
    var site_title = process.env.SITE_TITLE;
    var site_description = process.env.SITE_DESCRIPTION;
    //etc 
}  

// if offline, get settings from a local file
else if (online_status === 'offline') {
    var local_settings = require('./src/js/my_modules/local_settings');
    var site_title = local_settings.SITE_TITLE;
    var site_description = local_settings.SITE_DESCRIPTION;
    // etc
}  

我想通过以下方式在我的本地项目仓库中安装dotenv 包:

npm install dotenv  

这样我就可以:

  • 将我的本地设置放在.env项目根目录中的文件中(在 中忽略.gitignore
  • 能够使用process.env.SOME_VARIABLE而不是local_settings.SOME_VARIABLE
  • 摆脱一些if/else障碍,因为这两种情况都会指向process.env.SOME_VARIABLE

我对这将如何影响在线环境感到有些困惑。

看到production/onlinedevelopment/offline环境将使用:

var some_variable = process.env.SOME_VARIABLE_HERE  

应用程序是否会自动知道:

  • 开发时查看本地.env文件?
  • 在生产中查看 Red Hat 环境变量?

并将在文件开头添加所需的实例化server-side

require('dotenv').config()  

不知何故让 Red Hat OpenShift 吓坏了(因为它似乎已经有了自己的“东西”来解决对process.env.SOME_VARIABLE_HEREOpenShift 控制台中定义的相关值的引用)?

4

1 回答 1

0

将任何环境(.dev .staging .prod)的文件放入源代码存储库或手动在服务器中(那些在.gitignore中)工作了很长时间,但现在它与devops背道而驰。

干净的方法是使用环境变量,但远程管理并在应用程序启动时获取。

这个怎么运作?

基本上,您的应用程序不再读取或需要带有变量的文件(.env .properties 等)。它从远程 http 服务加载它们。

不打扰

在这种方法中,您不需要特定的语言变量(在您的情况下为 nodejs)。您只需要准备您的应用程序以使用环境变量。您的应用程序不关心变量来自哪里,只需要在操作系统级别可用。

为此,您只需使用简单的shell 代码或非常基本的算法(http 调用)以您喜欢的语言下载变量。

在那之后,在你的应用程序启动之后,变量就可以在最基本的层面上使用了。

var site_title = process.env.SITE_TITLE;

这种方法不是侵入性的,因为您的应用程序不需要某些编程语言中的库或算法等复杂的东西。只需要环境变量。

侵入式

与之前的替代方案相同,但要直接从环境系统读取变量,您应该使用或创建您的语言中的类/模块。这为您提供了所需的变量:

var site_title = VariablesManager.getProperty("SITE_TITLE");

启动时的VariablesManager必须使用来自远程服务 (http) 的变量并将它们存储以通过getProperty方法将它们提供给需要它的任何人。

此外,此变量管理器通常具有称为热重载的功能,它会定期更新使用远程变量管理器的变量。有了这个,如果您的应用程序在真实用户的生产环境中运行并且需要更新一些变量,您只需要在变量管理器中更改它。您的应用会自动加载新值,无需重新启动或触摸您的应用

这种方法是侵入性的,因为您需要以某种编程语言加载高级库或创建它。

开发运维

您的应用程序只需要一些与使用远程变量相关的属性或设置。例如:acme-web-staging 的变量:

remote_variables_manager = https://variables.com/api
application_id = acme-web-staging
secure_key = *****

您可以使用环境变量(在平台控制台中创建)隐藏安全密钥并参数化 application_id

remote_variables_manager = https://variables.com/api
application_id = ${application_id}
secure_key = ${remote_variables_manager_key}

或者,如果您希望每个环境都有一个变量管理器

分期

remote_variables_manager = https://variables-staging.com/api
application_id = acme-web
secure_key = *****

生产

remote_variables_manager = https://variables-staging.com/api
application_id = acme-web
secure_key = *****

变量管理器

这个概念是多年前提出的。我用的是java。它包含在具有以下功能的 Web 应用程序中:

  • 安全登录
  • 创建应用程序
  • 创建应用程序的变量
  • 加密敏感值
  • 发布 http 端点以按应用程序下载或查询变量

这里列出了一些现成的替代品:

在您的具体情况下

  • 不要使用 dot-env
  • 使用纯 process.env.foo
  • 在您的 openshift 基础设施中部署远程变量管理器
  • 在您的 openshift Web 控制台中只创建一个变量:APP_ENVIRONMENT
  • 在开始时的代码中,执行以下操作:
if (process.env.APP_ENVIRONMENT === "PROD")
  //get variables from remote service using 
  //some http client like axios, request, etc
  //then inject them to your process.env
  process.env.site_url = remoteVariables.site_url
else
  //we are in local developer workspace
  //so, nothing complex is required
  //developer should inject manually 
  //before the startup: npm run start or dev
  //export site_url = "acme.com" 

如果您可以在 openshift 应用程序启动之前配置 shell 脚本的执行,您可以在该阶段加载和公开变量,并且不需要前面的代码段,因为可以直接使用process.env检索变量在您的应用中

于 2021-11-25T05:57:05.730 回答