Z vlastních zkušeností bych doporučil: - Mít vše v 1 repositáři - tzv. monorepo. Balíčky, knihovny, verzování, kompatibilita, je to hrozně administrativy navíc, základem monorepa jsou dobrý testy i na ty klientsky specifický funkčnosti. - Neodlišovat klientské verze větvemi, je to akorát další příležitost se v tom utopit. Udržoval bych jednotnou hlavní vývojovou linii (dev, stage, prod, nebo jak je libo/potřeba) a tam aktuální zdrojáky všeho a pro všechny.
Klíčem bude vždy dobře předem zvážit, která funkcionalita je specifická a která obecná. Ale monorepo přecejen dává větší flexibilitu věci přesouvat. Společné funkce bych držel za každou cenu stejné (zejm. na úrovni modelů). I specifické funkce lze často zavádět na základě obecných mechanismů (jednotné rozhraní). Další otázkou je, jak se verze budou provozovat - 1 instance pro všechny (zde jsi již udělal rozhodnutí s různými db, ale úvaha o společné db je určitě validní), nebo na druhé straně spektra on-site u/pro konkrétního klienta. Potřeby se můžou v čase významně měnit. Ale i tady poskytuje monorepo větší flexibilitu z hlediska experimentů a změn dle potřeb. Hodně štěstí, John On Sat, 12 Sep 2020, 09:39 Jakub Vysoky, <jakub.vys...@gmail.com> wrote: > Abychom ti dokazali spravne poradit, museli bychom vedet, jak velike jsou > rozdily v tech jednotlivych "instalacich" pro ruzne klienty. > > Za me je urcite "spravne" mit: > > * jednu spolecnou knihovnu v niz je vetsina funkcionality (vetsina django > apps) > * virtualenv per klient > * v kazdem virtualenvu pro kazdeho klienta jejich vlastni django projekt > (cili django settings, INSTALLED_APPS) > * nejspis i v tom vlastnim projektu jednu django appku, kterou mohu > customizovat sablony, pridavat nejakou funkcionalitu, ktera je unikatni pro > daneho klienta > > Vsechno bych instaloval pomoci pipu - i kdyz to bude z nekolika vlastnich > repositaru - to neni zas takovy problem. A urcite mel minimalne na upgrade > nejaky skript, at to volam vzdycky stejne. Ansible je urcite super, ale > muze byt pro tebe prekazka na nauceni se. > > Stejne tak mozna v tvem pripade by moje navrhovane oddeleni bylo zbytecne > silne. Ale ja bych to videla do budoucna nejspolehlivejsi. > > Drzim palce! > > > On Sat, Sep 12, 2020 at 2:11 AM Vladimír Macek <ma...@sandbox.cz> wrote: > >> Ahoj, >> >> a) jedna z cest na začátku vývoje byla, že bys měl projekt koncipovaný >> jako multi-tenant, tzn. databáze a globální objekty (glob. objekty, cache, >> fajly, ...) by s izolací klientů počítaly. Pak bys to měl na jednu stranu >> jednoduché s údržbou. Bylo by ale neustále nutné hlídat tu izolaci a >> udržovat rozdíly ve funkčnostech. >> >> b1) Když by funkčních rozdílů mezi doménami bylo míň, můžeš vyvíjet JEDEN >> projekt pro všechny, provozovat pro každého klienta extra instanci, ale z >> JEDNOHO branche. Funkční rozdíly mezi doménami by se rešily výhybkami v >> kódu. >> >> Zdrojáky na serveru můžou být jen jednou, dokonce i virtualenv jen jeden, >> jen různé settings, databáze a file storage. >> >> b2) Větší funkční oddělený celek, by se dal uzavřít do apky, kterou by v >> INSTALLED_APPS měli jen příslušní klienti. Pozor, stále se z ní dá >> importovat. >> >> c) Silnější varianta je udržovat takovou per-instance apku jako separátně >> instalovanou jen do virtualenvu příslušného klienta. Pak by importovatelná >> nebyla, ale pro klienty bys již musel udržovat oddělené virtualenvy. >> >> Zde bych jit doporučil nástroj na automatický deployment, například >> Ansible. Nedávno jsem ho zavedl do svého toolsetu a je opravdu fajn. >> Deployneš novou verzi všem najednou, klidně s customizacemi. >> >> d) Může tě zaujmout ještě další varianta: Společnou část projektu bys >> udržoval v hlavním git branchi, třeba 'prod' (jako produkční). A pak bys >> pro klienta požadujícího změnu vytvořil branch 'prod-klient1', ve které by >> oproti 'prod' byly změny, které tento klient chtěl. >> >> Vývoj a bugfixy společných částí bys pushoval do 'prod' a hned mergnul do >> všech 'prod-*' branchů. Abys nezapomněl, můžeš si nastavit různé git hooky >> -- jen varovací nebo i blokující, že třeba nepushneš 'prod-*', pokud jsi do >> něj zapomněl mergnout 'prod'. >> >> Chce to jenom větší sebekázeň, ale git je na souběžný vývoj přímo dělaný. >> Výhody jsou, že git ti vždycky krásně zobrazí diffy mezi společnou verzí a >> klienty i mezi klienty navzájem. U žádného klienta není kód navíc. >> Nespolečné commity si navždy ponesou své messages, kde svému budoucímu já >> podrobně vysvětlíš, proč existují. To se u výhybek ne vždy daří. Viděl bych >> i omezený dosah chyb v 'prod-*' brenčích. Další výhoda mě napada, že když >> při mergi do 'prod-*' dojde někde k průniku změn (nechci říkat přímo >> kolizi), přiměje tě to k úvaze, jestli dělení funkčností koncipuješ dobře. >> >> Ansible ti opět na jediný příkaz deployne do virtualenvů všech klientů, >> každého z příslušného branche gitu. >> >> V každém případě si veď dokumentaci kdy, kdo, chtěl jakou změnu, proč ji >> chtěl, jak jsi s ním o úpravě diskutoval. Tvým zájmem je mít rozdíly v kódu >> mezi klienty co nejmenší. >> >> Měj se, ať to jde, >> >> Vláďa >> tel. 608 978 164 >> >> On 12. 09. 20 0:25, stanisl...@gmail.com wrote: >> >> Zdravím, >> >> potřeboval bych poradit či navést na best-practice v Django, jak jeden >> projekt nasadit pro více firem, ale tak, abych v čase mohl dělat klientské >> modifikace. Aktuálně jsem vymyslel aplikaci a používají ji 2 moji klienti. >> Django aplikace běží na nGinx a abych mohl obě aplikace aktualizovat >> současně, na serveru jsem nalinkoval společné zdrojové kódy (virtuál >> linkuje společné adresáře/aplikace). Vše běží, protože každá aplikace má >> svou konfiguraci a svou databázi. Pokud aplikaci vylepším, nahraju ji na 1 >> místo, restartuji server či oba virtuály a oba klienti frčí na >> aktualizacích. >> >> Nicméně: jak nejlépe postupovat, pokud např. 1. firma bude chtít nějakou >> změnu v šabloně, 2. firma například upravit či přidat celou funkčnost. Rád >> bych udržel zdrojový kód jednotný s nějakými "odbočkami" pro konkrétního >> klienta, ale nemohu najít jak nejlépe a nejsystémověji se tomu postavit, >> aby projekt byl dlouhodobě spravovatelný, zvlášť pokud by přibylo klientů. >> >> Věřím, že existuje nějaké systémové řešení, budu rád i za navedení či >> odkaz na nějaký tutorial. Předem díky! >> -- >> -- >> E-mailová skupina django-cs@googlegroups.com >> Správa: http://groups.google.cz/group/django-cs >> --- >> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny >> „django-cs“ ve Skupinách Google. >> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, >> zašlete e-mail na adresu django-cs+unsubscr...@googlegroups.com. >> Chcete-li tuto diskusi zobrazit na webu, navštivte >> https://groups.google.com/d/msgid/django-cs/f508f99c-c9d9-46c4-9ce3-102506cd4634n%40googlegroups.com >> <https://groups.google.com/d/msgid/django-cs/f508f99c-c9d9-46c4-9ce3-102506cd4634n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> >> -- >> -- >> E-mailová skupina django-cs@googlegroups.com >> Správa: http://groups.google.cz/group/django-cs >> --- >> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny >> „django-cs“ ve Skupinách Google. >> Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, >> zašlete e-mail na adresu django-cs+unsubscr...@googlegroups.com. >> Chcete-li tuto diskusi zobrazit na webu, navštivte >> https://groups.google.com/d/msgid/django-cs/afec4bde-39ed-1d99-f88c-a276e5921ff8%40sandbox.cz >> <https://groups.google.com/d/msgid/django-cs/afec4bde-39ed-1d99-f88c-a276e5921ff8%40sandbox.cz?utm_medium=email&utm_source=footer> >> . >> > > > -- > Jakub Vysoky > > mob: +420 605 852 377 > jab: jakub.vys...@gmail.com > twit: https://twitter.com/kvbik > > -- > -- > E-mailová skupina django-cs@googlegroups.com > Správa: http://groups.google.cz/group/django-cs > --- > Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny > „django-cs“ ve Skupinách Google. > Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, > zašlete e-mail na adresu django-cs+unsubscr...@googlegroups.com. > Chcete-li tuto diskusi zobrazit na webu, navštivte > https://groups.google.com/d/msgid/django-cs/CAEO8NYwACMW6Vqcw8W3ZS6mjDcLwNSQYZZzQqQHr-cXb5H%3D4Qw%40mail.gmail.com > <https://groups.google.com/d/msgid/django-cs/CAEO8NYwACMW6Vqcw8W3ZS6mjDcLwNSQYZZzQqQHr-cXb5H%3D4Qw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- -- E-mailová skupina django-cs@googlegroups.com Správa: http://groups.google.cz/group/django-cs --- Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google. Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscr...@googlegroups.com. Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK-vJU%3D0ZgAcvNgkS%2BvqNVgPESnkSA%2Bc2a5t1qPXCbEwhuW%3Drg%40mail.gmail.com.