CloudOps Dashboard is a beginner-friendly three-tier cloud engineering portfolio project. It gives you a practical way to showcase containerization, service separation, reverse proxying, persistent storage, health checks, role-based access control, and AWS-ready deployment thinking without turning the project into an enterprise-sized system.
The application helps teams track cloud services, environments, owners, and operational health through a clean dashboard:
- Presentation tier: static frontend served by
nginx - Application tier: Python
FastAPIAPI - Data tier: PostgreSQL
Recruiters hiring for cloud engineer and junior DevOps roles often want to see more than scripts. They want evidence that you can work across the application and infrastructure boundary. This project demonstrates:
- building and containerizing a Python API
- connecting application services to a managed data tier
- exposing an app through a reverse proxy
- using environment variables for configuration
- creating health-aware multi-container deployments
- writing a clear deployment runbook for AWS EC2
- Role-based login for
adminandcustomer - Cloud service tracking with environment, owner, endpoint, and operational notes
- Summary cards for total, healthy, warning, and critical services
- Admin-only service creation, update, and deletion
- Customer read-only dashboard for service visibility
- Persistent PostgreSQL storage through Docker volumes
- Health checks for database and API containers
- Simple REST API that is easy to explain in interviews
┌────────────────────────────┐
│ Recruiter UI │
│ Browser on :8080 │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Frontend / Presentation │
│ nginx + static assets │
│ proxies /api requests │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Application / Business │
│ Python FastAPI on :8000 │
│ routes + service layer │
└─────────────┬──────────────┘
│
▼
┌────────────────────────────┐
│ Data / Storage │
│ PostgreSQL 16 │
│ persisted by volume │
└────────────────────────────┘
.
├── backend
│ ├── app
│ ├── tests
│ ├── Dockerfile
│ └── requirements.txt
├── docs
├── frontend
│ ├── static
│ ├── Dockerfile
│ └── nginx.conf
├── docker-compose.yml
├── .env.example
└── README.md
If you want long beginner-friendly explanations, read these files:
docs/PROJECT_CODE_EXPLAINED.mddocs/DOCKER_AND_COMPOSE_EXPLAINED.mddocs/AWS_DEPLOYMENT_STEP_BY_STEP.md
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/health |
Health endpoint for the API |
POST |
/api/auth/login |
Login as admin or customer |
GET |
/api/auth/me |
Return the current authenticated user |
GET |
/api/services |
List tracked services for authenticated users |
POST |
/api/services |
Create a tracked service for admins |
PUT |
/api/services/{id} |
Update status, notes, or service details for admins |
DELETE |
/api/services/{id} |
Remove a tracked service for admins |
GET |
/api/summary |
Return dashboard summary counts for authenticated users |
Tracked statuses:
HealthyWarningCritical
cp .env.example .envdocker compose up --build- Frontend:
http://localhost:8080 - API docs:
http://localhost:8000/docs - API health:
http://localhost:8000/health
- Admin login:
admin/AdminPass123! - Customer login:
customer/CustomerPass123!
Change these defaults in .env before you deploy anywhere public.
docker compose downTo remove containers and keep database data:
docker compose downTo remove containers and wipe persisted PostgreSQL data:
docker compose down -vIf you want to run the tests outside Docker:
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pytestUse this exact sequence during a recruiter demo:
- Open the dashboard and explain the three-tier architecture.
- Log in as
customerand show the read-only visibility view. - Log out and sign in as
admin. - Add a service such as
API GatewayinProduction. - Show that it appears immediately in the list and updates the summary cards.
- Change the service from
HealthytoWarning. - Explain that the frontend talks to
nginx, which proxies API traffic to FastAPI, which then enforces role-based access. - Restart the stack and show that PostgreSQL data persists.
This project is intentionally designed to be easy to deploy on a single Linux VM, which is a strong beginner cloud engineer story.
- EC2 instance: Ubuntu 24.04 LTS
- Instance type:
t3.smallor higher - Security group:
- allow
22from your IP - allow
80from the internet - optionally allow
8080during testing only
- allow
- Launch an EC2 instance.
- SSH into the instance.
- Install Docker and Docker Compose plugin.
- Copy the project to the VM using
git cloneorscp. - Create the environment file:
cp .env.example .env- Update
.envwith a stronger database password and a uniqueAPP_SECRET. - Build and start the services:
docker compose up --build -d- Validate the deployment:
docker compose ps
curl http://localhost:8080
curl http://localhost:8000/health- Point a domain name to the EC2 public IP if needed.
- As a later improvement, place
nginxbehind an AWS Application Load Balancer or add TLS with Let's Encrypt.
- Docker-based application packaging
- Multi-container application design
- Reverse proxy configuration with
nginx - Role-based authentication and access control
- Persistent storage with PostgreSQL volumes
- Health checks and service readiness
- Environment-driven configuration
- Basic deployment readiness on AWS EC2
Stop the conflicting process or change the published ports in docker-compose.yml.
Check whether .env exists, whether DATABASE_URL matches the PostgreSQL credentials, and whether APP_SECRET is set.
Confirm the API container is healthy:
docker compose ps
docker compose logs apiDo not use docker compose down -v unless you want to delete the Postgres volume.
You can adapt these directly:
- Built a three-tier CloudOps Dashboard using
FastAPI,PostgreSQL,nginx, and Docker Compose to demonstrate service separation and deployment readiness. - Implemented role-based login with separate admin and customer experiences to demonstrate secure access patterns in a containerized Python stack.
- Containerized a Python application stack with health checks, persistent storage, reverse proxy routing, and protected API endpoints for local and VM-based deployment.
- Authored an AWS EC2 deployment runbook for a multi-container application, highlighting environment configuration and operational validation.
If you want to extend this project later, good recruiter-relevant upgrades are:
- add Terraform for EC2 provisioning
- add CI/CD with GitHub Actions
- add metrics with Prometheus and Grafana
- deploy behind an ALB with TLS