Subir archivos a 'z2'
assigment 2
This commit is contained in:
parent
588a8e7352
commit
82401ec37f
4
z2/Dockerfile
Normal file
4
z2/Dockerfile
Normal file
@ -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/
|
46
z2/README.md
Normal file
46
z2/README.md
Normal file
@ -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
|
||||||
|
```
|
18
z2/create.php
Normal file
18
z2/create.php
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
require "config/database.php";
|
||||||
|
$db =conectarDB();
|
||||||
|
|
||||||
|
if ($db->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");
|
9
z2/database.php
Normal file
9
z2/database.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function conectarDB(){
|
||||||
|
$host = 'mysql-service';
|
||||||
|
//$host = 'mysql-service.z2.svc.cluster.local';
|
||||||
|
$db = mysqli_connect($host,'root','password','notas');
|
||||||
|
//$db->set_charset('utf8')
|
||||||
|
return $db;
|
||||||
|
}
|
20
z2/delete.php
Normal file
20
z2/delete.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
require "config/database.php";
|
||||||
|
$db =conectarDB();
|
||||||
|
|
||||||
|
if ($db->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");
|
21
z2/edit.php
Normal file
21
z2/edit.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
require "config/database.php";
|
||||||
|
$db =conectarDB();
|
||||||
|
|
||||||
|
if ($db->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");
|
74
z2/index.php
Normal file
74
z2/index.php
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
require "includes/config/database.php";
|
||||||
|
$db =conectarDB();
|
||||||
|
if ($db->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);
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="stylesheet" href="src/styles.css">
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
|
||||||
|
<title>Document</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="contenedor">
|
||||||
|
|
||||||
|
<h1>Notes manager</h1>
|
||||||
|
<form class="addNote"id="myForm" method="post" action="includes/create.php">
|
||||||
|
<label for="note"></label>
|
||||||
|
<input name="note" id="note" type="text">
|
||||||
|
<input class="button greenButton" type="submit" value="add">
|
||||||
|
</form>
|
||||||
|
<div class="notas">
|
||||||
|
<?php while($row=mysqli_fetch_array($notes)){?>
|
||||||
|
<div class="note">
|
||||||
|
<form action="includes/edit.php"class="contenido-and-edit" onsubmit="checkSubmit(event)" method="post">
|
||||||
|
<input type="text" class ="notaImpresa" name="note" value ="<?php echo $row['noteContent'] ?>" readonly>
|
||||||
|
<input type="hidden" name="id" value="<?php echo $row['id']?>">
|
||||||
|
<!--Edit button-->
|
||||||
|
<button class="button greenButton"><span class="material-symbols-outlined">edit</span></button>
|
||||||
|
</form>
|
||||||
|
<!--Delete button-->
|
||||||
|
<form action="includes/delete.php" method="post">
|
||||||
|
<input type="hidden" name="id" value="<?php echo $row['id']?>"> <!-- Aquí puedes poner el ID del elemento a eliminar -->
|
||||||
|
<button class="button redButton" type="submit" name="delete"> <span class="material-symbols-outlined">delete</span></button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<?php }?>
|
||||||
|
<script>
|
||||||
|
function checkSubmit(event) {
|
||||||
|
if(event.target.classList.contains("contenido-and-edit")){
|
||||||
|
var form = event.target;
|
||||||
|
var input = form.querySelector(".notaImpresa");
|
||||||
|
var editButton = form.querySelector(".button");
|
||||||
|
if (input.readOnly) {
|
||||||
|
event.preventDefault(); // Prevent form submission
|
||||||
|
input.readOnly=false;
|
||||||
|
editButton.querySelector(".material-symbols-outlined").innerText = "done";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
49
z2/info.txt
Normal file
49
z2/info.txt
Normal file
@ -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 <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
|
11
z2/mysql-service.yaml
Normal file
11
z2/mysql-service.yaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: mysql-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mysql
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 3306
|
||||||
|
targetPort: 3306
|
39
z2/mysql-statefulset.yaml
Normal file
39
z2/mysql-statefulset.yaml
Normal file
@ -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
|
||||||
|
|
19
z2/php-deployment.yaml
Normal file
19
z2/php-deployment.yaml
Normal file
@ -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
|
12
z2/php-service.yaml
Normal file
12
z2/php-service.yaml
Normal file
@ -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
|
4
z2/prepare-app.sh
Normal file
4
z2/prepare-app.sh
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
docker build -t rafasaez/php-sql-app .
|
||||||
|
docker push rafasaez/php-sql-app
|
||||||
|
cd sql
|
||||||
|
bash prepare-sql.sh
|
2
z2/prepare-sql.sh
Normal file
2
z2/prepare-sql.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
docker build -t rafasaez/sql-app .
|
||||||
|
docker push rafasaez/sql-app
|
BIN
z2/script.js
Normal file
BIN
z2/script.js
Normal file
Binary file not shown.
7
z2/script.sql
Normal file
7
z2/script.sql
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
create database notas;
|
||||||
|
use notas;
|
||||||
|
|
||||||
|
CREATE TABLE nota (
|
||||||
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
noteContent VARCHAR(60)
|
||||||
|
);
|
7
z2/secret-sql-password.yaml
Normal file
7
z2/secret-sql-password.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
metadata:
|
||||||
|
name: mysql-secret
|
||||||
|
type: Opaque
|
||||||
|
data:
|
||||||
|
password: cGFzc3dvcmQ=
|
6
z2/start-app.sh
Normal file
6
z2/start-app.sh
Normal file
@ -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
|
1
z2/stop-app.sh
Normal file
1
z2/stop-app.sh
Normal file
@ -0,0 +1 @@
|
|||||||
|
kubectl delete namespace z2
|
49
z2/styles.css
Normal file
49
z2/styles.css
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user