Production-ready Spring Boot library management system with book rentals, holds/queue system, automated notifications, and multi-cloud deployment.
Live Demos:
- AWS ECS Fargate: http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com
- Render: https://iucat-library.onrender.com
graph LR
A[GitHub] --> B[GitHub Actions]
B --> C[Docker Hub]
B --> D[AWS ECR]
C --> E[Render]
D --> F[ECS Fargate]
E --> G[Spring Boot App]
F --> H[ALB]
H --> G
G --> I[Health Checks]
G --> J[Structured Logs]
G --> K[Prometheus Metrics]
# Clone and run
git clone https://github.com/gauri2029/iucat.git
cd iucat
./mvnw spring-boot:run
# Access at http://localhost:8080Test Credentials: abc / password123
- ✅ Book Rentals - 14-day loans with 2x extensions
- ✅ Holds/Queue System - Automatic queue management
- ✅ Advanced Search - AJAX filters, 100+ books
- ✅ Health Checks -
/actuator/health, liveness/readiness probes - ✅ Structured Logging - JSON logs with correlation IDs
- ✅ Prometheus Metrics - JVM, HTTP, database monitoring
- ✅ Multi-Cloud - AWS ECS Fargate + Render
- ✅ CI/CD - Automated deployment pipeline
Backend: Java 17, Spring Boot 3.5.6, Spring Data JPA
Frontend: Thymeleaf, HTML5, CSS3, JavaScript
Database: H2 (prod), SQLite (dev)
DevOps: Docker, GitHub Actions, AWS ECR/ECS/ALB, Render
Observability: Spring Actuator, Logback JSON, MDC Correlation IDs, Prometheus
- URL: http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com
- Architecture: Internet → ALB → ECS Service → Fargate Tasks
- Cluster:
iucat-cluster| Service:iucat-service - Deploy: Auto on push to
mainvia GitHub Actions - Cost: Free (AWS Free Tier - $100 credits)
Manual Deploy:
aws ecs update-service --cluster iucat-cluster --service iucat-service --force-new-deployment- URL: https://iucat-library.onrender.com
- Deploy: Auto on push to
main
curl http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com/actuator/health
curl http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com/actuator/health/liveness
curl http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com/actuator/health/readinesscurl -H "X-Correlation-ID: test-123" http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com/search
# Check logs for correlationId=test-123curl http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com/actuator/prometheusTest: 10 concurrent users, 2 minutes, 660 requests
| Metric | Result | Status |
|---|---|---|
| Success Rate | 100% | ✅ |
| Avg Response | 75ms | ✅ |
| P95 Response | 109ms | ✅ |
| Max Response | 278ms | ✅ |
| Requests/sec | 5.37 | ✅ |
Run Test:
brew install k6
k6 run load-test.jsWorkflow: Build → Test → Docker Build → Deploy
- Build & Test - Maven compile + JUnit tests
- Docker (Render) - Push to Docker Hub
- Docker (AWS) - Push to ECR
- Deploy Render - Webhook trigger
- Deploy ECS - Force new deployment with latest image
View: GitHub Actions
users (id, username, password, role)
books (id, isbn, title, author, available_copies, total_copies, publication_year, language, format, subject)
rentals (id, user_id, book_id, rental_date, due_date, return_date, status, extension_count, extension_limit)
holds (id, user_id, book_id, hold_date, expiration_date, status, queue_position)POST /login- AuthenticateGET /search?query={q}- Search booksGET /books/{id}- Book details
GET /my-rentals- List rentalsPOST /rent/{id}- Rent bookPOST /extend/{id}- Extend due datePOST /return/{id}- Return book
GET /my-holds- List holdsPOST /holds/place/{id}- Place holdPOST /holds/pickup/{id}- Pickup ready hold
GET /actuator/health- Health statusGET /actuator/health/liveness- Liveness probeGET /actuator/health/readiness- Readiness probeGET /actuator/prometheus- Prometheus metrics
# Unit tests
./mvnw test
# Load test
k6 run load-test.js
# Docker
docker build -t iucat-library .
docker run -p 8080:8080 iucat-libraryTest Flows:
- Login → Search → Rent → Extend (2x) → Return
- Rent all copies → Place hold → Return → Hold becomes ready → Pickup
- Search with filters → Verify AJAX updates
├── .github/workflows/ci-cd.yml # CI/CD pipeline
├── src/main/
│ ├── java/.../config/
│ │ └── CorrelationIdFilter.java
│ ├── resources/
│ │ ├── application-aws.properties
│ │ └── logback-spring.xml
├── Dockerfile
├── load-test.js
└── pom.xml
- Repo: github.com/gauri2029/iucat
- Live (AWS): http://iucat-alb-1688673649.us-east-1.elb.amazonaws.com
- Live (Render): https://iucat-library.onrender.com
- Pipeline: GitHub Actions