Mehrere Django-Sites mit gemeinsamer Codebase und DB

8

Ich habe ein Django-Projekt mit 20 Sites (eine andere Domain pro Site) für 20 verschiedene Länder erstellt. Die Seiten teilen alles: Codebasis, Datenbank, URLs, Vorlagen, etc.

Das einzige, was sie nicht teilen, sind kleine Anpassungen (Logo, Hintergrundfarbe des CSS-Designs, Sprachcode usw.), die ich in jeder der Site-Einstellungsdateien festlege (jede Site hat eine Einstellungsdatei und alle von diesen Dateien importieren Sie eine globale Einstellungsdatei mit dem üblichen Zeug). Um die Seiten im Entwicklungsmodus zu betreiben, mache ich jetzt:

%Vor%

Ich habe ein paar Fragen:

  1. Ich habe gelesen, dass es möglich ist, für jede Site (Domain) einen virtuellen Host zu erstellen und ihn an die Datei settings.py der Site zu übergeben. Ich fürchte jedoch, dass dadurch eine Django-Instanz pro Website erstellt würde. Habe ich recht?
  2. Gibt es eine effizientere Möglichkeit, die Bereitstellung durchzuführen? Ich habe über django-dynamicites gelesen, bin mir aber nicht sicher wenn es der richtige Weg ist.
  3. Wenn ich mich für die Bereitstellung mit Heroku entscheide, scheint Heroku nur eine Einstellungsdatei pro App zu erwarten, also müsste ich 20 Apps haben. Gibt es dafür eine Lösung?

Danke!

    
Alex 07.07.2012, 15:53
quelle

1 Antwort

6

Ich habe kürzlich etwas Ähnliches gemacht und festgestellt, dass die folgende Strategie die beste Option ist. Ich gehe davon aus, dass Sie an dieser Stelle mit der Verzweigung von Gittern und Heroku-Fernbedienungen vertraut sind. Wenn Sie nicht sind, sollten Sie dies zuerst lesen: Ссылка

Die wichtigste Strategie, die ich mache, ist eine einzige Codebasis (ein einzelnes Git Repo) mit:

  • Ein master Zweig, der all Ihren gemeinsamen Code enthält: Vorlagen, Ansichten, URLs.
  • Viele site -Verzweigungen, basierend auf master , die alle standortspezifischen Anpassungen enthalten: css, Bilder, Einstellungsdateien (wenn sie sich stark unterscheiden).

Das funktioniert so:

Stellen Sie zuerst sicher, dass Sie sich im Zweig master befinden.

Zweitens, erstelle einen neuen Git-Zweig für eine deiner Domains, zB: git checkout -b somedomain.com .

Drittens, passen Sie Ihren Zweig somedomain.com so an, dass er Ihren Vorstellungen entspricht.

Stellen Sie als Nächstes somedomain.com live auf Heroku bereit, indem Sie heroku create somedomain.com --remote somedomain.com ausführen.

Drücken Sie nun Ihren somedomain.com -Verzweigungscode auf Ihre neue Heroku-Anwendung: git push somedomain.com somedomain.com:master . Dadurch wird dein Code auf Heroku bereitgestellt.

Nachdem Sie nun Ihren Zweig somedomain.com mit seiner eigenen Heroku-Anwendung bereitgestellt haben, können Sie alle normalen Heroku-Aufgaben erledigen, indem Sie --remote somedomain.com zu Ihren normalen Heroku-Befehlen hinzufügen, zB:

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

Sie haben also im Grunde zwei Zweige: a master branch und% somedomain.com branch.

Gehen Sie zurück zu Ihrem Zweig master und machen Sie einen weiteren neuen Zweig für Ihre nächste Domäne: git checkout master; git checkout -b anotherdomain.com . Passen Sie es dann an Ihre Bedürfnisse an (css, site-specific stuff) und stellen Sie es auf die gleiche Weise wie oben beschrieben bereit.

Ich bin mir sicher, dass Sie jetzt sehen können, wohin das geht. Wir haben einen Git-Zweig für jeden unserer benutzerdefinierten domains und jede Domain hat ihre eigene Heroku-App. Der Vorteil (offensichtlich) ist, dass jede dieser Projektanpassungen auf dem Zweig master basiert, was bedeutet, dass Sie problemlos alle Sites gleichzeitig aktualisieren können.

Nehmen wir an, Sie aktualisieren eine Ihrer Ansichten in Ihrem master Zweig - wie können Sie sie auf alle benutzerdefinierten Websites gleichzeitig bereitstellen? Leicht!

Einfach ausführen:

  • git checkout somedomain.com
  • git merge master
  • git push somedomain.com somedomain.com:master # deploy die Änderungen

Und wiederhole es für jede deiner Domains. In meiner Umgebung habe ich ein Skript geschrieben, das das tut, aber es ist einfach genug, wenn man es manuell machen möchte.

Wie auch immer, hoffentlich hilft das.

    
rdegges 03.08.2012, 21:41
quelle

Tags und Links