开发和生产环境中使用不同变量的最佳实践

3

我正在开发一个基于node、hapijs、nodemon等构建的小型服务器。
这是一个基本的RESTful API,它将随着开发而不断增长。

我需要为开发和生产使用不同的变量。目前我只有一个.env文件。但据我所知,不推荐使用两个单独的文件来处理这个问题。

我应该如何修改我的app.js以满足以下两种情况:

  1. 在本地开发环境中,通过运行nodemon来使用本地变量
  2. 当部署到heroku时,使用生产变量

非常感谢您提前的帮助。

4个回答

6

像你可能已经做的那样,编写你的代码使用环境变量。(无论你是在本地运行还是在生产环境下运行,都是同一份代码。)

const ACCESS_KEY = process.env.ACCESS_KEY;

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

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

  • 如果你使用 Azure,则应该放在Azure Key Vault
  • 如果你使用 AWS,则应该放在AWS Parameter Store
  • 如果你使用Heroku,则应该在 Heroku 的设置中进行配置。

Heroku 设置

你可以从 Heroku 应用仪表板的"设置"选项卡中进行此操作。有一个名为 "Config vars" 的部分。

setup

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

CLI

仪表板使得获取概览和管理密钥变得十分容易。更方便的是,你也可以通过 Heroku 的命令行工具 cli直接从命令行进行此操作。

要获取当前环境变量列表,请运行:

heroku config

从CLI添加新密钥。

heroku config:set ACCESS_KEY=adfsqfddqsdf

这一切也在Heroku的官方文档中有详细描述。


1
一般情况下,您会在构建时生成环境文件。例如,使用AWS SSM或某种安全的Vault,您可以存储诸如数据库密码之类的机密信息。环境文件是一个模板,它会与目标部署所需的正确环境变量一起编译。
此外,您可以在环境模板中添加虚拟变量,并将其提交到git。然后,在.env文件上添加.gitignore文件条目,以确保不会将任何机密信息提交到环境文件。然后,在本地环境中编译您的文件,用于本地开发,在staging构建期间用于staging,在prod构建期间用于prod等。
随着应用程序的扩大,这允许您为每个人/每个环境提供凭证。您可以向Vault添加相关机密信息/权限。允许人员/环境访问这些秘密,然后您可以以相当细粒度的方式控制访问。

1
我建议使用一个npm包来处理不同的环境变量和密钥。(或自己实现)
除了.env文件之外
1- 使用.env文件存储凭据和秘密 2- 通过提供每个环境的单独文件的不同软件包引用这些.env变量
建议的软件包: https://www.npmjs.com/package/config 在我的一个项目中,我使用了这种方法,使我的生活更轻松。

1
一个被广泛采用的最佳实践是在运行时注入应用程序设置(秘密和环境配置)。
这样做更安全(秘密不会存储在源代码、捆绑包或软件包/镜像中),并且更便携(随着您部署到更多环境,您只需要定义适当的值-无需进行代码更改、重新编译或重新打包)。
单个.env文件
定义一个单独的.env文件:您的应用程序需要在任何地方具有相同的属性(显然是不同的值)。
在您的本地开发环境中为开发配置.env文件:您不提交也不打包此文件。
生产部署
定义运行时配置:在Heroku上使用Config Vars为.env文件中定义的每个属性创建一个环境变量,例如。
   # .env 
   API_TOKEN = dev1

创建一个名为API_TOKEN的配置变量,并将其设置为生产值:这将在应用程序启动时注入,永不存储/暴露。
这种方法与语言无关(在Java中,您可能有一个.properties文件,但原则是相同的),并且适用于不同的托管提供商:您可以部署相同的应用程序/包,同时相应地配置环境设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接