为开发和生产设置不同变量的最佳实践
Best practices to have different variables for development and production
我正在开发一个用 node、hapijs、nodemon 等制作的小型服务器
这是一个基本的 api 休息,它将随着持续的开发而增长。
我需要为 dev 使用不同的变量。和生产。我实际上只有一个 .env 文件。我读过不建议为此使用 2 个单独的文件。
我应该如何修改我的 app.js 有两种情况?
- 运行 nodemon 在我的电脑本地,而在 dev 和局部变量中
- 部署到 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 中也有描述。
我正在开发一个用 node、hapijs、nodemon 等制作的小型服务器
这是一个基本的 api 休息,它将随着持续的开发而增长。
我需要为 dev 使用不同的变量。和生产。我实际上只有一个 .env 文件。我读过不建议为此使用 2 个单独的文件。
我应该如何修改我的 app.js 有两种情况?
- 运行 nodemon 在我的电脑本地,而在 dev 和局部变量中
- 部署到 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 中也有描述。