Skip to content

ak-127/sai-prj1

Repository files navigation

πŸš€ Django DevOps Project – CI/CD Pipeline on AWS

License: MIT Django Docker GitHub Actions

πŸ“Œ Project Overview

This project demonstrates a production-ready DevOps workflow for a Django web application using Docker, Jenkins CI/CD, and AWS EC2. The application is containerized and deployed using Docker Compose, with an automated CI/CD pipeline that handles build, test, and deployment.

Goal: To showcase real-world DevOps practices including containerization, CI/CD automation, cloud deployment, and infrastructure reliability.


πŸ— Architecture Overview

Developer β†’ GitHub β†’ Jenkins CI/CD β†’ Docker Build
                                 ↓
                           AWS EC2 Instance
                         (Docker + Compose)
                                 ↓
                      Django App + PostgreSQL

βš™οΈ Tech Stack

Category Technology
Backend Django (Python)
Database PostgreSQL
Containerization Docker, Docker Compose
CI/CD Jenkins
Cloud AWS EC2
OS Ubuntu Linux
Version Control Git & GitHub

πŸ” CI/CD Pipeline (Jenkins)

The Jenkins pipeline is triggered automatically on every code push to the main branch.

Pipeline Stages:

  1. Code Checkout – Pull latest code from GitHub
  2. Build Docker Images – Build Django & PostgreSQL containers
  3. Run Tests – Execute Django unit tests inside containers
  4. Push Changes – Update Docker images
  5. Deploy to AWS EC2 – Restart containers using Docker Compose

Key Benefits:

  • Zero manual deployment
  • Faster release cycles
  • Reduced human error
  • Production-like CI/CD workflow

🐳 Docker & Containerization

  • Django backend runs inside a Docker container
  • PostgreSQL runs as a separate container
  • Docker Compose manages multi-container orchestration
  • Environment variables handled via .env file

Services:

  • web – Django application
  • db – PostgreSQL database

☁️ AWS Infrastructure

  • EC2 Instance (Ubuntu)

  • Security Groups configured for:

    • SSH (22)
    • HTTP (80)
  • Docker & Docker Compose installed on EC2

  • Jenkins hosted locally / separate server


πŸ” Security Best Practices

  • Environment variables stored securely
  • .env file excluded using .gitignore
  • Database credentials not hardcoded
  • SSH key-based EC2 access
  • Jenkins credentials managed securely

▢️ How to Run Locally

git clone https://github.com/your-username/project-name.git
cd project-name
docker-compose up --build

Access the application:

http://localhost:8000

πŸ“ˆ Future Improvements

  • Add Kubernetes (EKS) deployment
  • Implement Terraform for IaC
  • Enable HTTPS using Nginx & SSL
  • Add monitoring (Prometheus + Grafana)
  • Blue-Green deployment strategy

High-Level Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Client Layer                             β”‚
β”‚  (Browsers, Mobile)                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
                             ↓ HTTP/HTTPS
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    AWS EC2 Instance                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚              Nginx Reverse Proxy                          β”‚  β”‚
β”‚  β”‚  β€’ SSL/TLS Termination                                    β”‚  β”‚
β”‚  β”‚  β€’ Load Balancing                                         β”‚  β”‚
β”‚  β”‚  β€’ Static/Media File Serving                              β”‚  β”‚
β”‚  β”‚  β€’ Compression (Gzip)                                     β”‚  β”‚
β”‚  └───────────┬───────────────────────────────────┬────────── β”˜  β”‚
β”‚              β”‚                                   β”‚              β”‚
β”‚              ↓ http://web:8000                   ↓              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚ Django Application   β”‚        β”‚ Static Files Volume  β”‚       β”‚
β”‚  β”‚ (Gunicorn WSGI)      β”‚        β”‚ /vol/web/static      β”‚       β”‚
β”‚  β”‚ β€’ Blog Management    β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚  β”‚ β€’ User Auth          β”‚                                       β”‚
β”‚  β”‚ β€’ Admin Panel        β”‚        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚                      β”‚        β”‚ Media Files Volume   β”‚       β”‚
β”‚  β”‚                      β”‚        β”‚ /vol/web/media       β”‚       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β”‚             β”‚                                                   β”‚
β”‚             ↓ psycopg2 tcp://db:5432                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚         PostgreSQL Database                              β”‚   β”‚
β”‚  β”‚  β€’ User Data                                             β”‚   β”‚
β”‚  β”‚  β€’ Blog Posts                                            β”‚   β”‚
β”‚  β”‚  β€’ Categories                                            β”‚   β”‚
β”‚  β”‚  β€’ Media Metadata                                        β”‚   β”‚
β”‚  β”‚  (Persistent Storage: postgres_data volume)              β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                 β”‚
β”‚              ↑ Jenkins CI/CD Deployment                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Backend Stack

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     Application Layer                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Django 5.0.6                            β”‚
β”‚  β€’ URL Routing (urls.py)                β”‚
β”‚  β€’ Views (views.py)                     β”‚
β”‚  β€’ Models (models.py)                   β”‚
β”‚  β€’ Forms (forms.py)                     β”‚
β”‚  β€’ Admin Interface (admin.py)           β”‚
β”‚  β€’ Middleware Stack                     β”‚
β”‚  β€’ Template Engine                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     WSGI Application Server             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Gunicorn 25.0.3                         β”‚
β”‚  β€’ Worker Pool (sync workers)           β”‚
β”‚  β€’ Request Threading                    β”‚
β”‚  β€’ Graceful Shutdown                    β”‚
β”‚  β€’ Bind: 0.0.0.0:8000                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚     Database Layer                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ PostgreSQL 15                           β”‚
β”‚  β€’ Psycopg2 Adapter                     β”‚
β”‚  β€’ Connection Pooling                   β”‚
β”‚  β€’ Transactions Support                 β”‚
β”‚  β€’ ACID Compliance                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Infrastructure Stack

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Container Orchestration      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Docker-Compose               β”‚
β”‚  β€’ Service Definition        β”‚
β”‚  β€’ Network Configuration     β”‚
β”‚  β€’ Volume Management         β”‚
β”‚  β€’ Environment Setup         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Containerization             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Docker                       β”‚
β”‚  β€’ Image Building            β”‚
β”‚  β€’ Container Management      β”‚
β”‚  β€’ Networking                β”‚
β”‚  β€’ Storage                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Cloud Infrastructure         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ AWS EC2                      β”‚
β”‚  β€’ Compute Instance          β”‚
β”‚  β€’ Security Groups           β”‚
β”‚  β€’ Elastic IPs               β”‚
β”‚  β€’ Storage (EBS)             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Network Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Default Docker Network             β”‚
β”‚ (saikrupa_default)                 β”‚
β”‚                                    β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚ β”‚ postgres β”‚  β”‚  web     β”‚         β”‚
β”‚ β”‚ (db)     β”‚  β”‚ (web)    β”‚         β”‚
β”‚ β”‚ 5432     β”‚  β”‚ 8000     β”‚         β”‚
β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜         β”‚
β”‚      β”‚             β”‚               β”‚
β”‚      └─────────────┼───────────────┼──┐
β”‚                    β”‚               β”‚  β”‚
β”‚             β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚  β”‚
β”‚             β”‚   nginx       β”‚      β”‚  β”‚
β”‚             β”‚  80, 443      β”‚      β”‚  β”‚
β”‚             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚  β”‚
β”‚                                    β”‚  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                        β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
    β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚   Host      β”‚
    β”‚ localhost   β”‚
    β”‚ Port 80     β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“– Full deployment setup: See DEPLOYMENT.md


Built with a focus on automation, reliability, and production-grade DevOps practices.

About

Real-world DevOps project implementing Jenkins CI/CD, Dockerized Django services, and AWS EC2 deployment

Topics

Resources

License

Stars

Watchers

Forks

Contributors