A complete production-grade cloud-native application demonstrating modern DevOps practices, GitOps workflows, and AWS EKS deployment.
- Overview
- Architecture
- Repository Structure
- Technology Stack
- Features
- Prerequisites
- Quick Start
- Detailed Setup
- Application Components
- Infrastructure Details
- GitOps Workflow
- CI/CD Pipeline
- Monitoring & Operations
- Security
- Troubleshooting
- Contributing
BIGRS is a modern task management application built with a microservices architecture, deployed on AWS EKS using GitOps principles. The project demonstrates industry best practices for cloud-native applications including:
- Infrastructure as Code (Terraform)
- GitOps deployment (ArgoCD)
- CI/CD automation (Jenkins)
- Container orchestration (Kubernetes)
- Secret management (External Secrets Operator)
- Automated image updates (ArgoCD Image Updater)
- TLS certificate management (cert-manager)
- High availability and auto-scaling
Live Application:
- Frontend: https://bigrs.app
- Backend API: https://api.bigrs.app
- ArgoCD: https://argocd.bigrs.app
- Jenkins: https://jenkins.bigrs.app
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AWS Cloud β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β VPC (Multi-AZ) β β
β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β Public Subnetβ β Public Subnetβ β Public Subnetβ β β
β β β (AZ-1) β β (AZ-2) β β (AZ-3) β β β
β β β β β β β β β β
β β β ββββββββββ β β ββββββββββ β β ββββββββββ β β β
β β β βNAT GW β β β βNAT GW β β β βNAT GW β β β β
β β β ββββββββββ β β ββββββββββ β β ββββββββββ β β β
β β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β β
β β β β β β β
β β ββββββββΌβββββββ βββββββββΌβββββββ ββββββββΌββββββββ β β
β β βPrivate Sub β βPrivate Sub β βPrivate Sub β β β
β β β (AZ-1) β β (AZ-2) β β (AZ-3) β β β
β β β β β β β β β β
β β β βββββββββββ β β βββββββββββ β β βββββββββββ β β β
β β β βEKS Nodesβ β β βEKS Nodesβ β β βEKS Nodesβ β β β
β β β βββββββββββ β β βββββββββββ β β βββββββββββ β β β
β β βββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β EKS Cluster Components β β
β β β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββ β β
β β β ArgoCD β β Jenkins β β Nginx β β Cert β β β
β β β β β β β Ingress β β Manager β β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ ββββββββββββ β β
β β β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ β β
β β β External β β Image β β ECR β β β
β β β Secrets β β Updater β β Token β β β
β β ββββββββββββββ ββββββββββββββ ββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Task Manager Application β β β
β β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββ β β β
β β β β Frontend β β Backend β β Redis β β MySQL β β β β
β β β β (Nginx) β β(Node.js) β β (Cache) β β (RDS) β β β β
β β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββ β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β ECR β β RDS MySQL β β Secrets β β
β β Repositoriesβ β Database β β Manager β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββ
β User β
ββββββ¬ββββββ
β
βΌ
ββββββββββββββββββββββββββββ
β Route53 / CloudFlare β
β DNS Resolution β
ββββββ¬ββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββ
β Network Load Balancer β
β (AWS NLB) β
ββββββ¬ββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββ
β NGINX Ingress β
β Controller β
β - TLS Termination β
β - Routing β
ββββββ¬ββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββ
βΌ βΌ βΌ
ββββββββββββ ββββββββββββββββ ββββββββββββββββββ
β Frontend β β Backend β β ArgoCD β
β (Nginx) ββββββββββββββββ (API) β β (GitOps) β
β β HTTP β β β β
β bigrs.appβ βapi.bigrs.app β βargocd.bigrs.appβ
ββββββββββββ ββββββββ¬ββββββββ ββββββββββββββββββ
β
ββββββββββββββΌβββββββββββββ
βΌ βΌ βΌ
βββββββββββ βββββββββββ βββββββββββ
β Redis β β MySQL β β Secrets β
β (Cache) β β (RDS) β β Manager β
βββββββββββ βββββββββββ βββββββββββ
The project is organized into three main repositories:
Contains all Terraform code for provisioning AWS infrastructure:
Infrastructure/
βββ terraform/
β βββ environment/
β β βββ dev/ # Development environment
β β β βββ main.tf
β β β βββ variables.tf
β β β βββ terraform.tfvars
β β β βββ outputs.tf
β β β βββ provider.tf
β β β βββ creds # AWS credentials (gitignored)
β β βββ prod/ # Production environment
β β βββ (same structure as dev)
β βββ modules/
β βββ vpc/ # Network infrastructure
β βββ eks/ # Kubernetes cluster
β βββ ecr/ # Container registry
β βββ iam/ # IAM roles & policies
β βββ rds/ # MySQL database
β βββ bastion/ # Bastion host (prod only)
β βββ argocd/ # ArgoCD bootstrap
βββ scripts/
β βββ bootstrap-argocd.sh # ArgoCD installation
β βββ cleanup-argocd.sh # ArgoCD cleanup
β βββ delete-nlb.sh # Load balancer cleanup
βββ argocd/
β βββ bootstrap-app.yaml # App of Apps config
βββ helm-values/
βββ argocd-values.yaml # ArgoCD customization
Key Features:
- Multi-AZ high availability
- Auto-scaling node groups
- Private subnet deployment
- Pod Identity (modern IRSA)
- S3 backend state management
- Automated cleanup scripts
Contains Kubernetes manifests and ArgoCD applications:
Platform/
βββ argo-apps/ # ArgoCD Application definitions
β βββ pre-apps.yaml # Prerequisites (wave -1)
β βββ cert-manager.yaml # TLS certificates (wave 0)
β βββ cert-manager-issuers.yaml # Let's Encrypt issuer (wave 1)
β βββ nginx-ingress-controller.yaml # Ingress controller (wave 2)
β βββ external-secrets-operator.yaml # Secret manager (wave 3)
β βββ external-secrets-app.yaml # Secret store config (wave 4)
β βββ jenkins-app.yaml # CI/CD server (wave 5)
β βββ image-updater-app.yaml # Auto updates (wave 6)
β βββ nodejs-app.yaml # Main application (wave 7)
β
βββ helm-values/ # Helm chart values
β βββ cert-manager-values.yaml
β βββ cluster_issuer.yaml
β βββ nginx-values.yaml
β βββ nginx-values-tf.yaml # Terraform-generated
β βββ jenkins-values.yaml
β βββ external-secrets-values.yaml
β βββ image-updater-values.yaml
β
βββ apps/ # Application manifests
βββ pre-apps/ # Bootstrap resources
β βββ nginx-ingress-contrller/
β βββ pre-jenkins/
β βββ pre-ESO/
β βββ ecr-token-refresher/
β βββ argocd-ingress.yaml
β
βββ external-secrets/ # Secret management
β βββ cluster-secretstore.yaml
β βββ secrets/
β βββ db-credentials.yaml
β
βββ nodejs-app/ # Task Manager app
βββ Backend/
β βββ backend-deployment.yaml
β βββ configmap.yaml
β βββ backend-ingress.yaml # api.bigrs.app
βββ Frontend/
β βββ frontend-deployment.yaml
β βββ ingress.yaml # bigrs.app
βββ Redis/
β βββ redis-deployment.yaml
βββ serviceaccount.yaml
βββ kustomization.yaml
Key Features:
- App of Apps pattern
- Sync wave ordering
- Multi-source applications
- Automated image updates
- Secret synchronization
- Network policies
Contains application source code:
nodejs_app/
βββ server.js # Express server
βββ package.json
βββ Dockerfile.backend
βββ Dockerfile.frontend
βββ Jenkinsfile # CI/CD pipeline
βββ docker-compose.yml # Local development
βββ docker-entrypoint.sh
βββ docker-entrypoint-frontend.sh
β
βββ config/ # Configuration
β βββ database.js # MySQL connection pool
β βββ redis.js # Redis client
β
βββ controllers/ # Business logic
β βββ taskController.js
β
βββ models/ # Data models
β βββ Task.js
β
βββ routes/ # API routes
β βββ tasks.js
β
βββ public/ # Frontend (SPA)
β βββ index.html
β βββ css/
β β βββ style.css
β βββ js/
β βββ app.js
β
βββ scripts/ # Utilities
β βββ init-db.js # Database initialization
β
βββ k8s/ # Kubernetes manifests
β βββ namespace.yaml
β βββ backend-deployment.yaml
β βββ frontend-deployment.yaml
β βββ redis-deployment.yaml
β βββ mysql-deployment.yaml
β βββ configmaps.yaml
β βββ secrets.yaml
β βββ persistent-volumes.yaml
β βββ ingress.yaml
β βββ deploy.sh
β
βββ nginx.conf # Frontend web server config
Key Features:
- RESTful API
- Redis caching
- MySQL persistence
- Health checks
- Docker multi-stage builds
- Horizontal pod autoscaling
- Cloud Provider: AWS
- IaC Tool: Terraform 1.5+
- Kubernetes: AWS EKS 1.31
- Container Registry: Amazon ECR
- Database: Amazon RDS MySQL 8.0
- Cache: Redis 7.0
- Load Balancer: AWS Network Load Balancer
- DNS: Route53 / CloudFlare
- Secrets: AWS Secrets Manager
- GitOps: ArgoCD 8.1.0
- CI/CD: Jenkins 2.528.1-lts-jdk21
- Ingress: NGINX Ingress Controller 4.14.0
- TLS: cert-manager 1.16.1 + Let's Encrypt
- Secret Management: External Secrets Operator 1.0.0
- Image Updates: ArgoCD Image Updater 0.14.0
- Package Manager: Helm 3.x
- Backend: Node.js 18 + Express.js 4.18
- Frontend: HTML5, CSS3, JavaScript (Vanilla) + Tailwind CSS
- Database ORM: mysql2 (Promise-based)
- Cache Client: redis 4.6
- Web Server: Nginx (Alpine)
- Version Control: Git + GitHub
- Container Runtime: Docker 25.x
- Container Orchestration: Docker Compose 2.x
- Code Editor: VS Code (recommended)
- CLI Tools: kubectl, helm, aws-cli, terraform
- β Task Management: Create, read, update, delete tasks
- β Status Tracking: Pending, In Progress, Completed
- β Priority Levels: Low, Medium, High
- β Due Dates: Track task deadlines
- β Statistics Dashboard: Real-time task metrics
- β Redis Caching: ~80% faster response times
- β Responsive UI: Mobile-friendly design
- β Real-time Updates: Live task synchronization
- ποΈ Multi-AZ Deployment: High availability across 3 AZs
- π Auto-scaling: HPA for both frontend and backend
- π Pod Identity: Secure AWS service access
- π Private Networking: Services in private subnets
- πΎ Persistent Storage: EBS volumes for stateful apps
- π Network Policies: Restricted pod-to-pod communication
- π Blue-Green Deployments: Zero-downtime updates
- π Resource Limits: CPU and memory constraints
- π GitOps Workflow: Declarative infrastructure
- π€ Automated CI/CD: Build, test, deploy pipeline
- πΌοΈ Automated Image Updates: Latest images auto-deployed
- π Secret Management: External Secrets Operator
- π TLS Certificates: Automated cert issuance/renewal
- π Health Monitoring: Liveness and readiness probes
- π¦ Container Scanning: ECR image vulnerability scans
- π§Ή Automated Cleanup: Resource lifecycle management
For Infrastructure Deployment:
- AWS CLI 2.x
- Terraform 1.5+
- kubectl 1.28+
- helm 3.x
- Git 2.x
For Application Development:
- Node.js 18+
- Docker 25.x
- Docker Compose 2.x
- MySQL 8.0 (for local development)
- Redis 7.0 (for local development)
AWS Account Setup:
- AWS account with appropriate permissions
- IAM user with programmatic access
- AWS credentials configured (
aws configure)
Required IAM Permissions:
- EC2 (VPC, Security Groups, etc.)
- EKS (Cluster management)
- ECR (Container registry)
- RDS (Database)
- IAM (Role management)
- S3 (Terraform state)
- Secrets Manager (Secret storage)
- EBS (Persistent volumes)
- ELB (Load balancers)
Estimated AWS Costs:
- EKS Control Plane: ~$73/month
- EC2 Instances (3x t3.medium): ~$90/month
- RDS MySQL (db.t3.micro): ~$15/month
- NAT Gateways (3x): ~$100/month
- Load Balancers: ~$20/month
- Total: ~$300/month (varies by usage)
- Domain name (e.g., bigrs.app)
- DNS management access (Route53 or CloudFlare)
- SSL/TLS certificate (automated via Let's Encrypt)
- GitHub account
- Personal Access Token (PAT) with repo permissions
- Three repositories created:
- Infrastructure
- Platform
- nodejs_app
# Clone all three repositories
git clone https://github.com/BIGRS-ITI/Infrastructure.git
git clone https://github.com/BIGRS-ITI/Platform.git
git clone https://github.com/BIGRS-ITI/nodejs_app.gitcd Infrastructure/terraform/environment/dev
# Create credentials file
cat > creds << EOF
[default]
aws_access_key_id = YOUR_AWS_ACCESS_KEY
aws_secret_access_key = YOUR_AWS_SECRET_KEY
EOF
chmod 600 creds# Edit terraform.tfvars
vim terraform.tfvarsMinimum required variables:
cluster_name = "bigrs-cluster"
aws_region = "us-east-1"
github_platform_repo = "BIGRS-ITI/Platform"
github_token = "ghp_your_github_token"# Initialize Terraform
terraform init
# Review plan
terraform plan
# Deploy (takes ~15-20 minutes)
terraform apply# Configure kubectl
aws eks update-kubeconfig --name bigrs-cluster --region us-east-1
# Verify access
kubectl get nodes
kubectl get pods -A# Check ArgoCD applications
kubectl get applications -n argocd
# Wait for all apps to be healthy
kubectl wait --for=condition=Healthy application --all -n argocd --timeout=600s
# Get ingress URLs
kubectl get ingress -A# Get ArgoCD admin password
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath='{.data.password}' | base64 -d
# Get Jenkins admin password
kubectl exec -n jenkins deployment/jenkins -- \
cat /run/secrets/additional/chart-admin-passwordAccess URLs:
- Task Manager: https://bigrs.app
- Backend API: https://api.bigrs.app
- ArgoCD UI: https://argocd.bigrs.app
- Jenkins: https://jenkins.bigrs.app
cd Infrastructure/terraform/environment/dev
# 1. Create AWS credentials
cat > creds << EOF
[default]
aws_access_key_id = YOUR_KEY
aws_secret_access_key = YOUR_SECRET
EOF
# 2. Configure variables
cat > terraform.tfvars << EOF
# Cluster Configuration
cluster_name = "bigrs-cluster"
eks_version = "1.31"
aws_region = "us-east-1"
# VPC Configuration
vpc_cidr = "10.0.0.0/16"
vpc_name = "bigrs-vpc"
subnets_config = {
public-1 = {
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
map_public_ip = true
}
public-2 = {
cidr_block = "10.0.2.0/24"
availability_zone = "us-east-1b"
map_public_ip = true
}
public-3 = {
cidr_block = "10.0.3.0/24"
availability_zone = "us-east-1c"
map_public_ip = true
}
private-1 = {
cidr_block = "10.0.11.0/24"
availability_zone = "us-east-1a"
map_public_ip = false
}
private-2 = {
cidr_block = "10.0.12.0/24"
availability_zone = "us-east-1b"
map_public_ip = false
}
private-3 = {
cidr_block = "10.0.13.0/24"
availability_zone = "us-east-1c"
map_public_ip = false
}
}
# ECR Configuration
repositories = {
backend = {
name = "bigrs-nodejs-app-backend"
description = "Backend API container"
}
frontend = {
name = "bigrs-nodejs-app-frontend"
description = "Frontend web application"
}
}
image_retention_count = 5
scan_on_push = true
image_tag_mutability = "MUTABLE"
# GitHub Configuration
github_platform_repo = "BIGRS-ITI/Platform"
github_token = "ghp_your_token_here"
# EKS Configuration
endpoint_private_access_var = true
endpoint_public_access_var = false
node_group_instance_type = "t3.medium"
# Environment
use_bastion = false
bastion_private_key_path = ""
environment = "dev"
EOF
# 3. Initialize and deploy
terraform init
terraform plan
terraform apply -auto-approveProduction includes a bastion host for secure access:
cd Infrastructure/terraform/environment/prod
# Additional production variables:
bastion_key_name = "bigrs-bastion-key"
bastion_instance_type = "t3.micro"
bastion_allowed_cidrs = ["YOUR_IP/32"]
enable_bastion_elastic_ip = true
use_bastion = true
bastion_private_key_path = "/path/to/bastion-key.pem"cd nodejs_app
# 1. Copy environment template
cp .env.example .env
# 2. Edit environment variables
vim .env
# 3. Start with Docker Compose
docker-compose up -d
# 4. Initialize database
docker-compose exec backend npm run init-db
# 5. Access application
open http://localhost:8080Environment Variables:
# Server
NODE_ENV=development
PORT=3000
# Database
DB_HOST=mysql
DB_PORT=3306
DB_USER=taskuser
DB_PASSWORD=taskpassword
DB_NAME=taskmanager
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
# Cache
CACHE_TTL=300
# Frontend
FRONTEND_URL=http://localhost:8080cd nodejs_app/k8s
# 1. Update image references
vim backend-deployment.yaml
vim frontend-deployment.yaml
# 2. Deploy resources
kubectl apply -f namespace.yaml
kubectl apply -f secrets.yaml
kubectl apply -f configmaps.yaml
kubectl apply -f persistent-volumes.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f redis-deployment.yaml
kubectl apply -f backend-deployment.yaml
kubectl apply -f frontend-deployment.yaml
kubectl apply -f ingress.yaml
# 3. Verify deployment
kubectl get all -n taskmanagerApplications are automatically deployed via ArgoCD after infrastructure provisioning.
Deployment Flow:
- Terraform deploys ArgoCD
- ArgoCD syncs from Platform repository
- Applications deployed in sync wave order:
- Wave -1: Pre-requisites (namespaces, etc.)
- Wave 0: cert-manager
- Wave 1: Cluster issuers
- Wave 2: NGINX Ingress
- Wave 3: External Secrets Operator
- Wave 4: External Secrets app
- Wave 5: Jenkins
- Wave 6: Image Updater
- Wave 7: Task Manager app
Location: nodejs_app/
Key Features:
- RESTful API endpoints
- MySQL database integration
- Redis caching layer
- Health check endpoints
- Request validation
- Error handling middleware
API Endpoints:
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/health |
Health check |
| GET | /api/tasks |
Get all tasks (with filters) |
| GET | /api/tasks/stats |
Get task statistics |
| GET | /api/tasks/:id |
Get task by ID |
| POST | /api/tasks |
Create new task |
| PUT | /api/tasks/:id |
Update task |
| DELETE | /api/tasks/:id |
Delete task |
| GET | /api/redis-stats |
Redis cache statistics |
| POST | /api/redis-reset |
Reset Redis cache |
Request Examples:
# Create task
curl -X POST https://api.bigrs.app/api/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Deploy to production",
"description": "Deploy v2.0 to EKS cluster",
"status": "pending",
"priority": "high",
"due_date": "2025-12-01"
}'
# Get all tasks
curl https://api.bigrs.app/api/tasks
# Filter by status
curl https://api.bigrs.app/api/tasks?status=in-progress
# Get statistics
curl https://api.bigrs.app/api/tasks/stats
# Health check
curl https://api.bigrs.app/api/healthResponse Format:
{
"success": true,
"count": 5,
"data": [
{
"id": 1,
"title": "Deploy to production",
"description": "Deploy v2.0 to EKS cluster",
"status": "pending",
"priority": "high",
"due_date": "2025-12-01",
"created_at": "2025-11-18T10:00:00.000Z",
"updated_at": "2025-11-18T10:00:00.000Z"
}
]
}Location: nodejs_app/public/
Key Features:
- Single Page Application (SPA)
- Responsive design (Tailwind CSS)
- Real-time task updates
- Redis cache statistics
- Toast notifications
- Task filtering
- Dark mode support
UI Components:
- Task cards with drag-and-drop (planned)
- Statistics dashboard
- Modal forms
- Filter buttons
- Redis stats viewer
MySQL (RDS)
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
status ENUM('pending', 'in-progress',