Files
Job-Info/OPTION_2_DOCKER_COMPOSE.md
T
aewing 42ff3e8f33
Build & Deploy / Test & Lint (push) Has been cancelled
Build & Deploy / Security Scan (push) Has been cancelled
Code Quality / Code Quality Checks (push) Has been cancelled
Code Quality / Dependency Vulnerabilities (push) Has been cancelled
Code Quality / Performance Testing (push) Has been cancelled
Build & Deploy / Build Docker Images (push) Has been cancelled
Build & Deploy / Deploy to Kubernetes (push) Has been cancelled
Add Mode6Test: copy of Mode5Test running on port 3000
2026-01-20 13:43:29 +00:00

536 lines
14 KiB
Markdown

# OPTION 2: DOCKER COMPOSE DEPLOYMENT - WHAT WE'VE GOT
**Date**: 2026-01-19
**Status**: Ready to Launch
**Command**: `docker-compose up -d`
---
## 🐳 DOCKER COMPOSE ARCHITECTURE
```
┌──────────────────────────────────────────────────────────────┐
│ Docker Compose Network │
│ (job-info-network) │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Backend Service (job-info-backend) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Container: Bun Runtime │ │ │
│ │ │ Framework: Hono Web Server │ │ │
│ │ │ Port: 3005 │ │ │
│ │ │ Health Check: /health endpoint (30s interval) │ │ │
│ │ │ │ │ │
│ │ │ Services: │ │ │
│ │ │ ✓ OAuth2 authorize endpoint │ │ │
│ │ │ ✓ Token refresh endpoint │ │ │
│ │ │ ✓ Logout endpoint │ │ │
│ │ │ ✓ CORS configured for frontend │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↑ │
│ depends_on │
│ (healthy) │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Frontend Service (job-info-frontend) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ Container: Node Runtime │ │ │
│ │ │ Framework: Vite + Svelte │ │ │
│ │ │ Port: 5173 │ │ │
│ │ │ Health Check: HTTP / (30s interval) │ │ │
│ │ │ │ │ │
│ │ │ Features: │ │ │
│ │ │ ✓ Vite static serving │ │ │
│ │ │ ✓ OAuth2 sign-in flow │ │ │
│ │ │ ✓ IndexedDB job caching │ │ │
│ │ │ ✓ Service Worker registration │ │ │
│ │ │ ✓ Error handling + logging │ │ │
│ │ │ ✓ Responsive design (mobile/tablet/desktop) │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘
Browser Access:
→ http://localhost:5173 (Frontend)
→ http://localhost:3005 (Backend API)
```
---
## 📦 WHAT GETS BUILT
### Backend Container (Dockerfile.backend)
```dockerfile
FROM oven/bun:latest as builder
↓ Installs dependencies
COPY Mode3Test/backend ./backend
COPY package.json, bunfig.toml
RUN bun install --production
FROM oven/bun:latest (Runtime stage)
↓ Minimal final image
COPY from builder
ENV NODE_ENV=production
ENV PORT=3005
HEALTHCHECK /health
EXPOSE 3005
CMD ["bun", "run", "dev"]
```
**Result**: Optimized Bun container with OAuth2 backend
### Frontend Container (Dockerfile.frontend)
```dockerfile
FROM node:18-alpine as builder
↓ Build production bundle
COPY frontend/
RUN npm ci
RUN npm run build
FROM node:18-alpine (Runtime stage)
↓ Lightweight static server
COPY --from=builder /app/dist ./dist
RUN npm install -g serve
HEALTHCHECK /
EXPOSE 5173
CMD ["serve", "-s", "dist", "-l", "5173"]
```
**Result**: Production-optimized frontend container (42.70 kB gzip!)
---
## 🔧 CONFIGURATION
### Backend Environment Variables
```env
NODE_ENV=production
PORT=3005
LOG_LEVEL=info
OAUTH_CLIENT_ID=<from env or .env file>
OAUTH_CLIENT_SECRET=<from env or .env file>
OAUTH_REDIRECT_URI=http://localhost:5173/#/callback
CORS_ORIGIN=http://localhost:5173
```
### Frontend Environment Variables
```env
NODE_ENV=production
```
### Docker Network
```
Type: bridge
Name: job-info-network
Purpose: Secure communication between backend and frontend
```
---
## 🚀 STARTUP SEQUENCE
When you run `docker-compose up -d`:
```
1. Build Stage (First time only)
├─ Build backend image from Dockerfile.backend
│ └─ Multi-stage build (builder → runtime)
│ └─ Result: Optimized Bun container
├─ Build frontend image from Dockerfile.frontend
│ └─ Multi-stage build (builder → runtime)
│ └─ Result: Optimized Node container with production build
└─ Create network: job-info-network
2. Container Launch
├─ Start backend service (job-info-backend)
│ ├─ Listen on port 3005
│ ├─ Wait for health check (/health)
│ └─ Status: healthy (ready for requests)
└─ Start frontend service (job-info-frontend)
├─ depends_on: backend healthy ✓
├─ Listen on port 5173
├─ Serve production build
└─ Status: healthy (ready to browse)
3. Ready for Use
→ http://localhost:5173 ✓ READY
→ http://localhost:3005 ✓ READY
```
---
## 📊 CONTAINER SPECIFICATIONS
### Backend Container
| Property | Value |
|----------|-------|
| Image | oven/bun:latest |
| Container Name | job-info-backend |
| Port | 3005 |
| Restart Policy | unless-stopped |
| Health Check | Every 30s, /health endpoint |
| Health Timeout | 10s, 3 retries |
| Volumes | ./Mode3Test/backend (read-only) |
| CPU | Unlimited (no limit set) |
| Memory | Unlimited (no limit set) |
### Frontend Container
| Property | Value |
|----------|-------|
| Image | node:18-alpine |
| Container Name | job-info-frontend |
| Port | 5173 |
| Restart Policy | unless-stopped |
| Health Check | Every 30s, HTTP GET / |
| Health Timeout | 10s, 3 retries |
| Depends On | backend (service_healthy) |
| CPU | Unlimited (no limit set) |
| Memory | Unlimited (no limit set) |
---
## 🌐 WHAT YOU CAN DO AFTER STARTING
### Access the Application
```bash
# Open in browser
http://localhost:5173
# You'll see:
✓ Job Info logo
"Sign In with Microsoft" button
✓ Responsive design (works on mobile too!)
```
### Sign In Flow
```
1. Click "Sign In with Microsoft"
2. Redirected to Microsoft OAuth
3. Grant permissions
4. Redirected back to: http://localhost:5173/#/callback
5. Token exchanged securely
6. Redirected to Home page
7. Jobs list loads automatically
```
### View Application Features
```
✓ User profile in header
✓ Jobs displayed as cards
✓ Search bar to filter jobs
✓ Loading spinners during API calls
✓ Error messages (user-friendly)
✓ Sign out button
```
### Monitor Containers
```bash
# See running containers
docker-compose ps
# View logs
docker-compose logs -f backend
docker-compose logs -f frontend
# View specific container logs
docker-compose logs -f job-info-backend
docker-compose logs -f job-info-frontend
# Inspect backend health
curl http://localhost:3005/health
# Check frontend
curl http://localhost:5173
```
---
## 🔍 TECHNICAL DETAILS - WHAT'S RUNNING
### Backend (Port 3005)
**Running**: Hono web server on Bun runtime
**Available Endpoints**:
```
GET /health - Health check
POST /api/auth/authorize - OAuth authorize
POST /api/auth/refresh - Token refresh
POST /api/auth/logout - Sign out
```
**Features**:
- OAuth2 PKCE flow with Microsoft
- Token signing and verification
- CORS configured for frontend
- Structured logging
- Error handling
- Health checks
### Frontend (Port 5173)
**Running**: Vite static file server with production build
**Serving**: 52 optimized modules (42.70 kB gzip)
**Features**:
- OAuth2 sign-in flow
- Token management
- Service Worker (background refresh)
- IndexedDB caching
- Responsive UI
- Error boundaries
- Structured logging
**Pages**:
- `/` - Home (job dashboard)
- `/#/signin` - Sign in page
- `/#/callback` - OAuth callback handler
---
## 📊 BUILD ARTIFACTS
### Frontend Build Output
```
dist/
├── index.html (0.32 kB)
├── assets/
│ ├── index-XXXXX.js (42.70 kB gzip)
│ └── index-XXXXX.css (4.08 kB gzip)
└── service-worker.js (included)
Total: ~47 kB gzip (Production ready!)
```
### Backend Dependencies
```
Installed via bun:
├── hono@4.x - Web framework
├── typescript@5.9.3 - Type safety
└── [Other dependencies]
```
---
## ✅ HEALTH CHECKS
### Backend Health Check
```bash
# Every 30 seconds, Docker runs:
curl -f http://localhost:3005/health
# Expected response: 200 OK
# If fails 3 times: Container marked unhealthy
```
### Frontend Health Check
```bash
# Every 30 seconds, Docker runs:
wget --quiet --tries=1 --spider http://localhost:5173
# Expected: HTTP 200
# If fails 3 times: Container marked unhealthy
```
---
## 🔒 SECURITY FEATURES
### Network Isolation
```
job-info-network (bridge)
├─ Backend (only accessible via network)
└─ Frontend (accessible from network)
→ No external access without port mapping
→ Containers communicate securely
→ Network policies can be enforced
```
### Environment Variables
```
✓ OAuth credentials via env vars (not in code)
✓ Production mode enforced
✓ Log level configurable
✓ Secrets not exposed in image
```
### Container Restart
```
Policy: unless-stopped
→ Automatically restart if container crashes
→ Preserves data across restarts
→ Supports graceful shutdown
```
---
## 📝 LOGS YOU'LL SEE
### Backend Startup
```
[Bun startup logs]
listening on 0.0.0.0:3005
OAuth2 configured
CORS enabled for http://localhost:5173
Health check endpoint ready
```
### Frontend Startup
```
[Node startup logs]
Vite dev server running
Listening on http://localhost:5173
Production build served
Service Worker registered
```
### During OAuth Flow
```
[Backend logs]
POST /api/auth/authorize
Code received
Token signed
Refresh token issued
[Frontend logs]
OAuth flow initiated
Callback received
Token stored in sessionStorage
User profile fetched
Redirected to home
```
---
## 🛑 STOPPING & CLEANUP
### Stop Services (Data Preserved)
```bash
docker-compose stop
# Containers stop but persist
# Can restart with: docker-compose start
```
### Stop & Remove (Clean)
```bash
docker-compose down
# Removes containers and network
# Images remain for reuse
```
### Full Cleanup (Everything)
```bash
docker-compose down -v
# Removes containers, network, and volumes
# Full reset for fresh start
```
---
## 🎯 WHAT TO EXPECT
### First Run
```
Time: ~2-3 minutes (builds images)
Output:
✓ Building backend image
✓ Building frontend image
✓ Starting containers
✓ Waiting for health checks
✓ Both services ready
```
### Subsequent Runs
```
Time: ~30 seconds
Output:
✓ Containers start immediately
✓ Health checks pass
✓ Services ready
```
### Application Ready
```
✓ Backend: http://localhost:3005 (healthy)
✓ Frontend: http://localhost:5173 (healthy)
✓ Sign in button visible
✓ Can proceed with OAuth flow
```
---
## 🔧 COMMON COMMANDS
```bash
# Build and start
docker-compose up -d
# View status
docker-compose ps
# View logs
docker-compose logs -f
# Stop
docker-compose stop
# Restart
docker-compose restart
# Full cleanup
docker-compose down -v
# Rebuild images
docker-compose build --no-cache
# Scale services (for testing)
docker-compose up -d --scale backend=2 --scale frontend=2
```
---
## 📚 WHAT'S INCLUDED
- ✅ Multi-stage Docker builds (optimized images)
- ✅ Health checks (automated monitoring)
- ✅ Dependency management (backend waits for healthy)
- ✅ Network isolation (secure communication)
- ✅ Environment variables (configurable)
- ✅ Volume mounts (source code binding)
- ✅ Restart policies (automatic recovery)
- ✅ Port mapping (accessible from host)
---
## 🎉 BOTTOM LINE
When you run `docker-compose up -d`:
1. **Two optimized containers start** (backend + frontend)
2. **Network connects them securely** (job-info-network)
3. **Health checks monitor both** (auto-restart if needed)
4. **Frontend waits for backend** (depends_on)
5. **Everything is ready in 2-3 minutes** (first run)
Then you can:
- Open http://localhost:5173 in browser
- Click "Sign In with Microsoft"
- See the full production application
- Experience all features (caching, offline, etc.)
**All infrastructure & dependencies are fully automated!**
---
**Generated**: 2026-01-19
**Status**: ✅ READY TO LAUNCH
**Command**: `docker-compose up -d`