Skip to content

Commit 312ebce

Browse files
authored
Merge pull request #44 from satyam-code45/feat/dockerize-application
feat: dockerize the application
2 parents f2477b3 + 465a34a commit 312ebce

File tree

11 files changed

+1055
-7
lines changed

11 files changed

+1055
-7
lines changed

.dockerignore

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Dependencies
2+
node_modules/
3+
npm-debug.log*
4+
yarn-debug.log*
5+
yarn-error.log*
6+
# Note: package-lock.json is needed for npm ci in Docker
7+
8+
# Environment variables
9+
.env
10+
.env.local
11+
.env.*.local
12+
13+
# Logs
14+
logs/
15+
*.log
16+
17+
# Testing
18+
coverage/
19+
.nyc_output/
20+
21+
# IDE and editor files
22+
.vscode/
23+
.idea/
24+
*.swp
25+
*.swo
26+
*~
27+
.DS_Store
28+
29+
# Git
30+
.git/
31+
.gitignore
32+
.gitattributes
33+
34+
# CI/CD
35+
.github/
36+
.gitlab-ci.yml
37+
38+
# Docker
39+
Dockerfile
40+
docker-compose.yml
41+
.dockerignore
42+
43+
# Documentation
44+
README.md
45+
CHANGELOG.md
46+
LICENSE
47+
CODE_OF_CONDUCT.md
48+
49+
# Misc
50+
.husky/
51+
.commitlintrc*
52+
.eslintrc*
53+
.prettierrc*
54+
eslint.config.js
55+
commitlint.config.js
56+
*.md

.env.example

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
1-
# Example environment variables for RBAC app
1+
# Application Configuration
2+
NODE_ENV=production
23
PORT=5000
3-
MONGO_URI=mongodb://root:admin@localhost:27017/
4-
JWT_SECRET=your_jwt_secret_here
5-
RESEND_API_KEY=""
6-
CORS_URL=http://localhost:5173
4+
APP_PORT=5000
5+
6+
# MongoDB Configuration
7+
MONGO_ROOT_USERNAME=admin
8+
MONGO_ROOT_PASSWORD=admin123
9+
MONGO_DB_NAME=rbac_db
10+
MONGO_PORT=27017
11+
MONGO_URI=mongodb://admin:admin123@mongodb:27017/rbac_db?authSource=admin
12+
13+
# JWT Configuration
14+
JWT_SECRET=your_jwt_secret_key_change_in_production
15+
JWT_EXPIRE=7d
16+
17+
# CORS Configuration
18+
CORS_URL=http://localhost:3000
19+

.gitignore

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,33 @@
11
node_modules
22

3+
# Environment variables
34
.env
45
.env.*.local
56
.env.local
7+
.env.production
68

9+
# Build directories
710
/dist/
811
/build/
12+
13+
# Logs
14+
logs/
15+
*.log
16+
npm-debug.log*
17+
yarn-debug.log*
18+
yarn-error.log*
19+
20+
# IDE
21+
.vscode/
22+
.idea/
23+
*.swp
24+
*.swo
25+
*~
26+
27+
# OS
28+
.DS_Store
29+
Thumbs.db
30+
31+
# Docker volumes (if running locally)
32+
mongodb_data/
33+
mongodb_config/

DOCKERIZATION_SUMMARY.md

Lines changed: 268 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,268 @@
1+
# Dockerization Summary
2+
3+
## ✅ Completed Tasks
4+
5+
This document summarizes the Docker implementation for the RBAC application.
6+
7+
### 1. ✅ Dockerfile Creation
8+
9+
**File:** `Dockerfile`
10+
11+
**Features implemented:**
12+
13+
- Multi-stage build using `node:18-alpine` for smaller image size
14+
- Optimized for build caching (dependencies installed before copying source code)
15+
- Separate stages for development and production
16+
- Non-root user (`nodejs`) for enhanced security
17+
- Uses `dumb-init` for proper signal handling
18+
- Production image size optimized with production-only dependencies
19+
- Development stage includes hot reload with nodemon
20+
21+
**Security best practices:**
22+
23+
- Runs as non-root user (UID 1001, GID 1001)
24+
- Minimal attack surface with Alpine Linux
25+
- Separate build stages
26+
- No unnecessary files in final image
27+
28+
### 2. ✅ .dockerignore File
29+
30+
**File:** `.dockerignore`
31+
32+
**Excludes:**
33+
34+
- `node_modules/` (dependencies installed in container)
35+
- `.env` files (for security)
36+
- Log files
37+
- IDE/editor configurations
38+
- Git files
39+
- Documentation files
40+
- CI/CD configurations
41+
- Docker files themselves
42+
43+
**Benefits:**
44+
45+
- Smaller build context
46+
- Faster build times
47+
- Enhanced security (no sensitive files)
48+
- Reduced image size
49+
50+
### 3. ✅ Docker Compose Configuration
51+
52+
**File:** `docker-compose.yml`
53+
54+
**Services implemented:**
55+
56+
1. **MongoDB Service (`mongodb`)**
57+
- Official MongoDB 7 image
58+
- Persistent data with named volumes
59+
- Health checks implemented
60+
- Configurable credentials via environment variables
61+
- Exposed on port 27017 (configurable)
62+
63+
2. **Application Service (`app`)**
64+
- Production-ready Node.js service
65+
- Depends on MongoDB health check
66+
- Health check endpoint configured
67+
- Configurable via environment variables
68+
- Exposed on port 5000 (configurable)
69+
- Restart policy: `unless-stopped`
70+
71+
3. **Development Service (`app-dev`)**
72+
- Activated with `--profile dev` flag
73+
- Volume mounts for hot reload
74+
- Nodemon for automatic restart
75+
- Same configuration as production but with dev dependencies
76+
77+
**Volumes:**
78+
79+
- `mongodb_data` - MongoDB data persistence
80+
- `mongodb_config` - MongoDB configuration persistence
81+
82+
**Network:**
83+
84+
- Custom bridge network (`rbac-network`) for service isolation
85+
86+
**Features:**
87+
88+
- Service health checks
89+
- Automatic restart policies
90+
- Environment variable configuration
91+
- Profile-based service activation (dev/prod)
92+
- Service dependencies management
93+
94+
### 4. ✅ Environment Configuration
95+
96+
**File:** `.env.example`
97+
98+
**Variables configured:**
99+
100+
- `NODE_ENV` - Application environment
101+
- `PORT` - Application port
102+
- `MONGO_URI` - MongoDB connection string
103+
- `MONGO_ROOT_USERNAME` - Database username
104+
- `MONGO_ROOT_PASSWORD` - Database password
105+
- `MONGO_DB_NAME` - Database name
106+
- `JWT_SECRET` - JWT signing key
107+
- `JWT_EXPIRE` - Token expiration time
108+
- `CORS_URL` - CORS allowed origin
109+
110+
**Security notes:**
111+
112+
- Contains example/default values
113+
- Actual `.env` file is gitignored
114+
- Production values should be changed
115+
116+
### 5. ✅ Documentation
117+
118+
**Files created:**
119+
120+
1. **README.Docker.md** - Comprehensive Docker guide
121+
- Prerequisites
122+
- Quick start instructions
123+
- Detailed usage examples
124+
- Environment variable reference
125+
- Security best practices
126+
- Troubleshooting guide
127+
- Production deployment guidelines
128+
- Useful commands reference
129+
130+
2. **DOCKER_QUICK_REFERENCE.md** - Quick command reference
131+
- Common Docker commands
132+
- Docker Compose commands
133+
- Monitoring commands
134+
- Debugging commands
135+
- Database operations
136+
- Cleanup commands
137+
138+
3. **Updated README.md** - Added Docker section
139+
- Quick start with Docker
140+
- Link to detailed documentation
141+
- Feature highlights
142+
143+
### 6. ✅ Application Enhancements
144+
145+
**Changes made:**
146+
147+
1. **Health Check Endpoint**
148+
- Added `/api/auth/health` endpoint in `authRoutes.js`
149+
- Returns service status and timestamp
150+
- Used by Docker health checks
151+
152+
2. **Package.json Scripts**
153+
- Added `start` script for production
154+
- Added Docker convenience scripts:
155+
- `docker:build` - Build Docker image
156+
- `docker:up` - Start services
157+
- `docker:down` - Stop services
158+
- `docker:logs` - View logs
159+
- `docker:dev` - Start in development mode
160+
161+
3. **Updated .gitignore**
162+
- Added Docker-related ignores
163+
- Added log file patterns
164+
- Added IDE/OS-specific patterns
165+
166+
## 📊 Acceptance Criteria Status
167+
168+
| Criterion | Status | Implementation |
169+
| -------------------------------------------------------------- | ----------- | -------------------------------------------------------- |
170+
| Create Dockerfile with official Node.js image (node:18-alpine) | ✅ Complete | Multi-stage Dockerfile with Alpine Linux |
171+
| Optimize for build caching | ✅ Complete | Dependencies copied and installed before source code |
172+
| Create .dockerignore file | ✅ Complete | Excludes node_modules, .env, logs, and unnecessary files |
173+
| Run as non-root user | ✅ Complete | Uses `nodejs` user (UID 1001, GID 1001) |
174+
| (Bonus) Docker Compose with MongoDB | ✅ Complete | Full docker-compose.yml with MongoDB service |
175+
176+
## 🚀 Usage
177+
178+
### Quick Start (Production)
179+
180+
```bash
181+
cp .env.example .env
182+
docker compose up -d
183+
```
184+
185+
### Development Mode
186+
187+
```bash
188+
docker compose --profile dev up -d app-dev
189+
```
190+
191+
### Stop Services
192+
193+
```bash
194+
docker compose down
195+
```
196+
197+
## 🔐 Security Features
198+
199+
1. **Non-root user execution** - App runs as `nodejs` user
200+
2. **Minimal base image** - Alpine Linux reduces attack surface
201+
3. **Environment variable isolation** - Secrets not baked into image
202+
4. **.dockerignore** - Prevents sensitive file inclusion
203+
5. **Health checks** - Monitors service health
204+
6. **Network isolation** - Custom Docker network
205+
206+
## 📈 Performance Optimizations
207+
208+
1. **Multi-stage builds** - Smaller final image
209+
2. **Build caching** - Faster subsequent builds
210+
3. **Alpine Linux** - Reduced image size (~70MB vs ~900MB)
211+
4. **Production dependencies only** - Smaller runtime image
212+
5. **Layer optimization** - Efficient Docker layer caching
213+
214+
## 🧪 Testing
215+
216+
To verify the Docker setup:
217+
218+
```bash
219+
# Build and start
220+
docker compose up -d
221+
222+
# Check services are running
223+
docker compose ps
224+
225+
# Test health endpoint
226+
curl http://localhost:5000/api/auth/health
227+
228+
# View logs
229+
docker compose logs -f
230+
231+
# Clean up
232+
docker compose down
233+
```
234+
235+
## 📝 Additional Notes
236+
237+
- Docker Compose v2 syntax used (`docker compose` instead of `docker-compose`)
238+
- Compatible with both v1 and v2
239+
- MongoDB data persists in Docker volumes
240+
- Development mode supports hot reload
241+
- Production-ready with security best practices
242+
- Comprehensive documentation provided
243+
244+
## 🎯 Benefits
245+
246+
1. **Consistency** - Same environment across development, testing, and production
247+
2. **Portability** - Run anywhere Docker runs
248+
3. **Isolation** - No dependency conflicts with host system
249+
4. **Scalability** - Easy to scale with orchestration tools
250+
5. **Easy onboarding** - New developers can start quickly
251+
6. **Production-ready** - Follows Docker best practices
252+
253+
## 🔄 Future Enhancements (Optional)
254+
255+
- [ ] Add Nginx reverse proxy
256+
- [ ] Implement Docker Secrets for production
257+
- [ ] Add monitoring with Prometheus/Grafana
258+
- [ ] Multi-architecture builds (ARM64 support)
259+
- [ ] CI/CD pipeline integration
260+
- [ ] Kubernetes manifests
261+
- [ ] Redis caching layer
262+
263+
---
264+
265+
**Implementation Date:** October 30, 2025
266+
**Docker Version:** 28.5.0
267+
**Docker Compose Version:** v2.33.1
268+
**Status:** ✅ Complete and tested

0 commit comments

Comments
 (0)