From faa936cd2d5fd83c73e39a0ac9847fc9f61f5c00 Mon Sep 17 00:00:00 2001 From: Tetiana Mohorian Date: Tue, 22 Apr 2025 13:16:17 +0000 Subject: [PATCH] =?UTF-8?q?Nahr=C3=A1t=20soubory=20do=20=E2=80=9Esk1?= =?UTF-8?q?=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sk1/README.md | 119 ++++++++++++++++++++++++++++++++++++++ sk1/docker-compose.yaml | 17 ++++++ sk1/package-lock.json | 124 ++++++++++++++++++++++++++++++++++++++++ sk1/package.json | 8 +++ sk1/prepare-app.sh | 4 ++ sk1/prepare-app.sh.save | 8 +++ sk1/remove-app.sh | 5 ++ sk1/start-app.sh | 4 ++ sk1/stop-app.sh | 4 ++ sk1/upload_model.py | 9 +++ 10 files changed, 302 insertions(+) create mode 100644 sk1/README.md create mode 100644 sk1/docker-compose.yaml create mode 100644 sk1/package-lock.json create mode 100644 sk1/package.json create mode 100644 sk1/prepare-app.sh create mode 100644 sk1/prepare-app.sh.save create mode 100644 sk1/remove-app.sh create mode 100644 sk1/start-app.sh create mode 100644 sk1/stop-app.sh create mode 100644 sk1/upload_model.py diff --git a/sk1/README.md b/sk1/README.md new file mode 100644 index 0000000..786b99b --- /dev/null +++ b/sk1/README.md @@ -0,0 +1,119 @@ +# Dokumentácia k nasadeniu webovej aplikácie + +## Podmienky na nasadenie a spustenie + +Na správne nasadenie a spustenie aplikácie je potrebné mať nainštalovaný nasledujúci softvér: + +- Operačný systém: Linux (testované na Ubuntu, ale môže fungovať aj na iných distribúciách) + +- Docker: Nástroj na kontajnerizáciu aplikácií + +- Docker Compose: Nástroj na orchestráciu viacerých kontajnerov + +Odporúčam overiť správnu inštaláciu spustením príkazov: + +```bash +docker --version +docker-compose --version +``` + +## Opis aplikácie + + +Táto aplikácia slúži na detekciu nenávistnej reči v textoch. Umožňuje používateľovi zadať ľubovoľný text prostredníctvom webového rozhrania, ktorý je následne odoslaný na spracovanie backendovej časti systému. Backend využíva trénovaný model strojového učenia založený na transformer architektúre (Hugging Face Transformers), ktorý vyhodnotí, či text obsahuje nenávistný obsah. + +Na základe výstupu modelu aplikácia: + +- označí text ako „nenávistný“ alebo „bezpečný“, + +- zobrazí výsledok používateľovi v prehľadnej forme, + +Táto aplikácia je jednoduchý webový systém, ktorý obsahuje frontendovú a backendovú časť: + +- Frontend: React aplikácia, ktorá poskytuje webové rozhranie pre používateľov. + +- Backend: API server napísaný vo Flask, ktorý spracováva textové dáta s pomocou modelu strojového učenia (Hugging Face Transformers). + + + +## Používané virtuálne siete a zväzky + +Aplikácia využíva Docker Compose na vytvorenie izolovanej siete a spravovanie dát. + +- Virtuálna sieť: Docker Compose automaticky vytvorí vlastnú sieť, ktorá zabezpečuje komunikáciu medzi frontendom a backendom. + +## Konfigurácia kontajnerov + +Aplikácia sa skladá z dvoch kontajnerov: + +- Frontend: + - Port: 5174:5174 + - Závislosť: backend (musí byť dostupný pre správne fungovanie frontendu) + - Automatické reštartovanie: always (zabezpečí opätovné spustenie v prípade výpadku) + - Vytvára sa zo súborov v priečinku frontend/ + +- Backend: + - Port: 5000:5000 + - Automatické reštartovanie: always + - API endpoint: + - POST /api/predict - prijíma JSON so vstupným textom a vracia klasifikáciu toxickosti. + - Používaná modelová knižnica: Hugging Face Transformers + - Obsahuje hlavné API aplikácie a spracováva požiadavky od frontendu + - Vytvára sa zo súborov v priečinku backend/ + +## Používané kontajnery + +V aplikácii sú použité tieto kontajnery: + +- Frontend: + - Technológia: React + - Poskytuje webové rozhranie aplikácie + - Beží na porte 5174 + +- Backend: + - Technológia: Python (FastAPI/Flask) + - Spracováva požiadavky z frontendu + - Beží na porte 5000 + +## Príručka pre nasadenie + +Na nasadenie aplikácie postupujte podľa nasledujúcich krokov: + +- Príprava aplikácie: + +```bash +./prepare-app.sh +``` +Tento krok vytvorí potrebné Docker obrazy a pripraví aplikáciu na spustenie. + +- Spustenie aplikácie: + +```bash +./start-app.sh +``` +Po spustení bude aplikácia dostupná na http://localhost:5174 + +Pozastavenie aplikácie: + +```bash +./stop-app.sh +``` +Tento príkaz zastaví všetky bežiace kontajnery bez ich odstránenia. + +Odstránenie aplikácie: + +```bash +./remove-app.sh +``` +Tento príkaz odstráni všetky vytvorené kontajnery a ich dáta. + +## Príklad použitia + +Po spustení aplikácie otvorte webový prehliadač a prejdite na http://localhost:5174. Na stránke by sa mala zobraziť webová aplikácia, ktorá komunikuje s backendom. + +Ak backend správne funguje, môžete skúsiť odoslať požiadavku cez terminál: + +```bash +curl -X POST http://localhost:5000/api/predict -H "Content-Type: application/json" -d '{"text": "Ahoj"}' +``` +Tento príkaz by mal vrátiť odpoveď z backendu, čo znamená, že komunikácia medzi frontendom a backendom je funkčná. diff --git a/sk1/docker-compose.yaml b/sk1/docker-compose.yaml new file mode 100644 index 0000000..4a26b77 --- /dev/null +++ b/sk1/docker-compose.yaml @@ -0,0 +1,17 @@ +version: '3.8' + +services: + frontend: + build: ./frontend + ports: + - "5174:5174" + depends_on: + - backend + restart: always + + backend: + build: ./backend + ports: + - "5000:5000" + restart: always + diff --git a/sk1/package-lock.json b/sk1/package-lock.json new file mode 100644 index 0000000..92bebc4 --- /dev/null +++ b/sk1/package-lock.json @@ -0,0 +1,124 @@ +{ + "name": "zkt25", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", + "react-icons": "^5.5.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", + "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", + "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", + "license": "MIT", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz", + "integrity": "sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==", + "license": "(CC-BY-4.0 AND MIT)", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + } + } +} diff --git a/sk1/package.json b/sk1/package.json new file mode 100644 index 0000000..82f2a3b --- /dev/null +++ b/sk1/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-brands-svg-icons": "^6.7.2", + "@fortawesome/react-fontawesome": "^0.2.2", + "react-icons": "^5.5.0" + } +} diff --git a/sk1/prepare-app.sh b/sk1/prepare-app.sh new file mode 100644 index 0000000..1166c00 --- /dev/null +++ b/sk1/prepare-app.sh @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Príprava aplikácie..." +docker-compose build +echo "Aplikácia je pripravená!" diff --git a/sk1/prepare-app.sh.save b/sk1/prepare-app.sh.save new file mode 100644 index 0000000..a5e3aca --- /dev/null +++ b/sk1/prepare-app.sh.save @@ -0,0 +1,8 @@ +#!/bin/bash +echo "Deploying backend..." +cd backend +railway up --service + +echo "Deploying frontend..." +cd ../frontend +railway up diff --git a/sk1/remove-app.sh b/sk1/remove-app.sh new file mode 100644 index 0000000..f86fb45 --- /dev/null +++ b/sk1/remove-app.sh @@ -0,0 +1,5 @@ +#!/bin/bash +echo "Odinštalovanie aplikácie..." +docker-compose down -v +docker rmi $(docker images -q) +echo "Aplikácia bola úplne vymazaná!" diff --git a/sk1/start-app.sh b/sk1/start-app.sh new file mode 100644 index 0000000..937ab79 --- /dev/null +++ b/sk1/start-app.sh @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Spustenie aplikácie..." +docker-compose up -d +echo "Aplikácia je k dispozícii na adrese http://localhost:5174" diff --git a/sk1/stop-app.sh b/sk1/stop-app.sh new file mode 100644 index 0000000..12cb832 --- /dev/null +++ b/sk1/stop-app.sh @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Zastavenie aplikácie..." +docker-compose down +echo "Aplikácia bola zastavená!" diff --git a/sk1/upload_model.py b/sk1/upload_model.py new file mode 100644 index 0000000..5e48b21 --- /dev/null +++ b/sk1/upload_model.py @@ -0,0 +1,9 @@ +from huggingface_hub import HfApi + +api = HfApi() + +api.upload_folder( + folder_path="backend/hate_speech_model/final_model", + repo_id="tetianamohorian/hate_speech_model", + repo_type="model" +)