Cloud Deployment & CI/CD Pipeline for Full-Stack Applications
A containerized deployment pipeline on AWS EC2 with Docker, Nginx, and an automated GitHub Actions CI/CD workflow.
- Role
- Solo developer — infrastructure & DevOps
- Timeline
- 2025
- Status
- Completed — personal infrastructure project
- Team
- Solo project
Tools
Overview
A hands-on infrastructure project to practice production-grade deployment patterns: containerizing a full-stack application with Docker, serving it behind an Nginx reverse proxy on AWS EC2, and automating test-and-deploy on every push to main with GitHub Actions — with CloudWatch wired up for monitoring application health.
The Problem
I'd deployed side projects by SSHing in and running a manual pull more times than I'd like to admit. I wanted a repeatable, automated path from a push to a running container, using the same building blocks — Docker, Nginx, AWS — that show up in real production job descriptions.
Architecture
Build
GitHub Actions workflow builds a Docker image on every push to main and runs the test suite.
Registry
Image is tagged with the commit SHA and pushed to a container registry.
Deploy
A deploy step connects to the EC2 instance, pulls the new image, and restarts the container with a zero-downtime handoff.
Edge
Nginx on the EC2 host reverse-proxies traffic to the container and terminates TLS.
Observability
CloudWatch agents ship container and instance metrics; alarms notify on CPU/memory thresholds.
Key Features & My Role
- Containerized full-stack application deployed to AWS EC2 with Docker
- Nginx configured as a reverse proxy in front of the application
- Static assets served from S3 with least-privilege IAM roles
- Automated CI/CD pipeline via GitHub Actions — test and deploy on every push to main
- CloudWatch monitoring wired up for application health
Video Walkthrough
Video walkthrough coming soon
Outcomes & Results
- Cut manual deploy steps from roughly six commands down to a single push.
- Deploy time dropped from a few manual minutes to under 90 seconds, fully automated.
- Gave me a template I've since reused to bootstrap two other side projects' infrastructure.
Reflection
Getting the zero-downtime restart right took more iterations than I expected — my first version had a few seconds of dropped connections during redeploys. Learning to health-check before flipping traffic was the real lesson here, not the AWS console clicking.