为开发和生产设置不同变量的最佳实践

Best practices to have different variables for development and production

我正在开发一个用 node、hapijs、nodemon 等制作的小型服务器
这是一个基本的 api 休息,它将随着持续的开发而增长。

我需要为 dev 使用不同的变量。和生产。我实际上只有一个 .env 文件。我读过不建议为此使用 2 个单独的文件。

我应该如何修改我的 app.js 有两种情况?

  1. 运行 nodemon 在我的电脑本地,而在 dev 和局部变量中
  2. 部署到 heroku 时,使用生产变量

非常感谢,

通常,您会在构建时生成 env 文件。例如,使用 AWS SSM / 或某种安全的保险库,您可以存储您的秘密,例如数据库密码。 env 文件是一个模板,它使用正确的环境变量为目标部署编译。

此外,您可以在提交给 git 的环境模板中包含虚拟变量。然后添加一个带有条目的 .gitignore 文件到您的 env 模板,以确保您不会向 env 文件提交任何秘密。然后在本地为本地编译文件,在临时构建期间为临时构建,在为 prod 的 prod 构建期间等。

随着应用变大,这允许您为每个人/每个环境配置凭据。您将关联的秘密/权限添加到保险库。允许 people/environments 访问这些机密,然后您可以以非常细粒度的方式控制访问。

我建议使用 npm 包来处理不同的环境变量和密钥。 (或者自己实现)

与 .env 文件一起

1- 使用 .env 文件存储凭据和机密 2- 通过为每个环境提供单独文件的不同包引用这些 .env 变量

建议的套餐:https://www.npmjs.com/package/config

我在我的一个项目中使用了这种方法,让我的生活更轻松。

广泛采用的最佳做法是在运行时注入应用程序设置(机密和环境配置)。

更安全(秘密未存储在源代码、捆绑包或packages/images中)并且便携(如你部署到更多的环境你只需要定义合适的值 - 没有代码更改,重新编译或重新打包)。

单个 .env 文件

定义单个 .env 文件:您的应用程序在任何地方都需要相同的属性(显然具有不同的值)。

在您的本地开发环境中配置用于开发的 .env 文件:您不提交打包此文件。

生产部署

定义运行时配置:在 Heroku 上使用 Config Vars.env 文件中定义的每个 属性 创建一个环境变量,例如

   # .env 
   API_TOKEN = dev1

使用生产值创建一个 Config Var API_TOKEN:这是在应用程序启动时注入的,从不 stored/exposed。

这种方法与语言无关(在 Java 中你可能有 .properties 而不是,但原理是相同的)并且适用于不同的托管服务提供商:你将部署相同的 app/package 同时相应地配置环境设置。

您可能已经做过了。编写代码以使用环境变量。 (无论您 运行 在本地还是在生产环境中,都是相同的代码。)。

const ACCESS_KEY = process.env.ACCESS_KEY;

您的 .env 文件仅包含您的本地设置,用于在本地计算机上进行调试。您可以在 .gitignore 文件中添加 .env 以确保它不会被推送到您的 git 存储库。

相比之下,生产设置根本不应该在任何文件中。它们应该只在您的云提供商的设置中直接配置。

  • 如果您使用的是 Azure,它们应该在 Azure Key Vault
  • 如果您使用的是 AWS,它们应该在 KMS
  • 如果您使用的是 Heroku,则应在 Heroku 的设置中配置它们。

Heroku 设置

可以从您的 heroku 应用仪表板中的“设置”选项卡执行此操作。有一个“配置变量”部分。

当 heroku 启动您的应用程序时,它会将配置的配置变量定义为环境变量。您将能够使用 process.env 访问它们,就像您在开发期间使用 .env 文件中定义的环境变量一样。

CLI

仪表板可让您轻松了解概览和管理密钥。也许更方便的是,您还可以直接从命令行使用 heroku cli 工具 执行此操作。

要获取当前环境变量的列表,运行。

heroku config

从 CLI 添加新密钥。

heroku config:set ACCESS_KEY=adfsqfddqsdf

所有这些在 Heroku 的 official documentation 中也有描述。