Ruby on rails Rails部署,每个客户机一个环境,这样对吗?
我们的应用程序是用于医院的Saas,部署在一台生产服务器上(与linux+nginx+puma的代码相同),用于所有客户机。 默认情况下,它们有三个:测试、开发和生产。但在我们的例子中,有10个环境配置文件指向文件夹“config/environments/”中的10个客户端配置文件。我们为环境文件命名医院,例如Ruby on rails Rails部署,每个客户机一个环境,这样对吗?,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我们的应用程序是用于医院的Saas,部署在一台生产服务器上(与linux+nginx+puma的代码相同),用于所有客户机。 默认情况下,它们有三个:测试、开发和生产。但在我们的例子中,有10个环境配置文件指向文件夹“config/environments/”中的10个客户端配置文件。我们为环境文件命名医院,例如 config/environments/hospital1.rb config/environments/hospital2.rb config/environments/hospit
config/environments/hospital1.rb
config/environments/hospital2.rb
config/environments/hospital3.rb
...
有几个功能是通过引擎
开发的
现在想象一下,hospital1为功能付费。如何仅为医院1提供活动功能1?
我目前正在Gemfile中执行此操作
group :hospital1 do
gem 'feature1', path to ....
end
问题:
这是将生产环境替换为特定于客户机的环境并能够在GEMFILE中启用/禁用gem的好方法吗
欢迎任何建议 就我个人而言,我更喜欢将环境视为技术层面的东西,而不是应用程序逻辑的东西。因此,我会尽量少使用环境。如果您想在
Gemfile
中使用条件语句,那么最好使用环境变量?差不多
if ENV['FEATURE_1_ENABLED']
gem 'feature1', path to ....
end
您甚至可以通过为每家医院创建一个
.env
文件并使用Dotenv.load
加载一个适当的文件来自动管理这些变量 这听起来是个坏主意
你在这里“混合橘子和沙发”。环境和客户端具有不同的语义
您拥有的是部署在不同服务器上的同一应用程序的不同实例(然后特定于客户端的内容应该来自环境变量),或者如果是单个部署(看起来像是您的情况),则特定于客户端的设置应该存储在数据库中
至于限制对付费功能的访问,你们应该考虑这样做的解决方案
Gemfile
绝对不是适合您的业务逻辑的地方 这真是个糟糕的方法
基本上,你是在试图做多任务,但在非常奇怪和失控的方式
这是一个体系结构的决定,它不能符合StackOverflow的答案,许多人需要一整本书来解释它
看一看,获得一些观点
基本上,功能启用/禁用应该基于规则进行,这些规则至少应该可以通过一些管理面板轻松管理。针对每个客户的环境的方法不能很好地扩展
Gemfile
绝对不是保存客户端设置的地方。而且它更难测试
如果您需要强大的分离(分离数据库、工人等)-我仍然会选择一个生产环境:
有一个配置文件,其中包含所有客户端的设置(已启用的功能等):
医院1:
名称:想象医疗中心
地址:无处街0号
特征:
cool_通知:true
特征2:错误
医院2:
名称:模糊视野通勤医院
特征:
特征1:错误
稍后,这可以演变为一个管理数据库
而不是环境传递一个租户id为的ENV变量(比如HOSPITAL\u NAME=hospital1 rails server-e production
),并创建一个单例对象,在调用时加载该配置
所有引擎都可以在gemfile中,但是如果启用了相应的功能,则使用require:false
,并且您只能将它们加载到application.rb(就在Bundler.require
之后)
如果您可以允许一些资源共享(如web workers),也可以查看一下。您必须向应用程序和功能切换中添加多域支持,但处理不断增长的客户端数量(并节省服务器资源,最有可能的是,您的客户端都不会产生高持续负载)会更加容易。谢谢您的时间。至于插件管理,有什么好的开源项目值得推荐吗?每个客户端都有自己独立的数据库。没有超级管理面板来控制所有客户端的权限。所以权威人士帮不上忙。谢谢你抽出时间