farmbot开发入门教程-环境变量和全局配置
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
说明:
-
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找到。
-
如果在表中找不到任何值,则使用 ENV 变量来引导某些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 变量的网页时,它会注入一个声明<script>该变量的标签globalConfig。
app/views/dashboard/_common_assets.html.erb:
<script>
// THIS IS WHERE ENV VARIABLES CROSS OVER
// From the server to the client:
window.globalConfig = <%= raw(@global_config) %>
// The @global_config contains all database entries
// for the GlobalConfig table (but not all ENV
// vars).
</script>
-
这<%= %>是Ruby ERB 语法。
-
的值@global_config设置在app/controllers/dashboard_controller.rb:
class DashboardController < ApplicationController
before_action :set_global_config
layout "dashboard"
# --- SNIP! ---
private
def set_global_config
# THIS IS WHERE @global_config is created:
@global_config = GlobalConfig.dump.to_json
end
end
- 有了这些系统,我们现在可以从 Rails 控制台添加和删除 ENV 变量:
GlobalConfig.create!(key: "FAVORITE_PLANT", value: "cabbage")
=> #<GlobalConfig:0x0000 key: "FAVORITE_PLANT", value: "cabbage">
- 要从浏览器查看变量,我们只需输入:
globalConfig.FAVORITE_PLANT;
// => "cabbage"
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号


















