Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 26 additions & 12 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

name: Deploy Frontend

on:
push:
branches:
- main
- supuni-dev

jobs:
Expand All @@ -14,19 +14,30 @@ jobs:
- name: Checkout code
uses: actions/checkout@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: '18'

- name: Install dependencies
run: npm install

- name: Build Docker image
run: docker build -t frontend-app .
- name: Build frontend
run: npm run build

- name: Copy files to EC2
- name: Check build folder exists
run: |
if [ ! -d "build" ]; then
echo "❌ build folder not found. Check if 'npm run build' works."
exit 1
fi
- name: Copy build folder to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.FRONTEND_EC2_IP }}
username: ubuntu
key: ${{ secrets.FRONTEND_EC2_SSH_KEY }}
source: "./"
source: "build" # ✅ Changed from dist to build
target: "/home/ubuntu/frontend"

- name: Deploy on EC2 via SSH
Expand All @@ -35,9 +46,12 @@ jobs:
host: ${{ secrets.FRONTEND_EC2_IP }}
username: ubuntu
key: ${{ secrets.FRONTEND_EC2_SSH_KEY }}
timeout: 600s
command_timeout: 600s
script: |
cd frontend
docker build -t frontend-app .
docker stop frontend-app || true
docker rm frontend-app || true
docker run -d -p 80:80 --name frontend-app frontend-app
sudo apt-get update
sudo apt-get install -y nginx
sudo rm -rf /var/www/html/*
sudo cp -r /home/ubuntu/frontend/build/* /var/www/html/ # ✅ Changed dist → build
sudo systemctl restart nginx
echo "✅ Frontend deployed successfully!"
19 changes: 17 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,25 @@
FROM node:18-alpine AS build
FROM node:20-alpine AS build

# Set working directory
WORKDIR /app

# Copy all files
COPY . .

# Install dependencies
RUN npm install
RUN npm run build

# Increase memory limit and build the app
RUN NODE_OPTIONS="--max-old-space-size=4096" npm run build

# Use Nginx to serve the built app
FROM nginx:alpine

# Copy the build output to Nginx public directory
COPY --from=build /app/build /usr/share/nginx/html

# Expose port 80
EXPOSE 80

# Start Nginx
CMD ["nginx", "-g", "daemon off;"]
14 changes: 6 additions & 8 deletions src/Pages/Menu.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ export default function MenuPage() {
let list =
category && category !== "All"
? items.filter(
(it) => it.category?.toLowerCase() === category.toLowerCase()
)
(it) => it.category?.toLowerCase() === category.toLowerCase()
)
: [...items];

if (search.trim()) {
Expand Down Expand Up @@ -136,11 +136,10 @@ export default function MenuPage() {
<button
key={c}
onClick={() => setCategory(c)}
className={`rounded-xl px-4 py-2 text-sm font-medium transition-all border ${
c === category
className={`rounded-xl px-4 py-2 text-sm font-medium transition-all border ${c === category
? "bg-emerald-600 text-white border-emerald-600 shadow"
: "bg-white text-gray-700 border-gray-300 hover:bg-gray-50"
}`}
}`}
>
{c}
</button>
Expand Down Expand Up @@ -246,9 +245,8 @@ export default function MenuPage() {

{/* Toast */}
<div
className={`pointer-events-none fixed inset-x-0 bottom-6 flex justify-center transition-all duration-300 ${
toast ? "opacity-100 translate-y-0" : "opacity-0 translate-y-3"
}`}
className={`pointer-events-none fixed inset-x-0 bottom-6 flex justify-center transition-all duration-300 ${toast ? "opacity-100 translate-y-0" : "opacity-0 translate-y-3"
}`}
aria-live="polite"
>
<div className="pointer-events-auto rounded-xl bg-gray-900 text-white px-4 py-2 text-sm shadow-lg">
Expand Down
6 changes: 3 additions & 3 deletions src/Pages/forgot-pw.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const ForgotPW = () => {
const navigate = useNavigate();
const { openNotification } = useNotification();

const handleSubmit = async (values) => {
const handleSubmit = async (values) => {
setIsLoading(true);
try {
const response = await axios.post(
Expand Down Expand Up @@ -56,7 +56,7 @@ const handleSubmit = async (values) => {

useEffect(() => {
handleFormChange();
}, []);
});

return (
<div
Expand All @@ -79,7 +79,7 @@ const handleSubmit = async (values) => {

{/* Form */}
<div className="flex flex-col items-center w-full">
<Form
<Form
form={form}
layout="vertical"
className="w-[380px] sm:w-[400px]"
Expand Down
4 changes: 2 additions & 2 deletions src/Pages/reset-pw.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from "react";
import { useState, useEffect } from "react";
import { useSearchParams } from "react-router-dom";
import { Form, Input, Button, Typography, message } from "antd";
import { Form, Input, Button, Typography } from "antd";
import { LockOutlined } from "@ant-design/icons";
import bg from "../assets/fpw.png";
import { passwordFieldValidation } from "../helpers/PasswordValidation";
Expand Down
32 changes: 16 additions & 16 deletions terraform/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 49 additions & 0 deletions terraform/blendrush_f_key
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
1 change: 1 addition & 0 deletions terraform/blendrush_f_key.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCt8kfpI3iKDLL1s2TE218krlMdzjBGLyrKjCvtxHs4nneaOcJ5j9zopsn3cjQwnlfkSmFVZZR1+vBVzIhgrnCF/y/dsR/dOJKWyHfantE+f/U/cDPWxPqlyuw2HnHge00TVhlP9KlrCUFa+Kid6gceOpHJYkEkjbHCN9H3EFw/FliCMfKUa0cHY3pyX/ofZTh+RnOsAkJkgPp7Xb/LvbnjSycs8hefkXOsvqnZZ4q9l7DPbaT/s/zhJTNmbRKkGyWOMvoJZ/8tCYvXD0vZ/qhbZRx3ROPkYxnpgFhGlbnQSs3+fXna+wz15QRUIdlP6wZ4eDF5CF8Bk8qgE2vMBDA8Mgdmlt9ca7yaTwN2SePxk9z17YDFQ1CpHHlfP7CMQBWRU4eicSoOnPVUZQlGzWqbrPLDCCMbNVdFrp1AuqvJDHNVE2RJ3E/TIsHOPJuZTbSm8+sHLJeXalNoB3anPG1aWCA/xQvdO/EvdyScedzSuU9obQmI1e1j57VCEzyTitA7cP4ZG5Ya5wvxAQal4A0GXCodYCwVhRIhOrylkbJFri8sO84FIRc4ycEiyUbxlzYC/a/shogEhq7tFi+7rT1uwfT9FDVix6ALYTAz1MSEcAN7QjKXtvIGiyaGUAtjXlCp9PhLzN9Orx7fOgWB0C6/5/GfkPYiwRpG/44jSJzQfw== supuni@DESKTOP-KMFPTKS
1 change: 0 additions & 1 deletion terraform/frontend_key.pub

This file was deleted.

94 changes: 76 additions & 18 deletions terraform/main.tf
Original file line number Diff line number Diff line change
@@ -1,24 +1,74 @@
provider "aws" {
region = var.region
region = "us-east-1"
}

resource "aws_key_pair" "frontend_key" {
key_name = "frontend_key"
public_key = file("${path.module}/frontend_key.pub")
variable "region" {
default = "us-east-1"
}

variable "ami" {
default = "ami-053b0d53c279acc90" # Ubuntu 22.04 LTS
}

variable "instance_type" {
default = "t2.micro"
}

# 🔐 SSH Key Pair
resource "aws_key_pair" "blendrush_f_key" {
key_name = "blendrush_f_key"
public_key = file("${path.module}/blendrush_f_key.pub")
}

# 🌐 VPC
resource "aws_vpc" "main_vpc" {
cidr_block = "10.0.0.0/16"
}

# 📡 Internet Gateway
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main_vpc.id
}

# 🛣 Route Table
resource "aws_route_table" "public_rt" {
vpc_id = aws_vpc.main_vpc.id

route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
}

# 🌐 Public Subnet
resource "aws_subnet" "public_subnet" {
vpc_id = aws_vpc.main_vpc.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
}

# 🔗 Associate Subnet to Route Table
resource "aws_route_table_association" "public_assoc" {
subnet_id = aws_subnet.public_subnet.id
route_table_id = aws_route_table.public_rt.id
}

# 🔒 Security Group
resource "aws_security_group" "frontend_sg" {
name = "frontend-sg"
description = "Allow HTTP and SSH"

name = "frontend_sg"
description = "Allow SSH and HTTP"
vpc_id = aws_vpc.main_vpc.id

ingress {
description = "SSH"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

ingress {
description = "HTTP"
from_port = 80
to_port = 80
protocol = "tcp"
Expand All @@ -33,29 +83,37 @@ resource "aws_security_group" "frontend_sg" {
}
}

resource "aws_instance" "frontend_ec2" {
ami = var.ami
instance_type = var.instance_type
key_name = aws_key_pair.frontend_key.key_name
vpc_security_group_ids = [aws_security_group.frontend_sg.id]
# 💻 EC2 Instance
resource "aws_instance" "frontend_instance" {
ami = var.ami
instance_type = var.instance_type
key_name = aws_key_pair.blendrush_f_key.key_name
subnet_id = aws_subnet.public_subnet.id
associate_public_ip_address = true
vpc_security_group_ids = [aws_security_group.frontend_sg.id]

tags = {
Name = "FrontendAppInstance"
}

provisioner "remote-exec" {
inline = [
"sudo apt update -y",
"sudo apt install docker.io -y",
"sudo systemctl start docker",
"sudo usermod -aG docker ubuntu"
"sudo systemctl enable docker"
]

connection {
type = "ssh"
user = "ubuntu"
private_key = file("${path.module}/frontend_key")
private_key = file("${path.module}/blendrush_f_key")
host = self.public_ip
}
}
}

tags = {
Name = "Frontend-EC2"
}
# 🔎 Output the public IP
output "frontend_public_ip" {
value = aws_instance.frontend_instance.public_ip
}
4 changes: 2 additions & 2 deletions terraform/outputs.tf
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
output "frontend_public_ip" {
value = aws_instance.frontend_ec2.public_ip
output "blendrush_fd_public_ip" {
value = aws_instance.frontend_instance.public_ip
}
Loading
Loading