# Dokumentácia k projektu: Webová aplikácia s nasadením v Azure ## Čo robí aplikácia Aplikácia je jednoduchý webový systém na správu používateľov. Umožňuje: - zobrazovať zoznam používateľov uložených v databáze PostgreSQL, - náhodne vybrať jedného používateľa, - pridávať a odstraňovať používateľov cez frontend a REST API. Frontend je napísaný v HTML a komunikácia so serverom je zabezpečená cez Flask. Dáta sú uložené v Azure PostgreSQL Flexible Serveri. ## Použitý verejný cloud a služby Pre nasadenie aplikácie bol použitý **Microsoft Azure**. Zvolené služby: - **Azure Resource Group**: slúži ako kontajner pre všetky ostatné zdroje. - **Azure Container Registry (ACR)**: privátny Docker registry, kde je uchovaný obraz aplikácie. - **Azure Container Apps**: služba na spustenie kontajнеризованных aplikácií bez potreby správy infraštruktúry. - **Azure Database for PostgreSQL Flexible Server**: cloudová databáza na ukladanie dát používateľov. - **Docker**: použitý na vytvorenie obrazu aplikácie. - **psql**: klient na komunikáciu s databázou. Aplikácia nemá explicitne definované trvalé zväzky, ale využíva trvalé úložisko databázy. ## Prehľad súborov a konfigurácií ### `prepare-app.sh` Hlavný skript, ktorý zabezpečuje kompletné nasadenie aplikácie. Vykonáva: - vytvorenie resource group (ak neexistuje), - vytvorenie Azure Container Registry (ACR) a aktiváciu admin režimu, - čakanie, kým sa ACR stane dostupným, - vytvorenie PostgreSQL Flexible Servera a firewall pravidla, - čakanie na stav **Ready** po vytvorení databázy, - zmenu hesla administrátora databázy (pre istotu), - build Docker obrazu a jeho push do ACR, - vytvorenie Azure Container Environment (ak neexistuje), - vytvorenie alebo aktualizáciu Container App so všetkými premennými prostredia (DB), - vytvorenie tabuľky `users` v databáze cez psql. Tento skript je navrhnutý tak, aby bol **idempotentný** — spustenie viackrát nevedie k zlyhaniu. ### `remove-app.sh` Skript, ktorý zabezpečuje vymazanie všetkých vytvorených zdrojov: - vymaže Container App, ak existuje, - vymaže Container App Environment, ak existuje, - vymaže databázový server, ak existuje, - vymaže obraz z ACR, ak existuje. Podmienky overujú existenciu každého zdroja pred pokusom o jeho vymazanie. ## Ostatné súbory - `Dockerfile` – definuje obraz aplikácie, založený na `python:3.9-slim`, kopíruje kód, inštaluje závislosti a nastaví CMD. - `requirements.txt` – obsahuje zoznam Python knižníc: Flask, psycopg2-binary, atď. - `app.py` – samotná aplikácia (Flask server), obsahuje REST API aj HTML render. - `start-app.sh`, `stop-app.sh` – pomocné skripty pre lokálne spustenie. - `docker-compose.yml` – konfigurácia na spustenie aplikácie a databázy lokálne (nepovinné). ## Návod na spustenie v prehliadači Po úspešnom spustení `prepare-app.sh` aplikácia bude nasadená v Azure Container Apps. Presná URL bude vygenerovaná Azure službou a vyzerá napríklad takto: ``` https://userapp.randomhash.region.azurecontainerapps.io/ ``` Túto adresu je možné získať príkazom: ```bash az containerapp show --name userapp --resource-group userapp-rg --query properties.configuration.ingress.fqdn -o tsv ``` Po otvorení tejto adresy v prehliadači sa zobrazí frontend aplikácie. ## Podmienky pre spustenie skriptov ### `prepare-app.sh` - potrebné mať nainštalovaný **Azure CLI** (`az`) a byť prihlásený (`az login`), - musí byť prítomné prostredie s Dockerom a `psql` klientom (`sudo apt install postgresql-client`), - skript možno spustiť príkazom: ```bash chmod +x prepare-app.sh ./prepare-app.sh ``` ### `remove-app.sh` - vyžaduje prístup k tým istým zdrojom v Azure ako `prepare-app.sh`, - spustenie: ```bash chmod +x remove-app.sh ./remove-app.sh ``` ## Zoznam externých zdrojov a použitie generatívneho modelu Pri vytváraní dokumentácie a ladení skriptov bol použitý generatívny model **ChatGPT 4.0**, ktorý pomohol: - pri kontrole syntaxe Bash skriptov, - s optimalizáciou Azure CLI príkazov a ich poradie, - pri generovaní častí tejto dokumentácie. Všetky ostatné časti projektu (frontend, backend, Dockerfile, štruktúra aplikácie) boli vytvorené manuálne bez použitia šablón alebo generátorov.