diff --git a/README.md b/z1/README.md similarity index 100% rename from README.md rename to z1/README.md diff --git a/backend/Dockerfile b/z1/backend/Dockerfile similarity index 100% rename from backend/Dockerfile rename to z1/backend/Dockerfile diff --git a/backend/server.js b/z1/backend/server.js similarity index 100% rename from backend/server.js rename to z1/backend/server.js diff --git a/docker-compose.yaml b/z1/docker-compose.yaml similarity index 100% rename from docker-compose.yaml rename to z1/docker-compose.yaml diff --git a/frontend/index.html b/z1/frontend/index.html similarity index 100% rename from frontend/index.html rename to z1/frontend/index.html diff --git a/frontend/style.css b/z1/frontend/style.css similarity index 100% rename from frontend/style.css rename to z1/frontend/style.css diff --git a/prepare-app.sh b/z1/prepare-app.sh similarity index 100% rename from prepare-app.sh rename to z1/prepare-app.sh diff --git a/remove-app.sh b/z1/remove-app.sh similarity index 100% rename from remove-app.sh rename to z1/remove-app.sh diff --git a/start-app.sh b/z1/start-app.sh similarity index 100% rename from start-app.sh rename to z1/start-app.sh diff --git a/stop-app.sh b/z1/stop-app.sh similarity index 100% rename from stop-app.sh rename to z1/stop-app.sh diff --git a/z2/README.md b/z2/README.md new file mode 100644 index 0000000..7055b1c --- /dev/null +++ b/z2/README.md @@ -0,0 +1,45 @@ +# ZKT Zadanie 2 - Kubernetes + +## Opis aplikacie +Aplikacia predstavuje TODO list, kde pouzivatel moze pridavat, upravovat a mazat ulohy. Data su ukladane do databazy +MongoDB. + +Aplikacia pozostava z backendu (Node.js) a databazy (MongoDB), ktore su nasadene v Kubernetes klastri. + +## Pouzite kontajnery +- Node.js (backend + frontend) +- MongoDB (databaza) + +## Kubernetes objekty +- Namespace – izolacia aplikacie +- Deployment – backend aplikacia +- StatefulSet – MongoDB databaza +- Service – komunikacia medzi komponentami +- PersistentVolume – trvale ulozisko +- PersistentVolumeClaim – poziadavka na ulozisko + +## Virtualne siete a zvazky +- Service "web-service" spristupnuje aplikaciu +- Service "mongo" umoznuje komunikaciu s databazou +- MongoDB pouziva volume /data/db + +## Konfiguracia kontajnerov +- backend bezi na porte 3000 +- MongoDB bezi na porte 27017 +- komunikacia prebieha cez nazvy sluzieb (mongo) + +## Spustenie + +./prepare-app.sh +./start-app.sh + +## Zastavenie + +./stop-app.sh + +## Pristup k aplikacii + +http://localhost:30007 + +## Poznamka +Aplikacia bola upravena zo zadania c.1 pre nasadenie do Kubernetes. diff --git a/z2/app/Dockerfile b/z2/app/Dockerfile new file mode 100644 index 0000000..27a2a2d --- /dev/null +++ b/z2/app/Dockerfile @@ -0,0 +1,11 @@ +FROM node:18 + +WORKDIR /app + +COPY . . + +RUN npm init -y && npm install express mongoose cors + +EXPOSE 3000 + +CMD ["node", "server.js"] diff --git a/z2/app/index.html b/z2/app/index.html new file mode 100644 index 0000000..4de4669 --- /dev/null +++ b/z2/app/index.html @@ -0,0 +1,83 @@ + + + + TODO LIST + + + + +
+

TODO List - Kubernetes

+ + + + + +
+
+ + + + diff --git a/z2/app/server.js b/z2/app/server.js new file mode 100644 index 0000000..51bc409 --- /dev/null +++ b/z2/app/server.js @@ -0,0 +1,59 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const cors = require('cors'); +const path = require('path'); + +const app = express(); + +app.use(express.json()); +app.use(cors()); + + +app.use(express.static(path.join(__dirname))); + +mongoose.connect('mongodb://mongo:27017/todo'); + +const Task = mongoose.model('Task', { + text: String, + due: String +}); + + +app.get('/', (req, res) => { + res.sendFile(path.join(__dirname, 'index.html')); +}); + + +app.get('/tasks', async (req, res) => { + const tasks = await Task.find(); + res.json(tasks); +}); + + +app.post('/tasks', async (req, res) => { + const task = new Task({ + text: req.body.text, + due: req.body.due + }); + await task.save(); + res.send("ok"); +}); + + +app.delete('/tasks/:id', async (req, res) => { + await Task.findByIdAndDelete(req.params.id); + res.send("deleted"); +}); + + +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/z2/app/style.css b/z2/app/style.css new file mode 100644 index 0000000..12eb1a9 --- /dev/null +++ b/z2/app/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/z2/k8s/deployment.yaml b/z2/k8s/deployment.yaml new file mode 100644 index 0000000..d16b220 --- /dev/null +++ b/z2/k8s/deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: web-deployment + namespace: my-app-ns +spec: + replicas: 2 + selector: + matchLabels: + app: web + template: + metadata: + labels: + app: web + spec: + containers: + - name: web + image: my-web-app + imagePullPolicy: Never + ports: + - containerPort: 3000 diff --git a/z2/k8s/namespace.yaml b/z2/k8s/namespace.yaml new file mode 100644 index 0000000..0c880a1 --- /dev/null +++ b/z2/k8s/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: my-app-ns diff --git a/z2/k8s/service.yaml b/z2/k8s/service.yaml new file mode 100644 index 0000000..0fe1058 --- /dev/null +++ b/z2/k8s/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: web-service + namespace: my-app-ns +spec: + type: NodePort + selector: + app: web + ports: + - port: 80 + targetPort: 3000 + nodePort: 30007 diff --git a/z2/k8s/statefulset.yaml b/z2/k8s/statefulset.yaml new file mode 100644 index 0000000..a0f2219 --- /dev/null +++ b/z2/k8s/statefulset.yaml @@ -0,0 +1,72 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: mongo-pv +spec: + capacity: + storage: 1Gi + accessModes: + - ReadWriteOnce + hostPath: + path: /data/mongo + +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mongo-pvc + namespace: my-app-ns +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + +--- +# 🔥 TOTO JE TEN DÔLEŽITÝ SERVICE +apiVersion: v1 +kind: Service +metadata: + name: mongo + namespace: my-app-ns +spec: + selector: + app: mongo + ports: + - port: 27017 + targetPort: 27017 + +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mongo + namespace: my-app-ns +spec: + serviceName: "mongo" + replicas: 1 + selector: + matchLabels: + app: mongo + template: + metadata: + labels: + app: mongo + spec: + containers: + - name: mongo + image: mongo + ports: + - containerPort: 27017 + volumeMounts: + - name: mongo-storage + mountPath: /data/db + volumeClaimTemplates: + - metadata: + name: mongo-storage + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi diff --git a/z2/prepare-app.sh b/z2/prepare-app.sh new file mode 100755 index 0000000..40e5d33 --- /dev/null +++ b/z2/prepare-app.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +echo "building docker image..." + +docker build -t my-web-app ./app + +echo "done" diff --git a/z2/start-app.sh b/z2/start-app.sh new file mode 100755 index 0000000..205b7e0 --- /dev/null +++ b/z2/start-app.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +echo "starting app..." + +kubectl apply -f k8s/namespace.yaml +kubectl apply -f k8s/statefulset.yaml +kubectl apply -f k8s/deployment.yaml +kubectl apply -f k8s/service.yaml + +echo "app started" diff --git a/z2/stop-app.sh b/z2/stop-app.sh new file mode 100755 index 0000000..2f3dab9 --- /dev/null +++ b/z2/stop-app.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +echo "stopping app..." + +kubectl delete -f k8s/service.yaml +kubectl delete -f k8s/deployment.yaml +kubectl delete -f k8s/statefulset.yaml +kubectl delete -f k8s/namespace.yaml + +echo "app stopped"