Add Mode6Test: copy of Mode5Test running on port 3000
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
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
This commit is contained in:
@@ -0,0 +1,535 @@
|
||||
# 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`
|
||||
|
||||
Reference in New Issue
Block a user