diff --git a/z2/Dockerfile b/z2/Dockerfile new file mode 100644 index 0000000..ec9759a --- /dev/null +++ b/z2/Dockerfile @@ -0,0 +1,4 @@ +FROM mysql:latest + +# Copia el script SQL a la ubicación dentro del contenedor +COPY script.sql /docker-entrypoint-initdb.d/ \ No newline at end of file diff --git a/z2/README.md b/z2/README.md new file mode 100644 index 0000000..70fa2f6 --- /dev/null +++ b/z2/README.md @@ -0,0 +1,46 @@ +# Notes Manager Application + +This is a simple notes management application developed with php and sql and deployed in kubernetes that allows you to create, read, update, and delete notes easily and efficiently. + +## Key features + +- Create Notes: You can create new notes by specifying a title and content. +- List Notes: View all existing notes in the application. +- Update Notes: Modify the title or content of an existing note. +- Delete Notes: Remove notes that are no longer needed. + +## Technologies Used +- Backend: php container +- Frontend: HTML,CSS +- Database: mysql container e +- Containers: Docker +- Container Orchestrator: Kubernetes + +## Docker images and kubernetes object +- Images: + - php from -> rafasaez/php-sql-app image + - sql from -> rafasaez/sql-app images + +- kubernetes yaml(Inside kubernetes directory): + - mysql-service.yaml -> for the service of mysql + - php-service.yaml -> for the service of php + - mysqk-statefulset.yaml -> for the statefulset of mysql + - php-deployment.yaml -> for the deployment of php + - secret-sql-password -> for the secret object where mysql password is storage +## How to run de application +- Firs you need to install kubernetes on docker +- Go to docker desktop, go to settings, kubernetes and click on enable kubernetes +- Open your terminal +- Run the following + ```bash + bash prepare-app.sh + ``` +- Once is evry image created run the application + ```bash + bash start-app.sh + ``` +- Your application should be running on port 8080 in localhost +- If you want to finish the app just run: + ```bash + bash stop-app.sh + ``` diff --git a/z2/create.php b/z2/create.php new file mode 100644 index 0000000..c21016a --- /dev/null +++ b/z2/create.php @@ -0,0 +1,18 @@ +connect_errno) { + // Print the connection error message + echo "Failed to connect to MySQL: " . mysqli_connect_error(); + // You can also log the error message to a file or other logging mechanism + // error_log("Failed to connect to MySQL: " . mysqli_connect_error()); + exit(); // Exit the script if there's a connection error +} +if($_POST){ + $note = mysqli_real_escape_string($db,$_POST['note']);; + $query = "insert into nota (noteContent) values ('$note')"; + mysqli_query($db,$query); +} +mysqli_close($db); +header("Location:../index.php"); \ No newline at end of file diff --git a/z2/database.php b/z2/database.php new file mode 100644 index 0000000..492d3df --- /dev/null +++ b/z2/database.php @@ -0,0 +1,9 @@ +set_charset('utf8') + return $db; +} \ No newline at end of file diff --git a/z2/delete.php b/z2/delete.php new file mode 100644 index 0000000..a3575a7 --- /dev/null +++ b/z2/delete.php @@ -0,0 +1,20 @@ +connect_errno) { + // Print the connection error message + echo "Failed to connect to MySQL: " . mysqli_connect_error(); + // You can also log the error message to a file or other logging mechanism + // error_log("Failed to connect to MySQL: " . mysqli_connect_error()); + exit(); // Exit the script if there's a connection error +} + + +if($_POST){ + $noteID = $_POST['id'];; + $query = "delete from nota where id = $noteID"; + mysqli_query($db,$query); +} +mysqli_close($db); +header("Location:../index.php"); \ No newline at end of file diff --git a/z2/edit.php b/z2/edit.php new file mode 100644 index 0000000..7cb9be8 --- /dev/null +++ b/z2/edit.php @@ -0,0 +1,21 @@ +connect_errno) { + // Print the connection error message + echo "Failed to connect to MySQL: " . mysqli_connect_error(); + // You can also log the error message to a file or other logging mechanism + // error_log("Failed to connect to MySQL: " . mysqli_connect_error()); + exit(); // Exit the script if there's a connection error +} + + +if($_POST){ + $noteID = $_POST['id'];; + $note = mysqli_real_escape_string($db,$_POST['note']);; + $query = "UPDATE nota SET noteContent = '$note' where id = $noteID"; + mysqli_query($db,$query); +} +mysqli_close($db); +header("Location:../index.php"); \ No newline at end of file diff --git a/z2/index.php b/z2/index.php new file mode 100644 index 0000000..2b856bd --- /dev/null +++ b/z2/index.php @@ -0,0 +1,74 @@ +connect_errno) { + // Print the connection error message + echo "Failed to connect to MySQL: " . mysqli_connect_error(); + // You can also log the error message to a file or other logging mechanism + // error_log("Failed to connect to MySQL: " . mysqli_connect_error()); + exit(); // Exit the script if there's a connection error +} + +$getNotes = "select * from nota" ; +$notes = mysqli_query($db,$getNotes); +if(!$notes){ + echo "Error: " . mysqli_error($db); +} +mysqli_close($db); +?> + + + + + + + + Document + + +
+ +

Notes manager

+
+ + + +
+
+ +
+
+ + + + +
+ +
+ + +
+ +
+ + +
+ + +
+ + \ No newline at end of file diff --git a/z2/info.txt b/z2/info.txt new file mode 100644 index 0000000..403802d --- /dev/null +++ b/z2/info.txt @@ -0,0 +1,49 @@ +#Para que podamos coger la imagen creada de docker necesitamos subirla al repositorio +#Para ello creamos la imagen como +docker build -t rafasaez/nombre-repositorio +#luego mandamos la imagen a docker hub +docker push rafasaez/nombre-repositorio + +#objecto secreto +apiVersion: v1 +kind: Secret +metadata: + name: mysql-secret +type: Opaque +data: + #En base64 ponemos nuestra contraseña encriptada + password: base64_encoded_passwordecho + +#Para encriptar se encripta en base64 por default al usar secret +echo -n 'your_password' | base64 + + +#para iteractuar con la base de datos +kubectl exec -i mysql-0 -n z2 -- mysql -h mysql-service.z2.svc.cluster.local -P80 -u root -p password < sql/script.sql + + +#problemas +#Cuando añado la informacion de los volumenes de la configuracion inicial no funciona el state ful set +#en volumemounts + - name: init-scripts + mountPath: /docker-entrypoint-initdb.d + volumeClaimTemplates: + - metadata: + name: init-scripts + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi + + +#Funciona la app finalmente obte por meter la config de la base de datos directamente en el docker file para crear una nueva imagen de sql con la base configurada +#Volver a hacer lo de la ssh key + +#Conectar a la base de datos +#kubectl exec -it -n z2 mysql-0 -- mysql -u root -p notas +#Solo me deja entrar a mysql cuando ejecuto el comando de arriba +#Cuando hago delete namespace no se me guarda la informacion que tengo en la base de datos + +#cambiar a retain +kubectl patch pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}' \ No newline at end of file diff --git a/z2/mysql-service.yaml b/z2/mysql-service.yaml new file mode 100644 index 0000000..6cafef4 --- /dev/null +++ b/z2/mysql-service.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: mysql-service +spec: + selector: + app: mysql + ports: + - protocol: TCP + port: 3306 + targetPort: 3306 diff --git a/z2/mysql-statefulset.yaml b/z2/mysql-statefulset.yaml new file mode 100644 index 0000000..cbd118c --- /dev/null +++ b/z2/mysql-statefulset.yaml @@ -0,0 +1,39 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: mysql +spec: + serviceName: mysql-service + replicas: 1 + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - name: mysql + image: rafasaez/sql-app + ports: + - containerPort: 3306 + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-secret + key: password + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + #Crea los pv necerarios + volumeClaimTemplates: + - metadata: + name: mysql-persistent-storage + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi + \ No newline at end of file diff --git a/z2/php-deployment.yaml b/z2/php-deployment.yaml new file mode 100644 index 0000000..62c2ce1 --- /dev/null +++ b/z2/php-deployment.yaml @@ -0,0 +1,19 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: php +spec: + replicas: 1 + selector: + matchLabels: + app: php + template: + metadata: + labels: + app: php + spec: + containers: + - name: php + image: rafasaez/php-sql-app:latest + ports: + - containerPort: 80 \ No newline at end of file diff --git a/z2/php-service.yaml b/z2/php-service.yaml new file mode 100644 index 0000000..b1f2b16 --- /dev/null +++ b/z2/php-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: php-service +spec: + selector: + app: php + ports: + - protocol: TCP + port: 8080 + targetPort: 80 + type: LoadBalancer \ No newline at end of file diff --git a/z2/prepare-app.sh b/z2/prepare-app.sh new file mode 100644 index 0000000..ea8a3c1 --- /dev/null +++ b/z2/prepare-app.sh @@ -0,0 +1,4 @@ +docker build -t rafasaez/php-sql-app . +docker push rafasaez/php-sql-app +cd sql +bash prepare-sql.sh diff --git a/z2/prepare-sql.sh b/z2/prepare-sql.sh new file mode 100644 index 0000000..8d0afeb --- /dev/null +++ b/z2/prepare-sql.sh @@ -0,0 +1,2 @@ +docker build -t rafasaez/sql-app . +docker push rafasaez/sql-app diff --git a/z2/script.js b/z2/script.js new file mode 100644 index 0000000..06d7405 Binary files /dev/null and b/z2/script.js differ diff --git a/z2/script.sql b/z2/script.sql new file mode 100644 index 0000000..8c03acf --- /dev/null +++ b/z2/script.sql @@ -0,0 +1,7 @@ +create database notas; +use notas; + +CREATE TABLE nota ( + id INT AUTO_INCREMENT PRIMARY KEY, + noteContent VARCHAR(60) +); \ No newline at end of file diff --git a/z2/secret-sql-password.yaml b/z2/secret-sql-password.yaml new file mode 100644 index 0000000..9e34cf3 --- /dev/null +++ b/z2/secret-sql-password.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: Secret +metadata: + name: mysql-secret +type: Opaque +data: + password: cGFzc3dvcmQ= \ No newline at end of file diff --git a/z2/start-app.sh b/z2/start-app.sh new file mode 100644 index 0000000..56fde80 --- /dev/null +++ b/z2/start-app.sh @@ -0,0 +1,6 @@ +kubectl create namespace z2 +kubectl apply -f kubernetes/secret-sql-password.yaml -n z2 +kubectl apply -f kubernetes/mysql-statefulset.yaml -n z2 +kubectl apply -f kubernetes/mysql-service.yaml -n z2bas +kubectl apply -f kubernetes/php-deployment.yaml -n z2 +kubectl apply -f kubernetes/php-service.yaml -n z2 diff --git a/z2/stop-app.sh b/z2/stop-app.sh new file mode 100644 index 0000000..83617d8 --- /dev/null +++ b/z2/stop-app.sh @@ -0,0 +1 @@ +kubectl delete namespace z2 \ No newline at end of file diff --git a/z2/styles.css b/z2/styles.css new file mode 100644 index 0000000..3886c9d --- /dev/null +++ b/z2/styles.css @@ -0,0 +1,49 @@ +/* Utilities*/ +.button{ + display: inl; + color:white; + text-decoration: none; + font-weight: bold; + text-align: center; + padding: 1rem; + border-radius: 2rem; + text-transform: uppercase; + margin: 1rem 1rem; + border: none; +} +.greenButton{ + background-color: green; +} +.redButton{ + background-color: red; + width: -moz-available; +} +input[type="text"]{ + padding: 1rem; + border-radius: 2rem +} + +.contenedor{ + display: flex; + flex-direction: column; + align-items: center; +} +.note{ + background-color: bisque; + display: grid; + grid-template-columns: repeat(2,1fr); + align-items: center; + width: min-content; + padding:1rem; + border-radius: 2rem; + margin-top: 1rem; +} +.addNote{ + width: 20rem; +} +.editForm{ + display:none; +} +.contenido-and-edit{ + display: flex; +} \ No newline at end of file