2012-07-07 71 views
8

我爲20個不同的國家/地區創建了一個包含20個站點(每個站點一個不同站點)的Django項目。這些網站共享一切:代碼庫,數據庫,網址,模板等具有共享代碼庫和數據庫的多個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個應用。有沒有解決方案?

謝謝!

+0

我在同一個問題尋找最佳的解決方案。 給看看這個:http://www.huyng.com/posts/franchising-running-multiple-sites-from-one-django-codebase/ – 2012-07-10 09:35:40

+1

謝謝您的回答。最後我用https://github.com/wardi/django-dynamicsites-lite – Alex 2012-07-10 21:14:46

回答

6

所以,我最近做了類似的事情,發現下面的策略是最好的選擇。我將假設您現在熟悉git分支以及Heroku遙控器。如果你不是,你應該先閱讀:https://devcenter.heroku.com/articles/git#multiple-remotes-and-environments

我走的主要策略是有一個單一的代碼庫(單個混帳回購協議)與:

  • 包含所有A master分支您的共享代碼:模板,數據視圖,網址。
  • 許多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應用程序,你可以做一切正常的Heroku的東西加入--remote somedomain.com到正常的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,特定於網站的東西),並按照上面的方式進行部署。

現在,我敢肯定,你可以看到這是由現在要去。我們的每個定製domains都有一個git分支,每個域都有它自己的Heroku應用程序。好處(顯然)爲各項目,這些自定義的基於斷master分支,這意味着你可以輕鬆地一次進行更新,所有網站。

假設您更新master分支中的某個視圖 - 您如何將其部署到全部您的自定義網站一次?容易!

只要運行:

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

,並重復爲每個域。在我的環境中,我寫了一個腳本來做到這一點,但如果你願意的話,手動操作很容易。

總之,希望這有助於。

+2

非常聰明的方式做到這一點,我沒有想到的。然而,就我而言,我不確定是否會更好,因爲我需要N個Heroku應用程序,而且我需要爲付費插件付N次費用。 我的方法是把所有的地點特定數據(實際上非​​常少)在DB與[Django的喜好(http://github.com/praekelt/django-preferences)。 順便說一句,這很有趣,我只是讀了真棒網站[deploydjango.com(http://www.deploydjango.com/),我只是你所看到的響應:) – Alex 2012-08-19 19:10:25

+0

它增加了成本,因爲N個地點增加成本將成爲每個應用程序的「N x成本」。 – 2015-08-05 11:56:46