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