# Battleship Web Application ## 1. Opis aplikácie **Battleship Web Application** je interaktívna hra „Battleship“, v ktorej hráči zadávajú svoje mená, umiestňujú lode a súperia proti sebe. Aplikácia je rozdelená do troch hlavných služieb: - **Frontend:** Poskytuje moderné webové rozhranie (na React-e), cez ktoré hráči vykonávajú svoje akcie. - **Backend:** Slúži ako serverová logika, ktorá spracováva požiadavky, komunikuje s databázou a riadi hernú logiku. - **Databáza (MySQL):** Ukladá trvalé dáta – informácie o hrách, výsledkoch a nastaveniach – s využitím persistent volume pre zabezpečenie dát aj po reštarte. --- ## 2. Zoznam použitých kontajnerov a ich stručný opis - **battleship_mysql:** Používa oficiálny Docker image `mysql:8.0.30`. Tento kontajner spúšťa MySQL databázu so základným nastavením (heslo, názov databázy) a využíva pripojený persistent volume pre trvalé ukladanie dát. - **battleship_backend:** Node.js aplikácia, ktorá poskytuje API pre hru, spracováva logiku aplikácie a komunikuje s databázou. Builduje sa z Dockerfile umiestneného v priečinku `./backend`. - **battleship_frontend:** Webová aplikácia postavená na React-e, ktorá umožňuje interakciu hráčov s hrou. Builduje sa z Dockerfile umiestneného v priečinku `./frontend`. --- ## 3. Zoznam Kubernetes objektov a ich stručný opis - **Namespace (battleship-app):** Poskytuje izolované prostredie pre všetky vytvorené objekty súvisiace s aplikáciou. - **Deployment:** - *battleship-backend:* Deployment pre backend službu s 1 replikou, ktorý zabezpečuje prevádzku Node.js aplikácie. - *battleship-frontend:* Deployment pre frontend službu s 1 replikou, ktorý zabezpečuje dostupnosť webového rozhrania. - **StatefulSet (battleship-mysql):** Riadi nasadenie MySQL databázy s 1 replikou a využíva PersistentVolumeClaim na trvalé ukladanie dát. - **PersistentVolume (PV):** Definovaný zdroj pre uloženie dát databázy, typicky využívajúci `hostPath` alebo iný storage provisioner. - **PersistentVolumeClaim (PVC):** Požaduje úložný priestor pre MySQL databázu (1Gi), ktorý sa následne pripojí k objektu StatefulSet. - **Service:** - *mysql:* ClusterIP služba pre internú komunikáciu s databázou. - *backend:* NodePort služba pre prístup ku backend aplikácii. - *frontend:* NodePort služba pre prístup k webovému rozhraniu frontend aplikácie. --- ## 4. Opis virtuálnych sietí a pomenovaných zväzkov - **Virtuálna sieť (app-net):** V prostredí Docker (a Docker Compose) kontajnery bežia vo vymedzenej sieti `app-net`, čo umožňuje vzájomnú komunikáciu pomocou mien služieb. Ak sieť ešte neexistuje, príslušné skripty ju vytvoria. - **Pomenovaný zväzok (db_data):** Tento zväzok slúži pre uchovávanie dát databázy MySQL. Je pripojený do kontajnera na ceste `/var/lib/mysql` a zabezpečuje, že dáta pretrvávajú aj po reštarte alebo odstránení kontajnera. --- ## 5. Opis konfigurácie kontajnerov ### **MySQL** - **Image:** `mysql:8.0.30` - **Premenné prostredia:** - `MYSQL_ROOT_PASSWORD=somepassword` - `MYSQL_DATABASE=battleship` - **Port:** 3306 (mapovaný na localhost:3306 v Docker prostredí) - **Persistent Volume:** Pripojený pomenovaný zväzok (db_data) k `/var/lib/mysql` - **Sieť:** Všetky kontajnery komunikujú cez sieť `app-net` - **Reštart:** `unless-stopped` ### **Backend** - **Build:** Docker image sa vytvára pomocou Dockerfile umiestneného v priečinku `./backend`. - **Port:** 4000 (mapovaný na localhost:4000) - **Environment Variables:** - `DB_HOST=mysql` - `DB_PORT=3306` - `DB_USER=root` - `DB_PASSWORD=somepassword` - `DB_NAME=battleship` - **Závislosť:** Nastavená závislosť na MySQL službe (v docker-compose) cez `depends_on` - **Sieť:** `app-net` - **Reštart:** `unless-stopped` ### **Frontend** - **Build:** Docker image sa vytvára pomocou Dockerfile umiestneného v priečinku `./frontend`. - **Port:** 80 (mapovaný na localhost:3001) - **Závislosť:** Nastavená závislosť na backend službe (v docker-compose) cez `depends_on` - **Sieť:** `app-net` - **Reštart:** `unless-stopped` --- ## 6. Návod ako pripraviť, spustiť, pozastaviť a vymazať aplikáciu ### Príprava aplikácie **prepare-app.sh** Tento skript: - Vytvorí externú Docker sieť `app-net` (ak ešte neexistuje). - Zostaví Docker obrazy pre MySQL (ak je potrebný custom image), backend a frontend (na základe Dockerfile v príslušných adresároch). Spustenie: ```bash ./prepare-app.sh ``` ### Spustenie aplikácie **start-app.sh** Tento skript: - Spustí všetky kontajnery (MySQL, backend, frontend) pomocou príkazu `docker-compose up -d` (alebo príkazov pre Kubernetes, ak sa používa K8s). - Vypíše informácie o dostupnosti aplikácie. Spustenie: ```bash ./start-app.sh ``` ### Pozastavenie aplikácie **stop-app.sh** Tento skript: - Pozastaví všetky služby, pričom dáta v databáze (persistent volume) zostanú zachované. Spustenie: ```bash ./stop-app.sh ``` ### Odstránenie aplikácie **remove-app.sh** Tento skript: - Odstráni všetky vytvorené kontajnery, obrazy a (ak je použitý parameter `-v`) aj persistent volume. Spustenie: ```bash ./remove-app.sh ``` --- ## 7. Návod ako si pozrieť aplikáciu na webovom prehliadači - **Frontend:** Otvorte webový prehliadač a zadajte adresu: [http://localhost:3001](http://localhost:3001) - **Backend API:** API je dostupné na: [http://localhost:4000](http://localhost:4000) - **MySQL:** Pre pripojenie k databáze použite MySQL klienta a pripojte sa na: `localhost:3306`