From 41d540476eb8ba296e851557e58d629d28e6b4a4 Mon Sep 17 00:00:00 2001 From: Tomas Ferko Date: Tue, 19 May 2026 20:28:07 +0000 Subject: [PATCH] final --- sk1/README.md | 281 ++++++++++++++++++++++++++++++++++++++++ sk1/backend/db.js | 8 +- sk1/backup/backup.sh | 6 +- sk1/docker-compose.yaml | 59 +++++---- sk1/frontend/src/App.js | 9 +- sk1/nginx/default.conf | 26 +++- 6 files changed, 350 insertions(+), 39 deletions(-) create mode 100644 sk1/README.md diff --git a/sk1/README.md b/sk1/README.md new file mode 100644 index 0000000..3598341 --- /dev/null +++ b/sk1/README.md @@ -0,0 +1,281 @@ +# Budget Tracker Cloud Application + +## URL aplikácie + +https://budgettomas.dedyn.io + +--- + +# O aplikácii + +Budget Tracker je webová aplikácia na správu príjmov a výdavkov. + +Funkcie: + +* pridávanie transakcií +* mazanie transakcií +* výpočet zostatku +* zobrazenie príjmov a výdavkov +* zabezpečené HTTPS pripojenie + +--- + +# Použité technológie + +* React frontend +* Node.js Express backend +* PostgreSQL databáza +* nginx reverse proxy +* Docker Compose +* Oracle Cloud Infrastructure +* Let's Encrypt HTTPS + +--- + +# Kontajnery + +Aplikácia používa 4 kontajnery: + +* frontend +* backend +* postgres +* nginx + +--- + +# Nasadenie aplikácie + +Spustenie aplikácie: + + +./prepare-app.sh + + +Zastavenie a odstránenie aplikácie: + +./remove-app.sh + +--- + +# Záloha databázy + +Vytvorenie zálohy databázy: + + +./backup.sh + + +Súbor zálohy: + + +backups/backup.sql + +--- + +# Environment premenné + +Citlivé údaje sú uložené v: + + +.env + + +Súbor .env je ignorovaný pomocou .gitignore. + +--- + +# HTTPS + +Aplikácia používa: + +* nginx reverse proxy +* Let's Encrypt SSL certifikát + +--- + +# Logy + +Zobrazenie nginx logov: + + +docker logs budget_nginx + +alebo: + +docker exec -it budget_nginx cat /var/log/nginx/access.log + + +--- + +# Trvalé úložisko + +Databáza používa Docker volume: + + +postgres_data: + + +--- + +# Automatický reštart + +Kontajnery používajú: + + +restart: always + + +--- + +# Cloud infraštruktúra + +Aplikácia je nasadená na Oracle Cloud Infrastructure pomocou Ubuntu Servera a Docker Compose. + +--- + +# Externé zdroje + +* Docker dokumentácia +* nginx dokumentácia +* PostgreSQL dokumentácia +* Oracle Cloud dokumentácia +* React dokumentácia +* Express.js dokumentácia +* Let's Encrypt dokumentácia + +--- + +# Analýza nákladov + +Predpoklady: + +* 1000 používateľov denne +* databáza alebo súbory veľkosti 50 GB + +Použité cloudové zdroje: + +| Zdroj | Cena | Fakturácia | +| ----------------------- | ------------- | ---------- | +| Oracle Cloud Compute VM | 0 € | mesačne | +| 50 GB storage | približne 5 € | mesačne | +| Verejná IP adresa | 0 € | mesačne | +| HTTPS certifikát | 0 € | ročne | +| DNS služba | 0 € | mesačne | + +Odhad ročných nákladov: + +| Položka | Cena | +| ---------------- | -------------------- | +| Compute VM | 0 € | +| Storage | približne 60 € ročne | +| HTTPS certifikát | 0 € | +| DNS | 0 € | +| Spolu | približne 60 € ročne | + +--- + +# Opis súborov + +| Súbor | Obsah | +| ------------------- | -------------------------------- | +| docker-compose.yaml | konfigurácia Docker kontajnerov | +| nginx/default.conf | nginx reverse proxy konfigurácia | +| backend/server.js | backend API | +| backend/db.js | pripojenie na databázu | +| frontend/src/App.js | React frontend | +| backup.sh | vytvorenie databázovej zálohy | +| prepare-app.sh | spustenie aplikácie | +| remove-app.sh | odstránenie aplikácie | +| .env | environment premenné | +| README.md | dokumentácia projektu | + +--- + +# Stručný opis konfigurácie + +Projekt používa Docker Compose na správu kontajnerov. + +nginx slúži ako reverse proxy a zabezpečuje HTTPS komunikáciu. + +Backend pomocou Node.js Express a komunikuje s PostgreSQL databázou. + +Frontend je vytvorený v Reacte. + + +--- + +# Návod na použitie aplikácie + +Aplikáciu je možné otvoriť vo webovom prehliadači: + + +https://budgettomas.dedyn.io + + +Používateľ môže pridávať a mazať transakcie a sledovať zostatok. + +--- + +# Návod na vykonanie zálohy + +Spustenie backup scriptu: + + +./backup.sh + + +Výsledný backup sa uloží do: + + +backups/backup.sql + + +--- + +# Návod na zobrazenie logov + +Zobrazenie nginx logov: + + +docker logs budget_nginx + + +alebo: + + +docker exec -it budget_nginx cat /var/log/nginx/access.log + +--- + +# Podmienky spustenia scriptov + +## prepare-app.sh + +Podmienky: + +* nainštalovaný Docker +* nainštalovaný Docker Compose +* Linux systém +* dostupný internet +* existujúci súbor .env + +Spustenie: + + +./prepare-app.sh + +--- + +## remove-app.sh + +Podmienky: + +* existujúce Docker kontajnery +* spustený Docker daemon + +Spustenie: + +./remove-app.sh + +--- + diff --git a/sk1/backend/db.js b/sk1/backend/db.js index 51fe44b..0bdb3cd 100644 --- a/sk1/backend/db.js +++ b/sk1/backend/db.js @@ -1,10 +1,10 @@ const { Pool } = require("pg"); const pool = new Pool({ - user: "budget_user", - host: "postgres", - database: "budget_db", - password: process.env.POSTGRES_PASSWORD, + user: process.env.DB_USER, + host: process.env.DB_HOST, + database: process.env.DB_NAME, + password: process.env.DB_PASSWORD, port: 5432, }); diff --git a/sk1/backup/backup.sh b/sk1/backup/backup.sh index 1392d31..dedc2a4 100755 --- a/sk1/backup/backup.sh +++ b/sk1/backup/backup.sh @@ -1,9 +1,7 @@ #!/bin/bash -DATE=$(date +%Y-%m-%d_%H-%M-%S) - mkdir -p backups -docker exec budget_postgres pg_dump -U budget_user budget_db > backups/backup_$DATE.sql +docker exec budget_postgres pg_dump -U postgres budget_db > backups/backup.sql -echo "backup created: backups/backup_$DATE.sql" +echo "backup completed" diff --git a/sk1/docker-compose.yaml b/sk1/docker-compose.yaml index d0e07dd..de22573 100644 --- a/sk1/docker-compose.yaml +++ b/sk1/docker-compose.yaml @@ -1,5 +1,36 @@ +version: '3.9' + services: + postgres: + image: postgres:16 + container_name: budget_postgres + restart: always + environment: + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_NAME} + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + + backend: + build: ./backend + container_name: budget_backend + restart: always + env_file: + - .env + ports: + - "5000:5000" + environment: + DB_HOST: ${DB_HOST} + DB_USER: ${DB_USER} + DB_PASSWORD: ${DB_PASSWORD} + DB_NAME: ${DB_NAME} + depends_on: + - postgres + frontend: build: ./frontend container_name: budget_frontend @@ -9,39 +40,17 @@ services: depends_on: - backend - backend: - build: ./backend - container_name: budget_backend - restart: always - env_file: - - .env - ports: - - "5000:5000" - depends_on: - - postgres - - postgres: - image: postgres:16 - container_name: budget_postgres - restart: always - environment: - POSTGRES_USER: budget_user - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: budget_db - volumes: - - postgres_data:/var/lib/postgresql/data - - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql - ports: - - "5432:5432" - nginx: image: nginx:latest container_name: budget_nginx restart: always ports: - "80:80" + - "443:443" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf + - ./nginx/certbot:/var/www/certbot + - /etc/letsencrypt:/etc/letsencrypt depends_on: - frontend - backend diff --git a/sk1/frontend/src/App.js b/sk1/frontend/src/App.js index abfc08e..81e3fb6 100644 --- a/sk1/frontend/src/App.js +++ b/sk1/frontend/src/App.js @@ -51,7 +51,7 @@ function App() { .filter(t => t.type === "expense") .reduce((acc, t) => acc + Number(t.amount), 0); - const balance = income - expenses; + const balance = (income - expenses).toFixed(2); return ( @@ -77,7 +77,7 @@ function App() {

Income

-

{income} €

+

{income.toFixed(2)} €

@@ -85,7 +85,7 @@ function App() {

Expenses

-

{expenses} €

+

{expenses.toFixed(2)} €

@@ -107,6 +107,7 @@ function App() { setAmount(e.target.value)} @@ -156,7 +157,7 @@ function App() {

{transaction.title}

-

{transaction.amount} €

+

{Number(transaction.amount).toFixed(2)} €

{new Date(transaction.created_at).toLocaleString()} diff --git a/sk1/nginx/default.conf b/sk1/nginx/default.conf index a0a3395..50da3d5 100644 --- a/sk1/nginx/default.conf +++ b/sk1/nginx/default.conf @@ -1,12 +1,34 @@ +server { + listen 80; + server_name budgettomas.dedyn.io; + + location /.well-known/acme-challenge/ { + root /var/www/certbot; + } + + location / { + return 301 https://$host$request_uri; + } +} + server { - listen 80; + listen 443 ssl; + server_name budgettomas.dedyn.io; + + ssl_certificate /etc/letsencrypt/live/budgettomas.dedyn.io/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/budgettomas.dedyn.io/privkey.pem; location / { proxy_pass http://frontend:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; } location /api/ { - proxy_pass http://backend:5000/; + rewrite ^/api/(.*)$ /$1 break; + proxy_pass http://backend:5000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; } }