Nahrát soubory do „sk1“

This commit is contained in:
Tetiana Mohorian 2025-04-22 13:16:17 +00:00
parent af635d7601
commit faa936cd2d
10 changed files with 302 additions and 0 deletions

119
sk1/README.md Normal file
View File

@ -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á.

17
sk1/docker-compose.yaml Normal file
View File

@ -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

124
sk1/package-lock.json generated Normal file
View File

@ -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"
}
}
}

8
sk1/package.json Normal file
View File

@ -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"
}
}

4
sk1/prepare-app.sh Normal file
View File

@ -0,0 +1,4 @@
#!/bin/bash
echo "Príprava aplikácie..."
docker-compose build
echo "Aplikácia je pripravená!"

8
sk1/prepare-app.sh.save Normal file
View File

@ -0,0 +1,8 @@
#!/bin/bash
echo "Deploying backend..."
cd backend
railway up --service
echo "Deploying frontend..."
cd ../frontend
railway up

5
sk1/remove-app.sh Normal file
View File

@ -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á!"

4
sk1/start-app.sh Normal file
View File

@ -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"

4
sk1/stop-app.sh Normal file
View File

@ -0,0 +1,4 @@
#!/bin/bash
echo "Zastavenie aplikácie..."
docker-compose down
echo "Aplikácia bola zastavená!"

9
sk1/upload_model.py Normal file
View File

@ -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"
)