Dockerizace! (zatím alespoň pro lokální vývoj) #37

Open
borek wants to merge 6 commits from dockerizace into master
borek commented 1 year ago
Collaborator

Téměř určitě jsem porušil nějaké good practices a téměř určitě něco nefunguje. Nemělo by ale (snad) být rozbité nic okolo. Co mě napadlo jsem vyzkoušel, ale nemám zatím tolik představu, co se může rozbít.

Co to dělá:

  • docker-compose.yml specifikuje, že chceme kontejner pro web, který je závislý na kontejneru s PostgreSQL db
    • web se buildí z Dockerfilu, mountuje si kořen repa jako svůj volume (takže vidí změny), na konci spouští webserver a vysatvuje ho na port 8000 localhosta
    • db je z postgres:13-bullseye a má nastavené nějaké parametry, svoje data ukládá jako docker volume
  • Dockerfile staví web na pythonu3.9 a debianu bullseye (mělo by odpovídat gimlimu) - nainstaluje dependencies, nastaví locale a entrypoint (co se má vykonat při spouštění kontejneru)
  • docker_entrypoint.sh počká na Postgres ready v db, podívá se jestli jsou v něm testdata a když ne, vygeneruje, spustí command z compose (i.e. webserver)
  • mamweb/settings.py vybere docker settings podle cesty (jako doteď), vybere mamweb/settings_docker.py, které by se mělo chovat ve většině stejně jako mamweb/settings_local.py, ale používat jako DB Engine Postgres ve vedlejším kontejneru, aby se chovalo stejně jako _test a _prod
Téměř určitě jsem porušil nějaké good practices a téměř určitě něco nefunguje. Nemělo by ale (snad) být rozbité nic okolo. Co mě napadlo jsem vyzkoušel, ale nemám zatím tolik představu, co se může rozbít. Co to dělá: - `docker-compose.yml` specifikuje, že chceme kontejner pro web, který je závislý na kontejneru s PostgreSQL db - `web` se buildí z `Dockerfilu`, mountuje si kořen repa jako svůj volume (takže vidí změny), na konci spouští webserver a vysatvuje ho na port 8000 localhosta - `db` je z `postgres:13-bullseye` a má nastavené nějaké parametry, svoje data ukládá jako docker volume - `Dockerfile` staví `web` na pythonu3.9 a debianu bullseye (mělo by odpovídat gimlimu) - nainstaluje dependencies, nastaví locale a entrypoint (co se má vykonat při spouštění kontejneru) - `docker_entrypoint.sh` počká na Postgres ready v `db`, podívá se jestli jsou v něm testdata a když ne, vygeneruje, spustí command z compose (i.e. webserver) - `mamweb/settings.py` vybere docker settings podle cesty (jako doteď), vybere ` mamweb/settings_docker.py`, které by se mělo chovat ve většině stejně jako `mamweb/settings_local.py`, ale používat jako DB Engine Postgres ve vedlejším kontejneru, aby se chovalo stejně jako `_test` a `_prod`
borek added 2 commits 1 year ago
1937f3a4c9 Docker přesvědčen, aby používal Postgres
Poster
Collaborator

Ještě by to možná chtělo si pořídit .dockerignore.

Ještě by to možná chtělo si pořídit `.dockerignore`.
Owner

Já jsem to zatím netestoval u sebe, pár pointů čistě ze čtení

Co mě napadlo jsem vyzkoušel, ale nemám zatím tolik představu, co se může rozbít.

Náhodou jsi testy spouštět nezkoušel (make/test)? Já taky nemám představu, co všechno se může rozbít :-) (Naše testy rozhodně nepokrývají moc funkcí, spíš různé drobnosti, takže když projdou, tak to nic neznamená, ale když ne, tak snad půjde snadno zjistit, kde je chyba…)

Jidáš to trochu zkoušel testovat před týdnem, ale nevím, co všechno zkoušel a jak…

Co to dělá:

Nechceš to spíš připsat přímo do těch souborů, případně do docs/? Myšlenka za tím je, že až jednou přijde nový a zmatený org, tak spíš nebude procházet dávné pull requesty za účelem pochopení kódu. Díky za popsání!

  • mamweb/settings.py vybere docker settings podle cesty (jako doteď), vybere mamweb/settings_docker.py, které by se mělo chovat ve většině stejně jako mamweb/settings_local.py, ale používat jako DB Engine Postgres ve vedlejším kontejneru, aby se chovalo stejně jako _test a _prod

To vypadá OK, jen navrhuji rovnou „naincludovat“ settings_local (klidně prostě from mamweb.settings_local import *) a přepsat DATABASES (případně udělat další relevantní změny), ať se zmenší šance, že ta nastavení budou divergovat. Settings jsou ve většině případů obyčejné Pythoní typy (slovníky, pole, stringy, skaláry, …)

(Je možné, že se běžení v Dockeru dá zjistit nějak víc přímo, ale tohle je rozhodně good enough a pochopitelné, tak bych to víc neřešil.)

Já jsem to zatím netestoval u sebe, pár pointů čistě ze čtení > Co mě napadlo jsem vyzkoušel, ale nemám zatím tolik představu, co se může rozbít. Náhodou jsi testy spouštět nezkoušel (`make/test`)? Já taky nemám představu, co všechno se může rozbít :-) (Naše testy rozhodně nepokrývají moc funkcí, spíš různé drobnosti, takže když projdou, tak to nic neznamená, ale když ne, tak snad půjde snadno zjistit, kde je chyba…) Jidáš to trochu zkoušel testovat před týdnem, ale nevím, co všechno zkoušel a jak… > Co to dělá: Nechceš to spíš připsat přímo do těch souborů, případně do `docs/`? Myšlenka za tím je, že až jednou přijde nový a zmatený org, tak spíš nebude procházet dávné pull requesty za účelem pochopení kódu. Díky za popsání! > - `mamweb/settings.py` vybere docker settings podle cesty (jako doteď), vybere ` > mamweb/settings_docker.py`, které by se mělo chovat ve většině stejně jako `mamweb/settings_local.py`, ale používat jako DB Engine Postgres ve vedlejším kontejneru, aby se chovalo stejně jako `_test` a `_prod` To vypadá OK, jen navrhuji rovnou „naincludovat“ `settings_local` (klidně prostě `from mamweb.settings_local import *`) a přepsat `DATABASES` (případně udělat další relevantní změny), ať se zmenší šance, že ta nastavení budou divergovat. Settings jsou ve většině případů obyčejné Pythoní typy (slovníky, pole, stringy, skaláry, …) (Je možné, že se běžení v Dockeru dá zjistit nějak víc přímo, ale tohle je rozhodně good enough a pochopitelné, tak bych to víc neřešil.)
Poster
Collaborator

Náhodou jsi testy spouštět nezkoušel (make/test)?

Teď zkusil, krásně selžou. 😁 Třeba se někdy dostanu k zjišťování, proč..

Nechceš to spíš připsat přímo do těch souborů, případně do docs/?

V souborech komentáře jsou, ale přidat to do docs/ dává smysl.

To vypadá OK, jen navrhuji rovnou „naincludovat“ settings_local (klidně prostě from mamweb.settings_local import *) a přepsat DATABASES (případně udělat další relevantní změny), ať se zmenší šance, že ta nastavení budou divergovat.

Velmi dává smysl, udělám.

(Je možné, že se běžení v Dockeru dá zjistit nějak víc přímo, ale tohle je rozhodně good enough a pochopitelné, tak bych to víc neřešil.)

Mně právě přišlo, že když se podle toho rozhoduje settings_? už teď, tak nebudu ani zkoumat, jak to udělat jinak.

> Náhodou jsi testy spouštět nezkoušel (`make/test`)? Teď zkusil, krásně selžou. 😁 Třeba se někdy dostanu k zjišťování, proč.. > Nechceš to spíš připsat přímo do těch souborů, případně do `docs/`? V souborech komentáře jsou, ale přidat to do `docs/` dává smysl. > To vypadá OK, jen navrhuji rovnou „naincludovat“ settings_local (klidně prostě from mamweb.settings_local import *) a přepsat DATABASES (případně udělat další relevantní změny), ať se zmenší šance, že ta nastavení budou divergovat. Velmi dává smysl, udělám. > (Je možné, že se běžení v Dockeru dá zjistit nějak víc přímo, ale tohle je rozhodně good enough a pochopitelné, tak bych to víc neřešil.) Mně právě přišlo, že když se podle toho rozhoduje `settings_?` už teď, tak nebudu ani zkoumat, jak to udělat jinak.
borek added 1 commit 1 year ago
29d97c60a3 seetings pro docker jen upravuje detaily z local
Poster
Collaborator

Zkusil jsem make/test. Zkapou všechny testy z api.tests.test_skola_autocomplete.OrgSkolyAutocompleteTestCase (test_skoly_pocet, test_skoly_vraceny a test_view_funguje).

Vždycky první na:

TypeError: Object of type Skola is not JSON serializable

a pak

During handling of the above exception, another exception occurred:
[spousta bordelu]
django.template.exceptions.TemplateSyntaxError: You must enable the 'sekizai.context_processors.sekizai' template context processor or use 'sekizai.context.SekizaiContext' to render your templates.

Nějaký tip, co s tím? Asi hlavně – má být Skola JSON serializable? Není mi jasné, jestli hledat "proč není serializable, když má být", nebo "proč se ji to snaží serializovat, když by nemělo".. nebo naopak začít odzadu a řešit to sekizai?

Zkusil jsem `make/test`. Zkapou všechny testy z `api.tests.test_skola_autocomplete.OrgSkolyAutocompleteTestCase` (`test_skoly_pocet`, `test_skoly_vraceny` a `test_view_funguje`). Vždycky první na: ```python TypeError: Object of type Skola is not JSON serializable ``` a pak ```python During handling of the above exception, another exception occurred: [spousta bordelu] django.template.exceptions.TemplateSyntaxError: You must enable the 'sekizai.context_processors.sekizai' template context processor or use 'sekizai.context.SekizaiContext' to render your templates. ``` Nějaký tip, co s tím? Asi hlavně – má být `Skola` JSON serializable? Není mi jasné, jestli hledat "proč není serializable, když má být", nebo "proč se ji to snaží serializovat, když by nemělo".. nebo naopak začít odzadu a řešit to `sekizai`?
borek added 1 commit 1 year ago
Owner

Jako mně to mimo docker funguje, takže bych tipoval, že někde chybí nainstalovaná/přidaná nějaká aplikace…

Jako mně to mimo docker funguje, takže bych tipoval, že někde chybí nainstalovaná/přidaná nějaká aplikace…
Owner

Myslím, že by to měl dělat django_rest_framework, který by dokonce měl být nainstalován a v INSTALLED_APPS… Tak nevím.

Myslím, že by to měl dělat `django_rest_framework`, který by dokonce měl být nainstalován a v `INSTALLED_APPS`… Tak nevím.
zelvuska added 1 commit 1 year ago
Owner

Zamergeoval jsem tam main s novějšími verzemi knihoven (např. Django 4 místo 3). A teď mi to funguje…

Zamergeoval jsem tam main s novějšími verzemi knihoven (např. Django 4 místo 3). A teď mi to funguje…
Owner

Myslím, že by to měl dělat django_rest_framework, […]

Nikoliv, o tuhle serializaci (/api/autocomplete/skola) se django-autocomplete-light myslím stará přímo (ostatně, seializovat školy do JSONu umí Django přímo, vizte třeba v api/views/exports.py nebo při ./manage.py dumpdata …).

> Myslím, že by to měl dělat `django_rest_framework`, […] Nikoliv, o tuhle serializaci (`/api/autocomplete/skola`) se django-autocomplete-light myslím stará přímo (ostatně, seializovat školy do JSONu umí Django přímo, vizte třeba v `api/views/exports.py` nebo při `./manage.py dumpdata …`).
Owner

Snaha o zadokumentování i jinde než v PR

Hm, nicméně ta dokumentace není odnikud odkázaná. Asi se to v návodu na dokumentaci nepíše¹, ale zdá se mi, že buď je potřeba do docs/index.rst přidat jméno souboru s dokumentací (pak bude v obsahu)o ² odkázat z nějakého vhodného místa (pomocí :ref:`nadpis` , příklad třeba na ř. 105 docs/vyvoj.rst.)

¹Skvělá příležitost návod rozšířit a pomoci tak budoucím webařům :-P

²Tady mi tea nějak zblbla, asi je tu rozbitý komentář, pardon…

> Snaha o zadokumentování i jinde než v PR Hm, nicméně ta dokumentace není odnikud odkázaná. Asi se to v návodu na dokumentaci nepíše¹, ale zdá se mi, že buď je potřeba do `docs/index.rst` přidat jméno souboru s dokumentací (pak bude v obsahu)o ² odkázat z nějakého vhodného místa (pomocí ``:ref:`nadpis` ``, příklad třeba na ř. 105 `docs/vyvoj.rst`.) ¹Skvělá příležitost návod rozšířit a pomoci tak budoucím webařům :-P ²Tady mi `tea` nějak zblbla, asi je tu rozbitý komentář, pardon…
Owner

Postřeh dneska ze sprchy: ty kontejnery (resp. jejich poskládání) by ve výsledku možná bylo lepší mít dva: pro nasazení a pro vývoj.

Mít spoustu vývojových nástrojů (sphinx, graphviz, …) v produkčním kontejneru zabírá místo (a potenciálně zvětšuje potenciál pro útok) a nejspíš i bude zpomalovat rebuild produkčního kontejneru (což asi nebolí moc, ale i tak je možná lepší se tomu vyhnout…)

Zatím mám pocit, že ta správná lepší varianta je mít produkční-ish kontejner a ten zabalený ve vývojovém, který bude mít ty nástroje navíc (+možná upravenou konfiguraci?). (A nevím, co má reálně běžet na testwebu, ale ty vrstvy IIRC umí být dost lightweight, takže asi hrozí jen zběsilý dependency hell…)

Neříkám, že je to potřeba zohledňovat v rámci tohohle PR (rozhodně není), ale napadlo mě to a chci to někam poznamenat a tohle znělo jako příhodné místo. Není to kritika vůbec ničeho :-)

Postřeh dneska ze sprchy: ty kontejnery (resp. jejich poskládání) by ve výsledku možná bylo lepší mít dva: pro nasazení a pro vývoj. Mít spoustu vývojových nástrojů (sphinx, graphviz, …) v produkčním kontejneru zabírá místo (a potenciálně zvětšuje potenciál pro útok) a nejspíš i bude zpomalovat rebuild produkčního kontejneru (což asi nebolí moc, ale i tak je možná lepší se tomu vyhnout…) Zatím mám pocit, že ta ~~správná~~ lepší varianta je mít produkční-ish kontejner a ten zabalený ve vývojovém, který bude mít ty nástroje navíc (+možná upravenou konfiguraci?). (A nevím, co má reálně běžet na testwebu, ale ty vrstvy IIRC umí být dost lightweight, takže asi hrozí jen zběsilý dependency hell…) Neříkám, že je to potřeba zohledňovat v rámci tohohle PR (rozhodně není), ale napadlo mě to a chci to někam poznamenat a tohle znělo jako příhodné místo. Není to kritika vůbec ničeho :-)
zelvuska added 1 commit 2 months ago
This pull request can be merged automatically.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date

No due date set.

Dependencies

This pull request currently doesn't have any dependencies.

Loading…
There is no content yet.