< >
Home » Farmbot开发入门教程 » farmbot开发入门教程-环境变量和全局配置

farmbot开发入门教程-环境变量和全局配置

说明:

  • FarmBot 是一个开源项目,允许第三方开发人员自行托管自己的 Web 应用实例。FarmBot Inc 为公共用途配置服务器的方式可能无法满足自托管用户的需求。此外,开源项目中的配置管理存在安全隐患;例如,我们不想将数据库密码泄露给源代码控制。

  • FarmBot 尝试尽可能地将配置与代码分离,以符合12 因素方法论:

  • 十二要素应用程序将配置存储在环境变量中(通常缩写为 env vars 或 env)。环境变量在部署之间很容易更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码存储库的可能性很小;与自定义配置文件或其他配置机制(如 Java 系统属性)不同,它们是与语言和操作系统无关的标准。

  • 通过使用ENV 变量作为服务器配置的首选,我们可以:

    • 允许服务器定制。
    • 安全地与公众共享应用程序源代码。
    • 获得其他12 因素方法论的所有其他好处。

加载环境变量

  • 对于应用程序的大部分来说,环境变量都被加载到.env文件中

  • 有关文件格式的信息.env可以在这里找到。

  • 有关法律价值的文献可在此处找到。

  • 该应用程序还公开了一个名为的辅助配置系统GlobalConfig。此辅助系统解决了 ENV 变量不适用的用例。本文档后面将讨论该系统。

例子

  • FarmBot Inc 需要验证用户的电子邮件地址。然而,大多数自托管用户并不希望出现这种行为。为了让服务器管理员选择是否验证电子邮件,该应用程序公开了一个ENV["NO_EMAILS"]变量。当存在时,此 ENV 变量将禁用电子邮件验证。

  • 另一个示例是EXTRA_DOMAINS变量。它可以设置为服务器可能控制的备选域名的逗号分隔列表。这允许同一服务器托管在多个域名上(my.farm.bot、my.farmbot.io等)。

  • 这些示例仅用于说明目的。完整的变量列表可在此处查看

注意事项

  • ENV 变量适用于大多数配置用例,但也有一些注意事项:

    • 更改 ENV 变量需要重启服务器。在许多情况下,这会导致不可接受的停机时间,特别是对于正常运行时间要求较高的服务器。
    • 环境变量是服务器端的问题。当客户端在浏览器中加载 FarmBot Web App 时,无法看到服务器的 ENV 变量。如果不是这种情况,用户就有可能很容易地窃取数据库凭据。
    • 并非所有定制都发生在服务器端;有许多用例需要将 ENV 信息从服务器传递到客户端。

运行时重新加载环境变量

  • 对于必须更改而不需要重新启动服务器的值,FarmBot Web App 使用GlobalConfig模型(数据库表)。源代码可在此处GlobalConfig找到。

  • 如果在表中找不到任何值,则使用 E​​NV 变量来引导某些GlobalConfig值(例如) 。"TOS_URL"global_configs

  • 可以在运行时从Rails 控制台GlobalConfig更改 s值:

GlobalConfig.create!(key: "FAVORITE_VEGGIE", value: "Carrots")
  • 与传统的 ENV 变量不同,GlobalConfig值不会对公众隐藏。请勿将敏感数据存储在其中GlobalConfig!

与客户共享环境变量

  • 如上所述,将所有ENV 变量暴露给浏览器会带来极大的安全风险。我们希望向客户端暴露部分ENV 变量,但不是全部

  • 为了解决这个问题,Web 应用程序的 UI 向浏览器公开了一个全局变量:window.globalConfig。此变量包含所有GlobalConfig项目,但不一定包含所有 ENV 变量。因此,不要将敏感数据存储在 GlobalConfig 表中,这一点很重要

  • globalConfig我们可以在浏览器中检查的值:

console.log(window.globalConfig);
  • 在生产时,globalConfig包含以下值:
{
  // Current application environment:
  "NODE_ENV":"production",

  // Terms of Service URL:
  "TOS_URL":"https://farm.bot/tos/",

  // Privacy Policy URL:
  "PRIV_URL":"https://farm.bot/privacy/",

  // Lowest FarmBot OS versions the server supports:
  "MINIMUM_FBOS_VERSION":"7.0.0",
  "FBOS_END_OF_LIFE_VERSION":"7.0.1",

  // Web App version the server runs:
  "LONG_REVISION":"191b0ead3dfe1cc43ee416a5ff27a064af556192",
  "SHORT_REVISION":"191b0ead"
}
  • 如上所述,服务器的环境变量不会向公众公开。我们还提到,我们有一个补充传统服务器环境变量的第二个配置系统 -GlobalConfig数据库表。

  • GlobalConfig使用服务器端模板将值从服务器传输到客户端。

  • 当 Web 应用程序加载需要 ENV 变量的网页时,它会注入一个声明