如何在不更改代码的情况下将单站点应用程序转换为可持续发展的多站点应用程序?

时间:2009-11-16 12:14:16

标签: ruby-on-rails ruby database-design web-applications

这是我们在办公室内部使用的应用程序,我希望将其作为托管服务提供给任何人。

如果不进行重大代码更改,我该怎么做?

我遇到的第一件事就是让应用程序根据域选择要连接的数据库。

因此,应用程序的每个实例都有自己的数据库,但所有实例都将共享相同的代码。

代码所需的唯一更改是数据库选择。

这种方法是否可维护?我听说wordpress.com这样做,它提供了一些优势。我主要是希望这样做,以避免将我的整个数据库查询范围扩展到同一数据库中的某个站点。

谢谢!

3 个答案:

答案 0 :(得分:2)

最简单的方法是克隆应用程序,并创建另一个服务器实例来处理它。这实际上就是我在服务器上处理多个wordpress博客的方式

亲:

  • 此流程可以简化为实用程序脚本。
  • 如果符号链接用于公共代码,则可以轻松维护。 IE:除了品牌和配置目录中的一些东西之外的一切。

<强>缺点:   - 如果您正在使用乘客,则需要为每个新实例重新启动apache。   - 如果您使用Apache将不同虚拟主机上的子域路由到不同的mongrel集群,则相同。

然而更好的方法来自问题:Rails - Separate Database Per Subdomain

接受的答案中的方法更加健壮。它可能需要比您正在寻找的更多变化,但它具有所有好处,没有任何其他方法的缺点。每个新实例都需要master数据库中的新条目以及表名和其他特定于实例的信息。您还需要自定义rake任务来为每个新实例构建数据库。

答案 1 :(得分:0)

我建议切换数据库连接并根据域添加view_path,我已在this question中发布了代码。

我希望这有帮助!

答案 2 :(得分:0)

我不会像你提到的那样使用多个数据库。保持所有模式/迁移与所有数据库同步可能会变得很痛苦。

我会考虑简单地将它变成一个多租户应用程序,你有某种“帐户”模型,然后你所有现有的模型都限定它...换句话说,如果这是一个博客应用程序,你的帐户has_many:帖子等

通过这种方法,您可以按子域识别帐户...让人们在创建帐户时选择他们的子域并从那里开始。

这很简单。如果您需要在合并中添加结算,则可以查看SaaS Railskit(处理所有注册和子域名)或Chargify

您还可以使用http://myapp.com/someuser

识别Twitter风格的帐户