Jak na deploy Python aplikace na Roští.cz

Jak na deploy Python aplikace na Roští.cz
« kdy: 31. 12. 2024, 17:42:46 »
Čau,

protože jsem se s tím celkem natrápil, tak tady dávám knowhow, vzhledem k tomu, že to Roští nakonec docela funguje. Bohužel se mi nepodařilo rozjet CI/CD, protože tam má Roští jednak nějakou chybku, druhak to mají udělané pro Node.js. Tak jsem to obešel a dělám deploy přes rsync.

Kroky:

1. Na Roští si založím účet, trochu pročtu dokumentaci a podívám se, jaká je nejnovější verze Pythonu (Dneska je to 3.13). Rovněž si zvolím, jaký použiju tarif - pokud mi u nejlevnějšího tarifu nestačí 1GB místa na disku, nevadí - cokoliv přeteče se prostě jen naúčtuje, viz ceník.

2. Aplikaci v Pythonu (Já používám Flask, ale to je celkem jedno) napíšu nebo aktualizuju na nejnovější verzi Pythonu. Díky tomu se můžu dostat až na 3.5 roku podpory a nemusím na to celou tuto dobu šáhnout. Python verze mají totiž podporu přibližně jen 3.5 roku od vydání, pak je možné očekávat, že ani Roští nebude chtít dále nepodporovanou verzi Pythonu mít.

3. V mojí Flask python aplikaci musím zařídit, že je spustitelná příkazem "python3.13 -m app", tedy že nevzniknou problémy s importy závislostí atp.

4. Roští používá pro správu Python aplikace software s názvem "gunicorn". Tento software potřebuje, aby se v mém kořenovém "app.py" souboru vyskytovala globální proměnná s názvem "application". Tedy v mém případě instanci třídy Flask přiřadím do proměnné s názvem "application = Flask(__name__, )"

5. Když mi aplikace na localhostu správně běží, můžu vyrobit script pro její deploy:

Kód: [Vybrat]
#!/bin/bash

rsync -arv -v -e "ssh -p CISLO_VASI_APP_V_ROSTI" --exclude .git --exclude data ../$jmeno_adresare_s_projektem app@ssh.rosti.cz:/srv/app

Tento script se po spuštění přesune do adresáře o úroveň výš a zkopíruje obsah adresáře s projektem do Roští

6. Následně potřebuju upravit cestu v systémové aplikaci "supervisor.d" k mému "app.py" souboru. Otevřu si config:

Kód: [Vybrat]
cd /srv/conf/supervisor.d
vim python.conf

Takto vypadá:

Kód: [Vybrat]
[program:app]
directory=/srv/app/jmeno_adresare_s_mou_aplikaci
command=/srv/venv/bin/gunicorn -u app -g app -b 0.0.0.0:8080 --access-logfile - --error-logfile - --reload app

autostart=true
autorestart=true
stdout_logfile=/srv/log/python.log
stdout_logfile_maxbytes=2MB
stdout_logfile_backups=5
redirect_stderr=true

Důležité jsou první 2 řádky, zejména pak "directory=", který musíme změnit, protože originálně ukazuje jinam. Na řádku "command=" nemusímě měnit z originálního stavu nic, tedy pakliže se náš hlavní soubor jmenuje "app.py". Pokud ne, přidělali jste si práci.

7. Když máte aplikaci zkopírovanou do Roští, závislosti máte nainstlovány "pip3.13 install -r requirements.txt", tak stačí zavolat příkazy:

Kód: [Vybrat]
$ supervisorctl reread
$ supervisorctl update
$ supervisorctl restart app

8. Tímto by aplikace měla běžet a být přístupná z Internetu. Pokud není a v browseru vidíte chybu, stačí se podívat do logu:

Kód: [Vybrat]
$ /srv/log
$ cat python.log

Zde uvidíte chybu, tu stačí přečíst, opravit a zkusit znovu udělat restart aplikace přes supervisor.

9. Pokaždé když spustíte script pro deploy, tak dojde k automatickému přenasazení (tedy alespoň mi jo)

« Poslední změna: 31. 12. 2024, 17:48:06 od registrovany123 »


Re:Jak na deploy Python aplikace na Roští.cz
« Odpověď #1 kdy: 31. 12. 2024, 19:32:11 »
Tak bezva, že se vám to povedlo. Z těch možností diskutovaných v původním vlákně mi to rozchození na aktuální verzi Pythonu přijde zdaleka nejrozumnější.
A díky za napsání celého popisu rozběháním aplikace na rosti.cz, věřím že se ty informace budou časem někomu hodit.

Re:Jak na deploy Python aplikace na Roští.cz
« Odpověď #2 kdy: 02. 01. 2025, 10:35:35 »
Trochu OT, ale kdyz vidim requirements.txt, to je hadí pravěk.

-> https://matt.sh/python-project-structure-2024

Re:Jak na deploy Python aplikace na Roští.cz
« Odpověď #3 kdy: Dnes v 12:06:49 »
Trochu OT, ale kdyz vidim requirements.txt, to je hadí pravěk.

-> https://matt.sh/python-project-structure-2024

Ja ti na to reknu, ze pokracuj takhle dal, a nebude duvod pouzivat Python. Mi requirements staci, a pokud mi nestaci z vyse uvedenoho duvodu, tak uz to neni jendoduchy projekt a Adios amigos Python, udelam to v Jave a ve Springu. Jakoze nekdy me Python tak toci, ze si nekdy rikam, proc to v nem vubec delam. Python by mel byt jednoduchy.

Kdyz specifikuje v requirements verze, a mam to udelane pro Python 3.13, tak nikde by problem nastat nemel.

A Python ma problem s tim, ze verze Pythonu nejsou k sobe kompatibilni - takze v tom pripade at si udelaji LTS verze.
« Poslední změna: Dnes v 12:15:46 od registrovany123 »

Re:Jak na deploy Python aplikace na Roští.cz
« Odpověď #4 kdy: Dnes v 19:31:50 »
Trochu OT, ale kdyz vidim requirements.txt, to je hadí pravěk.

-> https://matt.sh/python-project-structure-2024
Většina OK, ale ta sekce "le example" je docela děs (ten "web fetcher nicely encapsulated in a dataclass", kde je potřeba 7 řádků komentářů vysvětlujících ty prasárny, co musí udělat, aby mohl použít nějakou pochybnou knihovnu). S tím souvisí i sekce "basically every python class should be a dataclass going forward with no exceptions", WTF.


Re:Jak na deploy Python aplikace na Roští.cz
« Odpověď #5 kdy: Dnes v 19:47:29 »
spustitelná příkazem "python3.13 -m app", tedy že nevzniknou problémy s importy závislostí atp.

 Tento software potřebuje, aby se v mém kořenovém "app.py" souboru vyskytovala globální proměnná
 přenasazení (tedy alespoň mi jo)

>matt.sh : __ini__.py, pyproject.toml
Wow, tak to je ještě horší bolilerplateismus java. Aneb vítejte v GDD. (Generator Driven Development)
Ještě mi tam chybí podmínka, aby index.py měl velikost dělitelnou  3130 bajty a project.toml součet číslic datu vzniku souboru 88 a aby existovala funkce uštknutí_pythonem()