8

我为 20 个不同的国家/地区创建了一个包含 20 个站点(每个站点一个不同的域)的 Django 项目。这些网站共享所有内容:代码库、数据库、网址、模板等。

他们唯一不共享的是我在每个站点设置文件中设置的小自定义(徽标、CSS 主题的背景颜色、语言代码等)(每个站点都有一个设置文件,以及所有这些文件导入带有通用内容的全局设置文件)。现在,为了在开发模式下运行站点,我将执行以下操作:

django-admin.py runserver 8000 --settings=config.site_settings.site1
django-admin.py runserver 8001 --settings=config.site_settings.site2
...
django-admin.py runserver 8020 --settings=config.site_settings.site20

我有一些问题:

  1. 我读过可以为每个站点(域)创建一个虚拟主机并将其传递给站点的 settings.py 文件。但是,恐怕这会为每个站点创建一个 Django 实例。我对吗?
  2. 有没有更有效的部署方式?我已经阅读了有关django-dynamicsites 的信息,但我不确定这是否是正确的方法。
  3. 如果我决定使用 Heroku 进行部署,似乎 Heroku 期望每个应用程序只有一个设置文件,所以我需要有 20 个应用程序。有解决方案吗?

谢谢!

4

1 回答 1

7

所以,我最近做了类似的事情,发现下面的策略是最好的选择。我将假设您此时熟悉 git 分支以及 Heroku 遥控器。如果你不是,你应该先阅读这个:https ://devcenter.heroku.com/articles/git#multiple-remotes-and-environments

我正在采取的主要策略是拥有一个单一的代码库(一个单一的 Git 存储库),其中包含:

  • master包含所有共享代码的分支:模板、视图、URL。
  • 许多site基于 的分支,master其中包含所有特定于站点的自定义:css、图像、设置文件(如果它们有很大不同)。

它的工作方式是这样的:

首先,确保你在master分支上。

其次,为您的一个域创建一个新的 git 分支,例如:git checkout -b somedomain.com.

第三,自定义您的somedomain.com分支,使其看起来像您想要的那样。

接下来,通过运行实时部署somedomain.com到 Heroku heroku create somedomain.com --remote somedomain.com

现在,将您的somedomain.com分支代码推送到您的新 Heroku 应用程序:git push somedomain.com somedomain.com:master. 这将在 Heroku 上部署您的代码。

现在您已经somedomain.com使用自己的 Heroku 应用程序部署了您的分支,您可以通过添加--remote somedomain.com到您的普通 Heroku 命令来完成所有普通 Heroku 的工作,例如:

  • heroku pg:info --remote somedomain.com
  • heroku addons:add memcache:5mb --remote somedomain.com
  • 等等

所以,现在你基本上有了两个分支:一个master分支,一个somedomain.com分支。

返回您的master分支,为您的下一个域创建另一个新分支:git checkout master; git checkout -b anotherdomain.com. 然后根据您的喜好对其进行自定义(css,特定于站点的内容),并按照我们上面所做的相同方式进行部署。

现在我相信你现在可以看到这是怎么回事。我们的每个 custom 都有一个 git 分支,domains每个域都有自己的 Heroku 应用程序。好处(显然)是这些项目自定义中的每一个都基于master分支,这意味着您可以轻松地一次对所有站点进行更新。

假设您更新了master分支中的一个视图——如何一次将其部署到所有自定义站点?容易地!

赶紧跑:

  • git checkout somedomain.com
  • git merge master
  • git push somedomain.com somedomain.com:master# 部署更改

并为您的每个域重复。在我的环境中,我编写了一个脚本来执行此操作,但如果您愿意,手动操作也很容易。

无论如何,希望这会有所帮助。

于 2012-08-03T21:41:21.063 回答