Two-tier web server Setup & Deployment Strategy

Created an Nginx Reverse Proxy web server

About-Its a Simple To-Do web Application Built in Java SpringBoot and React
as per the Assignment Question For the web application consisting of a frontend and a single backend service in the same server we will be deploying our Application on the single Nginx & Reverse Proxy server(Backend service)

  1. Clone the Repository

     git clone https://github.com/alvinsenjaya/to-do-list-spring-boot-react.git
    
  2. Two separate folder for Backend And Frontend

  3. Install Nginx Web Server to host the frontend or Web Server

     sudo apt update 
     sudo apt install nginx
    
  4. Install NodeJs and Npm to Build The Frontend server

     curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
     source ~/.bashrc
    
     nvm install --lts
    
     node -e "console.log('Running Node.js ' + process.version)"
     #install node V.20 install successfully now below commands for dependency and build 
     npm install  # Install dependencies
     npm run build  # Build the production-ready optimized bundle
    

    Note- As per the Configuration First we will run our application on locallhost then will deploy on EC2 only build Files

  5. Build & Run Commands for both Backend And Frontend Server

     #for Frontend Server 
     npm install 
     npm run build 
     npm run production 
     # for Backend Server 
     # Install java 17 and maven go to that Backend Directory run following Command for Backend server 
     mvn clean 
     mvn install 
     # below is the SS for the Output
    

    Frontend Build Ready !

    Backend Build Ready ! wooho

    Check the localhost Application is working Fine

    Home Page

    we can see All URL starting with "api/" are directed to the Backend service as per the Requirement

Add New Todo App Page todo Successfully Added

View Todo Page Task added Successfully while communicating with Backend

  1. Nginx Reverse Proxy File available in

    cd etc/nginx/sites-available/

    Expected Output

Dockerfile for Backend & Frontend

FROM openjdk:17-oracle
WORKDIR /backend
COPY target/to-do-list-0.0.1-SNAPSHOT.jar /backend/app.jar
CMD ["java","-jar","app.jar"]
FROM ubuntu
# Install Nginx & dependencies
RUN apt-get update && \
    apt-get install -y nginx && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# Copy Nginx configuration
COPY nginx.conf /etc/nginx/nginx.conf
# Copy our frontend build files
COPY build /var/www/html/
# Expose port 80
EXPOSE 80
# Start Nginx service
CMD ["nginx", "-g", "daemon off;"]

Infrastructure Write-up

  1. EC2 Instance Configuration :
    Launch an EC2 instance using an appropriate instance type based on our application's resource requirements.

    Install Following Dependencies : or run ./dependencies.sh

    
     #!/bin/bash
    
     # Update package lists
     sudo apt update
    
     # Install Java 17
     sudo apt install -y openjdk-17-jdk
    
     # Install Maven
     sudo apt install -y maven
    
     # Install Node.js
     sudo apt install -y nodejs
    
     # Install Nginx
     sudo apt install -y nginx
    
     # Install Docker
     sudo apt install docker.io
    

Scalability

Auto Scaling: Implement auto-scaling policies to automatically adjust the number of EC2 instances based on metrics such as CPU utilization, memory usage, or incoming traffic.

Load Balancing: Introduce an Elastic Load Balancer (ELB) to distribute incoming traffic across multiple EC2 instances. This improves fault tolerance and handles sudden spikes in traffic effectively we for this deployment we can use Network load balancer because it has low latency compare to ALB.

Maintainability

Infrastructure as Code (IaC): Use tools like AWS CloudFormation or Terraform to define and manage the infrastructure as code. This allows for easy replication of the infrastructure across multiple environments and simplifies maintenance tasks.

Reliability

High Availability: Deploy the web application across multiple Availability Zones (AZs) to ensure high availability and fault tolerance

Monitoring and Alerting: Set up monitoring and alerting for key metrics such as server health, application performance, and infrastructure utilization Tools Like AWS Cloudwatch, Uptime-Kuma, Grafana etc.