{"id":30453519,"url":"https://github.com/kevinthulnith/devops-project","last_synced_at":"2026-04-09T06:44:38.732Z","repository":{"id":310272745,"uuid":"1039025912","full_name":"kevinThulnith/devops-project","owner":"kevinThulnith","description":"Live reloading Inventory Management System with Redis and Web sockets + fully optimized to deploy with docker-compose","archived":false,"fork":false,"pushed_at":"2025-08-16T23:31:39.000Z","size":223,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-17T00:18:53.243Z","etag":null,"topics":["django","django-rest-framework","docker","docker-compose","javascript","jwt-authentication","nginx-proxy","nodejs","npm","postgresql","pythom","react","redis","tailwind","vite","websocket"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kevinThulnith.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-16T10:15:13.000Z","updated_at":"2025-08-16T22:47:27.000Z","dependencies_parsed_at":"2025-08-17T00:19:01.377Z","dependency_job_id":"f875a63c-0de3-4c3b-afe3-950ae541b249","html_url":"https://github.com/kevinThulnith/devops-project","commit_stats":null,"previous_names":["kevinthulnith/devops-project"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/kevinThulnith/devops-project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinThulnith%2Fdevops-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinThulnith%2Fdevops-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinThulnith%2Fdevops-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinThulnith%2Fdevops-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kevinThulnith","download_url":"https://codeload.github.com/kevinThulnith/devops-project/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kevinThulnith%2Fdevops-project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271755351,"owners_count":24815382,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-23T02:00:09.327Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","django-rest-framework","docker","docker-compose","javascript","jwt-authentication","nginx-proxy","nodejs","npm","postgresql","pythom","react","redis","tailwind","vite","websocket"],"created_at":"2025-08-23T16:00:55.528Z","updated_at":"2025-10-19T14:21:16.820Z","avatar_url":"https://github.com/kevinThulnith.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Django](https://img.shields.io/badge/Django-%23092E20.svg?logo=django\u0026logoColor=white)\n![DRF](https://img.shields.io/badge/Django_REST-FF1709?logo=django\u0026logoColor=white)\n![JWT](https://img.shields.io/badge/JWT-000000?logo=JSON%20web%20tokens)\n![PostgreSQL](https://img.shields.io/badge/PostgreSQL-316192?logo=postgresql\u0026logoColor=white)\n![Redis](https://img.shields.io/badge/Redis-DC382D?logo=redis\u0026logoColor=white)\n![Vite](https://img.shields.io/badge/Vite-646CFF?logo=vite\u0026logoColor=fff)\n![React](https://img.shields.io/badge/React-%2320232a.svg?logo=react\u0026logoColor=%2361DAFB)\n![Tailwind](https://img.shields.io/badge/Tailwind_CSS-38B2AC?logo=tailwind-css\u0026logoColor=white)\n![Axios](https://img.shields.io/badge/Axios-5A29E4?logo=axios\u0026logoColor=white)\n![NodeJS](https://img.shields.io/badge/Node.js-6DA55F?logo=node.js\u0026logoColor=white)\n![npm](https://img.shields.io/badge/npm-CB3837?logo=npm\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/Docker-2496ED?logo=docker\u0026logoColor=white)\n![Nginx](https://img.shields.io/badge/Nginx-009639?logo=nginx\u0026logoColor=white)\n\n# DevOps Project - Live Reloading Inventory Management System\n\nThe project includes a complete Docker Compose setup for easy deployment and development with version 3.0 configuration | **WebSocket** | **Live reloading**. With Django backend and React frontend styled with Tailwind CSS.\n\n\u003cimg src=\"diagram.png\" /\u003e\n\n## 🛠️ Tech Stack\n\n### 🐍 Backend\n\n- **Django 5.2+** - 🌐 Web framework\n- **Django REST Framework** - 🔧 API development\n- **Django Channels** - 📡 WebSocket support\n- **Daphne** - 🚀 ASGI server for WebSockets\n- **Redis** - 💾 Channel layer backend\n- **Simple JWT** - 🔐 Authentication\n- **Pillow** - 🖼️ Image processing\n\n### ⚛️ Frontend\n\n- **React 18+** - 🎨 UI library\n- **Vite 7.0+** - ⚡ Build tool and dev server\n- **Tailwind CSS** - 💅 Styling framework\n- **Framer Motion** - 🎬 Animations\n- **Axios** - 📬 HTTP client\n- **React Router** - 🗺️ Navigation\n- **JWT Decode** - 🔓 Token handling\n\n### 🗄️ Database \u0026 Infrastructure\n\n- **PostgreSQL** (production) or **SQLite** (development) - 📊 Database\n- **Redis** - 📡 WebSocket channel layer \u0026 caching\n- **WhiteNoise** - 📁 Static file serving\n\n### 🐳 DevOps \u0026 Deployment\n\n- **Docker** - 🐳 Containerization platform\n- **Docker Compose 3.0** - 🔧 Multi-container orchestration\n- **Nginx** - 🌐 Reverse proxy and load balancer\n- **Alpine Linux** - 🏔️ Lightweight container base images\n\n## 📋 Prerequisites\n\n### For Development (Local Setup)\n\n- **🐍 Python 3.13+**\n- **🟢 Node.js 16+** and npm\n- **🔴 Redis server** (for WebSocket channel layer)\n- **📝 Git**\n\n### For Docker Deployment\n\n- **🐳 Docker Engine 20.0+**\n- **🔧 Docker Compose 3.0+**\n- **📝 Git**\n\n## 🛠️ Development Environment Setup\n\n### 📁 Project Structure\n\n```\n📂 LR 3.0/\n├── 🔧 pyproject.toml          # Python dependencies \u0026 project config\n├── 🔒 uv.lock                 # Dependency lock file\n├── 📖 README.md               # Project documentation\n├── 📂 backend/                # Django application\n│   ├── 🗄️ db.sqlite3          # Development database\n│   ├── ⚙️ manage.py           # Django CLI\n│   └── 📂 api/                # Main API app\n└── 📂 frontend/               # React application\n    ├── 📦 package.json        # Node.js dependencies\n    ├── ⚡ vite.config.js       # Vite configuration\n    └── 🎨 tailwind.config.js  # Tailwind setup\n```\n\n### 🚀 Quick Start Commands\n\n#### Clone Git Repository\n\n```sh\ngit clone https://github.com/kevinThulnith/devops-project.git\n\n# Go to project directory\ncd devops-project\n\n# Go to main branch\ngit checkout main\n```\n\n#### Backend Setup 🔙\n\n- Create `.env` file in `backend/` directory and add this configuration:\n\n```env\nDEBUG=True\nREDIS_PORT=6379\nREDIS_HOST=127.0.0.1\nDATABASE_URL=sqlite:///db.sqlite3\nSECRET_KEY=\"your_secret_key_here_generate_a_secure_one\"\n```\n\n- **Redis Installation Required**: Install Redis on your local device for WebSocket functionality\n\n```powershell\n# If uv is not installed locally\npip install uv\n\n# Install Python dependencies\nuv sync\n\n# Activate virtual environment (Windows PowerShell)\n.\\.venv\\Scripts\\Activate.ps1\n\n# Navigate to backend directory\ncd backend\n\n# Run database migrations\npy .\\manage.py migrate\n\n# Start backend server with Daphne (ASGI server)\ndaphne -b 0.0.0.0 -p 8000 backend.asgi:application\n\n# Alternative: If virtual environment not activated\nuv run daphne -b 0.0.0.0 -p 8000 backend.asgi:application\n```\n\n#### Frontend Setup 🎨\n\n```powershell\n# Install Node.js dependencies\ncd frontend\nnpm i\n\n# Start development server with hot reload\nnpm run dev\n\n# Create production build files\nnpm run build\n\n# Start with network access (accessible from other devices)\nnpm run host\n```\n\n## 🧪 Testing WebSocket Functionality\n\nA test HTML file (`ws_test.html`) is included for WebSocket testing:\n\n1. 🚀 Start the Django server\n2. 🌐 Open `ws_test.html` in a browser\n3. ➕ Create/update/delete products in Django Admin\n4. 👀 See real-time updates in the test page\n\n## Production Setup - 🐳 Docker Deployment\n\nFor a complete containerized deployment with all services, check out the **`docker-compose`** branch which includes:\n\n- **🐍 Backend Container**: Django application with PostgreSQL support\n- **⚛️ Frontend Container**: React application served with Nginx\n- **🐘 PostgreSQL Database**: Fully configured database container\n- **🌐 Nginx Proxy**: Load balancer and reverse proxy\n- **🔴 Redis Server**: Cache and WebSocket channel layer\n\n## 🚀 Quick Docker Setup\n\n1. **📋 Prerequisites**:\n\n   - Docker Engine 20.0+\n   - Docker Compose 3.0+\n\n2. **⚙️ Environment Configuration**:\n\n   Create a `.env.prod` file in the project root:\n\n   ```env\n   # Database Configuration\n   POSTGRES_DB=devops_inventory\n   POSTGRES_USER=devops_user\n   POSTGRES_PASSWORD=your_secure_password\n   DATABASE_URL=postgresql://devops_user:your_secure_password@lr-database:5432/devops_inventory\n\n   # Django Configuration\n   DEBUG=False\n   DJANGO_SECRET_KEY=your-super-secret-key-here\n   ALLOWED_HOSTS=localhost,127.0.0.1,lr-backend\n\n   # Redis Configuration\n   REDIS_HOST=lr-redis\n   REDIS_PORT=6379\n   ```\n\n3. **🏃‍♂️ Start All Services**:\n\n   ```powershell\n   # Change branch\n   git checkout docker-compose\n\n   # In root dir\n   docker-compose up -d\n   ```\n\n4. **📊 Check Service Status**:\n\n   ```powershell\n   docker-compose ps\n   ```\n\n### 🌐 Service Access Points\n\n- **Frontend Application**: \u003chttp://localhost\u003e (via Nginx proxy)\n- **Backend API**: \u003chttp://localhost/api/\u003e (via Nginx proxy)\n- **Django Admin**: \u003chttp://localhost/admin/\u003e (via Nginx proxy)\n- **PostgreSQL Database**: localhost:5432\n- **Redis Cache**: localhost:6379\n\n### 🔧 Docker Services Overview\n\n| Service         | Description              | Image/Build              | Ports     | Dependencies      |\n| --------------- | ------------------------ | ------------------------ | --------- | ----------------- |\n| **lr-proxy**    | 🌐 Nginx reverse proxy   | `nginx:1.25-alpine-slim` | 80:80     | frontend, backend |\n| **lr-frontend** | ⚛️ React application     | Custom build             | 5173:5173 | -                 |\n| **lr-backend**  | 🐍 Django API server     | Custom build             | 8000:8000 | database, redis   |\n| **lr-database** | 🐘 PostgreSQL database   | `postgres:14-alpine`     | 5432:5432 | -                 |\n| **lr-redis**    | 🧠 Redis cache \u0026 pub/sub | `redis:7-alpine`         | 6379:6379 | -                 |\n\n## ✨ Features\n\n### 🎯 Core Functionality\n\n- **📦 Product Management**: CRUD operations for inventory items with image uploads\n- **⚡ Real-time Updates**: Live WebSocket connections for instant product changes\n- **🔐 User Authentication**: JWT-based auth with automatic token refresh\n- **📱 Responsive UI**: Modern React interface with Tailwind CSS and Framer Motion animations\n- **🔍 Advanced Filtering**: Search, category filtering, and sorting capabilities\n\n### ⚙️ Technical Features\n\n- **🛡️ Custom JWT WebSocket Middleware**: Secure WebSocket authentication using JWT tokens\n- **📡 Django Signals Integration**: Automatic real-time notifications on model changes\n- **🚧 Protected Routes**: Client-side route protection with automatic redirects\n- **🖼️ Image Handling**: Product image uploads with media file management\n- **🌐 CORS Support**: Configured for cross-origin frontend-backend communication\n\n### 🐳 DevOps Features\n\n- **🐳 Full Docker Containerization**: Complete multi-container setup with Docker Compose 3.0\n- **🌐 Nginx Reverse Proxy**: Load balancing and SSL termination ready\n- **📦 Multi-stage Builds**: Optimized Docker images for production deployment\n- **🔧 Environment Configuration**: Separate configurations for development and production\n- **📊 Service Orchestration**: Automated service dependency management\n- **💾 Persistent Data Volumes**: Configured volumes for database and Redis data persistence\n- **🔄 Health Checks**: Container health monitoring and automatic restarts\n- **🌍 Network Isolation**: Secure inter-service communication via Docker networks\n\n## 📚 API Documentation\n\n### 🔗 Main Endpoints\n\n| Method   | Endpoint                     | Description                 | Authentication           |\n| -------- | ---------------------------- | --------------------------- | ------------------------ |\n| `POST`   | `/api/user/register/`        | User registration           | ❌ Public                |\n| `POST`   | `/api/token/`                | User login (get JWT token)  | ❌ Public                |\n| `POST`   | `/api/token/refresh/`        | Refresh JWT token           | 🔐 Required              |\n| `POST`   | `/api/token/blacklist/`      | Logout (blacklist token)    | 🔐 Required              |\n| `GET`    | `/api/user/`                 | Get current user info       | 🔐 Required              |\n| `GET`    | `/api/products/`             | List all products           | 🔐 Required              |\n| `POST`   | `/api/products/`             | Create new product          | 🔐 Required              |\n| `GET`    | `/api/products/{id}/`        | Get product details         | 🔐 Required              |\n| `PUT`    | `/api/products/{id}/`        | Update product (full)       | 🔐 Required (Owner only) |\n| `PATCH`  | `/api/products/{id}/`        | Update product (partial)    | 🔐 Required (Owner only) |\n| `DELETE` | `/api/products/{id}/`        | Delete product              | 🔐 Required (Owner only) |\n| `GET`    | `/api/products/my_products/` | Get current user's products | 🔐 Required              |\n\n### 🔍 Product Filtering \u0026 Search\n\nThe `/api/products/` endpoint supports advanced filtering:\n\n| Parameter   | Description                    | Example                 |\n| ----------- | ------------------------------ | ----------------------- |\n| `search`    | Search in name and description | `?search=laptop`        |\n| `category`  | Filter by category             | `?category=electronics` |\n| `is_active` | Filter by active status        | `?is_active=true`       |\n| `ordering`  | Sort by fields                 | `?ordering=-created_at` |\n\n**Available Categories**: `books`, `other`, `sports`, `clothing`, `home`, `electronics`\n\n**Sortable Fields**: `name`, `price`, `quantity`, `created_at` (use `-` prefix for descending)\n\n### 🔌 WebSocket Endpoints\n\n| Endpoint        | Description               | Authentication  |\n| --------------- | ------------------------- | --------------- |\n| `/ws/products/` | Real-time product updates | 🔐 JWT Required |\n\n### 📋 Example API Usage\n\n```javascript\n// User Registration\nconst registerResponse = await fetch(\"/api/user/register/\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({\n    username: \"newuser\",\n    password: \"securepassword\",\n    email: \"user@example.com\",\n  }),\n});\n\n// User Login (Get JWT Token)\nconst loginResponse = await fetch(\"/api/token/\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ username: \"user\", password: \"pass\" }),\n});\n\nconst tokens = await loginResponse.json();\n// Response: { \"access\": \"...\", \"refresh\": \"...\" }\n\n// Get Current User Info\nconst userInfo = await fetch(\"/api/user/\", {\n  headers: { Authorization: `Bearer ${tokens.access}` },\n});\n\n// Create Product with Image\nconst productData = {\n  name: \"Gaming Laptop\",\n  description: \"High-performance gaming laptop with RGB keyboard\",\n  price: 1299.99,\n  quantity: 5,\n  category: \"electronics\",\n  is_active: true,\n};\n\nconst formData = new FormData();\nObject.keys(productData).forEach((key) =\u003e {\n  formData.append(key, productData[key]);\n});\n// Add image file\nformData.append(\"image\", imageFile);\n\nconst createResponse = await fetch(\"/api/products/\", {\n  method: \"POST\",\n  headers: { Authorization: `Bearer ${tokens.access}` },\n  body: formData,\n});\n\n// Search Products\nconst searchResponse = await fetch(\n  \"/api/products/?search=laptop\u0026category=electronics\u0026ordering=-created_at\",\n  {\n    headers: { Authorization: `Bearer ${tokens.access}` },\n  }\n);\n\n// Get My Products Only\nconst myProductsResponse = await fetch(\"/api/products/my_products/\", {\n  headers: { Authorization: `Bearer ${tokens.access}` },\n});\n\n// Refresh Token\nconst refreshResponse = await fetch(\"/api/token/refresh/\", {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application/json\" },\n  body: JSON.stringify({ refresh: tokens.refresh }),\n});\n\n// Logout (Blacklist Token)\nconst logoutResponse = await fetch(\"/api/token/blacklist/\", {\n  method: \"POST\",\n  headers: {\n    \"Content-Type\": \"application/json\",\n    Authorization: `Bearer ${tokens.access}`,\n  },\n  body: JSON.stringify({ refresh: tokens.refresh }),\n});\n```\n\n## 🐛 Troubleshooting\n\n### 🔴 Common Issues \u0026 Solutions\n\n#### **Backend Issues**\n\n| Problem                      | Solution                                    |\n| ---------------------------- | ------------------------------------------- |\n| 🚫 Redis connection failed   | Install and start Redis server locally      |\n| 🗄️ Database migration errors | Run `python manage.py migrate --run-syncdb` |\n| 🔐 JWT authentication fails  | Check SECRET_KEY in .env file               |\n| 📁 Static files not loading  | Run `python manage.py collectstatic`        |\n| 🌐 CORS errors               | Verify CORS_ALLOWED_ORIGINS in settings     |\n\n#### **Frontend Issues**\n\n| Problem                         | Solution                                                  |\n| ------------------------------- | --------------------------------------------------------- |\n| 📦 npm install fails            | Delete `node_modules` and `package-lock.json`, then retry |\n| ⚡ Vite dev server won't start  | Check if port 5173 is available                           |\n| 🔗 API connection refused       | Ensure backend is running on port 8000                    |\n| 🎨 Tailwind styles not applying | Run `npm run build` to regenerate CSS                     |\n\n#### **Docker Issues**\n\n| Problem                       | Solution                                             |\n| ----------------------------- | ---------------------------------------------------- |\n| 🐳 Container build fails      | Check Docker is running and has sufficient resources |\n| 🌐 Services can't communicate | Verify Docker network configuration                  |\n| 📊 Database connection fails  | Check environment variables in `.env.prod`           |\n| 💾 Volume mount errors        | Ensure proper file permissions                       |\n\n### 🔧 Debug Commands\n\n```powershell\n# Check backend logs\ndocker-compose logs lr-backend\n\n# Check database connection\npython manage.py dbshell\n\n# Test WebSocket connection\n# Open browser console and run:\n# const ws = new WebSocket('ws://localhost:8000/ws/products/');\n\n# Check Redis connection\nredis-cli ping\n\n# Verify environment variables\ndocker-compose config\n```\n\n## 🚀 Performance Optimization\n\n### ⚡ Backend Optimizations\n\n- **Database Indexing**: Add indexes to frequently queried fields\n- **Query Optimization**: Use `select_related()` and `prefetch_related()`\n- **Caching**: Implement Redis caching for frequently accessed data\n- **Image Optimization**: Compress uploaded images automatically\n\n### 🎨 Frontend Optimizations\n\n- **Code Splitting**: Implement React lazy loading for routes\n- **Image Optimization**: Use WebP format and responsive images\n- **Bundle Analysis**: Use `npm run build -- --analyze` to check bundle size\n- **Service Worker**: Implement PWA features for offline support\n\n## 🔒 Security Best Practices\n\n### 🛡️ Implemented Security Features\n\n- **JWT Authentication** with automatic token refresh\n- **CORS Configuration** for cross-origin requests\n- **Input Validation** on all API endpoints\n- **File Upload Security** with type and size restrictions\n- **Environment Variables** for sensitive configuration\n\n### 🔐 Additional Security Recommendations\n\n```powershell\n# Generate secure SECRET_KEY\npython -c \"from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())\"\n\n# Set strong database passwords\nopenssl rand -base64 32\n\n# Enable HTTPS in production\n# Update ALLOWED_HOSTS and SECURE_* settings\n```\n\n## 📊 Monitoring \u0026 Logging\n\n### 📈 Available Endpoints for Monitoring\n\n- **Django Admin**: `/admin/` - Administrative interface\n- **API Root**: `/api/` - API endpoint listing\n- **DRF Browsable API**: `/api-auth/` - Interactive API browser\n\n### 🔧 Manual Health Checks\n\n```powershell\n# Test database connection\ncd backend\npython manage.py dbshell\n\n# Test Redis connection (if Redis is running)\nredis-cli ping\n\n# Check Django application\ncurl http://localhost:8000/api/\n\n# Test WebSocket connection\n# Open browser console and run:\n# const ws = new WebSocket('ws://localhost:8000/ws/products/');\n```\n\n### 📝 Log Locations\n\n```\n📂 Logs/\n├── 🐍 Django: /app/logs/django.log\n├── 🌐 Nginx: /var/log/nginx/\n├── 🐳 Docker: docker-compose logs [service_name]\n└── 🔴 Redis: /var/log/redis/redis-server.log\n```\n\n## 🤝 Contributing\n\nWe welcome contributions! Please follow these steps:\n\n### 🔄 Development Workflow\n\n1. **🍴 Fork the repository**\n2. **🌿 Create a feature branch**\n   ```powershell\n   git checkout -b feature/amazing-feature\n   ```\n3. **💻 Make your changes**\n4. **✅ Run tests**\n\n   ```powershell\n   # Backend tests\n   cd backend\n   python manage.py test\n\n   # Frontend tests (if available)\n   cd frontend\n   npm test\n   ```\n\n5. **📝 Commit your changes**\n   ```powershell\n   git commit -m \"Add: Amazing new feature\"\n   ```\n6. **🚀 Push to your branch**\n   ```powershell\n   git push origin feature/amazing-feature\n   ```\n7. **📋 Open a Pull Request**\n\n### 📋 Code Style Guidelines\n\n- **Python**: Follow PEP 8 standards\n- **JavaScript**: Use ESLint configuration provided\n- **Commit Messages**: Use conventional commit format\n  - `feat:` for new features\n  - `fix:` for bug fixes\n  - `docs:` for documentation changes\n  - `style:` for formatting changes\n  - `refactor:` for code refactoring\n\n### 🧪 Testing Requirements\n\n- Write unit tests for new features\n- Ensure all existing tests pass\n- Test WebSocket functionality manually\n- Verify Docker deployment works\n\n## 📞 Support \u0026 Contact\n\n### 💬 Getting Help\n\n- **📧 Email**: [your-email@domain.com]\n- **🐛 Issues**: [GitHub Issues](https://github.com/kevinThulnith/lr-final/issues)\n- **💡 Discussions**: [GitHub Discussions](https://github.com/kevinThulnith/lr-final/discussions)\n\n### 📚 Additional Resources\n\n- **Django Documentation**: https://docs.djangoproject.com/\n- **React Documentation**: https://react.dev/\n- **Docker Documentation**: https://docs.docker.com/\n- **Tailwind CSS**: https://tailwindcss.com/docs\n\n## 📄 License\n\nThis project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.\n\n### 📜 MIT License Summary\n\n- ✅ Commercial use allowed\n- ✅ Modification allowed\n- ✅ Distribution allowed\n- ✅ Private use allowed\n- ❌ No warranty provided\n- ❌ No liability assumed\n\n## 🙏 Acknowledgments\n\n- **Django Team** for the amazing web framework\n- **React Team** for the powerful UI library\n- **Tailwind CSS** for the utility-first CSS framework\n- **Docker** for containerization technology\n- **Redis** for real-time functionality\n- **All Contributors** who helped improve this project\n\n## 📈 Project Statistics\n\n![GitHub stars](https://img.shields.io/github/stars/kevinThulnith/lr-final?style=social)\n![GitHub forks](https://img.shields.io/github/forks/kevinThulnith/lr-final?style=social)\n![GitHub issues](https://img.shields.io/github/issues/kevinThulnith/lr-final)\n![GitHub license](https://img.shields.io/github/license/kevinThulnith/lr-final)\n\n---\n\n**🎉 Happy Coding!** If you found this project helpful, please give it a ⭐ star on GitHub!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinthulnith%2Fdevops-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkevinthulnith%2Fdevops-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkevinthulnith%2Fdevops-project/lists"}