commit 9fb1ac67afb43886e8dc0b9a8fa83b364648083e Author: tf545su Date: Wed Apr 8 21:35:23 2026 +0200 z1 docker app diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ef8802 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# TODO Docker aplikacia + +## Podmienky +- Linux +- Docker +- Docker Compose + +## Opis aplikacie +Jednoducha TODO aplikacia, kde moze pouzivatel: +- pridavat ulohy +- upravovat ich +- mazat ich +- nastavovat datum a cas + +## Sluzby +- frontend: nginx (port 8080) +- backend: Node.js (port 3000) +- databaza: MongoDB + +## Siet a volume +- siet: app_network +- volume: mongo_data (uchovanie dat) + +## Spustenie + +- Priprava: +./prepare-app.sh + + +- Spustenie: +.start-app.sh + + +- Aplikacia: +http://localhost:8080 + +- Zastavenie: +./stop-app.sh + + +- Odstranenie: +./remove-app.sh diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..c257f81 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18 + +WORKDIR /app + +COPY server.js . + +RUN npm init -y && npm install express mongoose cors + +CMD ["node", "server.js"] diff --git a/backend/server.js b/backend/server.js new file mode 100644 index 0000000..c814547 --- /dev/null +++ b/backend/server.js @@ -0,0 +1,50 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const cors = require('cors'); + +const app = express(); + +app.use(express.json()); +app.use(cors()); + +mongoose.connect('mongodb://db:27017/todo'); + +const Task = mongoose.model('Task', { + text: String, + due: String +}); + +// GET +app.get('/tasks', async (req, res) => { + const tasks = await Task.find(); + res.json(tasks); +}); + +// POST +app.post('/tasks', async (req, res) => { + const task = new Task({ + text: req.body.text, + due: req.body.due + }); + await task.save(); + res.send("ok"); +}); + +// DELETE +app.delete('/tasks/:id', async (req, res) => { + await Task.findByIdAndDelete(req.params.id); + res.send("deleted"); +}); + +// UPDATE +app.put('/tasks/:id', async (req, res) => { + await Task.findByIdAndUpdate(req.params.id, { + text: req.body.text, + due: req.body.due + }); + res.send("updated"); +}); + +app.listen(3000, () => { + console.log("Backend bezi na porte 3000"); +}); diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..7ef0011 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,36 @@ +services: + frontend: + image: nginx:latest + restart: always + ports: + - "8080:80" + volumes: + - ./frontend:/usr/share/nginx/html + depends_on: + - backend + networks: + - app_network + + backend: + build: ./backend + restart: always + ports: + - "3000:3000" + depends_on: + - db + networks: + - app_network + + db: + image: mongo:latest + restart: always + volumes: + - mongo_data:/data/db + networks: + - app_network + +volumes: + mongo_data: + +networks: + app_network: diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..8bfd0c0 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,86 @@ + + + + TODO App + + + + +
+

TODO List

+ + + + + +
+
+ + + + diff --git a/frontend/style.css b/frontend/style.css new file mode 100644 index 0000000..12eb1a9 --- /dev/null +++ b/frontend/style.css @@ -0,0 +1,65 @@ +body { + font-family: Arial; + background: #f4f6f8; + margin: 0; + padding: 0; +} + +.container { + background: white; + padding: 20px; + border-radius: 10px; + width: 400px; + margin: 50px auto; /* vycentrovanie */ + box-shadow: 0 0 10px rgba(0,0,0,0.1); +} + +h1 { + text-align: center; /* nadpis na stred */ +} + +input { + padding: 8px; + margin: 5px 0; + width: 100%; + box-sizing: border-box; +} + +button { + padding: 8px; + margin-top: 5px; + cursor: pointer; + width: 100%; +} + +#list { + margin-top: 15px; +} + +.task { + display: flex; + justify-content: space-between; + align-items: center; + background: #eee; + padding: 8px; + margin-top: 5px; + border-radius: 5px; +} + +.task span { + text-align: left; /* zarovnanie dolava */ +} + +.buttons button { + margin-left: 5px; +} + +.delete { + background: red; + color: white; +} + +.edit { + background: orange; + color: white; +} diff --git a/prepare-app.sh b/prepare-app.sh new file mode 100755 index 0000000..642dce7 --- /dev/null +++ b/prepare-app.sh @@ -0,0 +1,7 @@ +#!/bin/bash +echo "Preparing app..." + +docker network create app_network || true +docker volume create mongo_data || true + +docker compose build diff --git a/remove-app.sh b/remove-app.sh new file mode 100755 index 0000000..1675b77 --- /dev/null +++ b/remove-app.sh @@ -0,0 +1,9 @@ +#!/bin/bash +echo "Removing app..." + +docker compose down -v + +docker volume rm mongo_data || true +docker network rm app_network || true + +echo "Removed app." diff --git a/start-app.sh b/start-app.sh new file mode 100755 index 0000000..e56755b --- /dev/null +++ b/start-app.sh @@ -0,0 +1,6 @@ +#!/bin/bash +echo "Running app..." + +docker compose up -d + +echo "App bezi na: http://localhost:8080" diff --git a/stop-app.sh b/stop-app.sh new file mode 100755 index 0000000..223e484 --- /dev/null +++ b/stop-app.sh @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Stopping app..." + +docker compose down