A complete end-to-end DevOps assignment showcasing:
- Containerization (Docker)
- Orchestration (Docker Compose)
- CI/CD Pipeline (GitHub Actions)
- Cloud Deployment (AWS EC2 Ubuntu)
- Reverse Proxy Setup (Nginx)
- Full-stack MEAN Application (MongoDB, Express, Angular, Node.js)
This document contains:
- Step-by-step setup instructions
- Deployment workflow
- Infrastructure details
- Commands used
- Code changes made
- Required screenshots checklist
crud-dd-task-mean-app/
├── backend/
├── frontend/
├── docker-compose.yml # Local development
├── docker-compose.prod.yml # Production file for EC2
├── nginx/ (optional)
└── .github/workflows/deploy.yml
git clone https://github.com/Mr-DEVINE/discover-dollar-devops-mean-task.git
cd discover-dollar-devops-mean-taskcd backend
npm install
node server.jscd frontend
npm install
ng serve --port 8081- Visit: http://localhost:8081
docker compose up --build- Frontend → http://localhost:8081
- Backend → http://localhost:8080/api/tutorials
- MongoDB → localhost:27017
docker build -t mrdevine/discover-dollar-backend:latest ./backend
docker build -t mrdevine/discover-dollar-frontend:latest ./frontenddocker push mrdevine/discover-dollar-backend:latest
docker push mrdevine/discover-dollar-frontend:latest- Ubuntu 22.04 LTS
- t2.micro
- Allow ports: 22, 80, 8080, 8081 (8080 & 8081 optional)
sudo apt update
sudo apt install -y docker.io docker-compose gitgit clone https://github.com/Mr-DEVINE/discover-dollar-devops-mean-task.git
cd discover-dollar-devops-mean-tasksudo docker-compose -f docker-compose.prod.yml pull
sudo docker-compose -f docker-compose.prod.yml up -dsudo docker-compose -f docker-compose.prod.yml psContainers running:
- dd-mongo
- dd-backend (port 8080)
- dd-frontend (port 8081)
Access UI:
http://<EC2_PUBLIC_IP>:8081
sudo apt install -y nginxsudo nano /etc/nginx/sites-available/discover-dollarPaste:
server {
listen 80;
server_name _;
# Frontend
location / {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
}
# Backend
location /api/ {
proxy_pass http://127.0.0.1:8080/api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
}
}
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/discover-dollar /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxhttp://<EC2_PUBLIC_IP>
| Secret Name | Value |
|---|---|
| DOCKER_USERNAME | mrdevine |
| DOCKER_PASSWORD | Docker Hub password/token |
| SSH_USER | ubuntu |
| HOST_IP | EC2 public IP |
| SSH_PRIVATE_KEY | Contents of your .pem key |
(Full file already in repo)
Deployment logic:
- Build backend image → push to Docker Hub
- Build frontend image → push to Docker Hub
- SSH into EC2
- Stop old containers
- Pull latest images
- Start new containers
Updated in:
frontend/src/app/services/tutorial.service.ts
Old:
const baseUrl = 'http://localhost:8080/api/tutorials';
New:
const baseUrl = '/api/tutorials';
docker-compose.prod.yml:
backend:
image: mrdevine/discover-dollar-backend:latest
frontend:
image: mrdevine/discover-dollar-frontend:latest
Added container recreation in deploy.yml:
sudo docker-compose -f docker-compose.prod.yml down
sudo docker-compose -f docker-compose.prod.yml pull
sudo docker-compose -f docker-compose.prod.yml up -d --remove-orphans
After deployment, your app is fully accessible at:
http://<EC2_PUBLIC_IP>
Complete MEAN application with:
- Working CRUD
- Reverse proxy
- Fully automated CI/CD
- Cloud deployment
- Dockerized setup
Below are the screenshots required for submission.






