Upload files to "z2"

uploading necessaery files
This commit is contained in:
Somangsu Mukherjee 2026-04-20 21:31:47 +00:00
parent da9ad67534
commit 39530b2a80
13 changed files with 411 additions and 0 deletions

7
z2/Dockerfile Normal file
View File

@ -0,0 +1,7 @@
FROM node:18
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

236
z2/README.md Normal file
View File

@ -0,0 +1,236 @@
1. Application Description
This project is a simple full-stack web application deployed on Kubernetes.
It allows users to submit names through a web interface and store them in a PostgreSQL database.
The system consists of:
A frontend (static HTML interface)
A backend API built with Node.js (Express)
A PostgreSQL database running as a StatefulSet with persistent storage
The backend provides REST endpoints:
POST /add → adds a name to the database
GET /names → retrieves all stored names
2. Containers Used
Backend (Node.js)
Image: docker-app-backend:latest
Purpose: Handles API requests and communicates with the database
Database (PostgreSQL)
Image: postgres:15
Purpose: Stores application data persistently
3. Kubernetes Objects
Namespace
Name: myapp
Used to isolate all application resources
Deployment
Name: backend
Runs the Node.js backend
Ensures availability and automatic restart of the backend container
StatefulSet
Name: db
Runs PostgreSQL
Provides stable identity and persistent storage
PersistentVolume (PV)
Stores PostgreSQL data on node storage
PersistentVolumeClaim (PVC)
Automatically created via StatefulSet
Requests storage for database persistence
Services
backend-service (NodePort)
Exposes backend externally
Accessible at:
http://localhost:30007
db service (ClusterIP)
Enables internal communication between backend and database
Backend connects using hostname: db
4. Networking
Kubernetes DNS allows communication between differents components of the application using service names. Backend communicates with database using db and external users access backend via NodePort service
5. Persistent Storage
PostgreSQL uses:
PersistentVolume (PV) and PersistentVolumeClaim (PVC)
Using these ensures that data is not lost after pod restart and application state is preserved
6. Container Configuration
Backend
Port: 3000
Database connection:
Host: db
User: user
Password: password
Database: mydb
Database
Port: 5432
This uses persistent volume for data storage
7. Preparation
Build backend image:
docker build -t docker-app-backend ./backend
8. Deployment
Apply all Kubernetes resources:
kubectl apply -f namespace.yamlkubectl apply -f deployment.yamlkubectl apply -f service.yamlkubectl apply -f statefulset.yamlkubectl apply -f db-service.yaml
9. Checking Application Status
kubectl get all -n myappkubectl get pods -n myappkubectl get svc -n myapp
10. Accessing the Application
Backend API:
http://localhost:30007
Frontend:
Open frontend/index.html in a browser
11. Stopping the Application
kubectl delete -f deployment.yamlkubectl delete -f service.yamlkubectl delete -f statefulset.yamlkubectl delete -f db-service.yamlkubectl delete namespace myapp
12. Removing All Resources
kubectl delete namespace myapp
13. Used Resources
Kubernetes Documentation: https://kubernetes.io/docs/
Docker Documentation: https://docs.docker.com/
PostgreSQL Docker Image
Node.js Express Framework
14. Use of Artificial Intelligence
Artificial intelligence tools were used to:
Assist with debugging deployment issues
Improve configuration of Kubernetes objects
Help structure the project and documentation
All implementation, testing, and understanding were performed independently.
15. Summary
This project demonstrates:
Containerized web application architecture
Kubernetes Deployment and StatefulSet usage
Persistent storage with PVC
Internal service communication using DNS
External access using NodePort
The application is fully functional and can store and retrieve data using a Kubernetes-based backend and database. AI was use strictly for learninf concepts and debugging, all coding and implementation was done independently.

12
z2/db-service.yaml Normal file
View File

@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: db
namespace: myapp
spec:
selector:
app: db
ports:
- port: 5432
targetPort: 5432
clusterIP: None

23
z2/deployment.yaml Normal file
View File

@ -0,0 +1,23 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: myapp
spec:
replicas: 1
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend
image: docker-app-backend:latest
imagePullPolicy: Never
ports:
- containerPort: 3000

4
z2/init.sql Normal file
View File

@ -0,0 +1,4 @@
CREATE TABLE IF NOT EXISTS names (
id SERIAL PRIMARY KEY,
name TEXT
);

4
z2/namespace.yaml Normal file
View File

@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: myapp

10
z2/package.json Normal file
View File

@ -0,0 +1,10 @@
{
"name": "backend",
"version": "1.0.0",
"main": "server.js",
"dependencies": {
"express": "^4.18.2",
"pg": "^8.11.3",
"cors": "^2.8.5"
}
}

3
z2/prepare-app.sh Normal file
View File

@ -0,0 +1,3 @@
#!/bin/bash
echo "Preparing..."
docker build -t docker-app-backend ./backend

33
z2/server.js Normal file
View File

@ -0,0 +1,33 @@
const express = require("express");
const cors = require("cors");
const { Pool } = require("pg");
const app = express();
app.use(cors());
app.use(express.json());
const pool = new Pool({
host: "db",
user: "user",
password: "password",
database: "mydb",
port: 5432,
});
pool.query("CREATE TABLE IF NOT EXISTS names (id SERIAL PRIMARY KEY, name TEXT);");
app.post("/add", async (req, res) => {
const { name } = req.body;
await pool.query("INSERT INTO names(name) VALUES($1)", [name]);
res.send("Added");
});
app.get("/names", async (req, res) => {
const result = await pool.query("SELECT * FROM names");
res.json(result.rows);
});
app.listen(3000, () => console.log("Server running"));
app.get("/", (req, res) => {
res.send("Backend is running 🚀");
});

13
z2/service.yaml Normal file
View File

@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: backend-service
namespace: myapp
spec:
type: NodePort
selector:
app: backend
ports:
- port: 3000
targetPort: 3000
nodePort: 30007

7
z2/start-app.sh Normal file
View File

@ -0,0 +1,7 @@
#!/bin/bash
echo "Starting..."
kubectl apply -f namespace.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f statefulset.yaml

52
z2/statefulset.yaml Normal file
View File

@ -0,0 +1,52 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: db-pv
namespace: myapp
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
namespace: myapp
spec:
serviceName: "db"
replicas: 1
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: postgres
image: postgres:15
ports:
- containerPort: 5432
env:
- name: POSTGRES_USER
value: "user"
- name: POSTGRES_PASSWORD
value: "password"
- name: POSTGRES_DB
value: "mydb"
volumeMounts:
- name: db-storage
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: db-storage
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi

7
z2/stop-app.sh Normal file
View File

@ -0,0 +1,7 @@
#!/bin/bash
echo "Stopping..."
kubectl delete -f deployment.yaml
kubectl delete -f service.yaml
kubectl delete -f statefulset.yaml
kubectl delete namespace myapp