# Nxtgauge Backend - Deployment Optimization Guide ## Current Problem - Building one big pipeline for all services - If one pod fails, must redeploy everything - 17 microservices = slow build times ## Recommended Solution: Hybrid Approach ### Phase 1: Build Only Changed Services (Quick Win) **Before:** ``` Build all 17 services → 15-20 minutes Deploy all → If one fails, start over ``` **After:** ``` Detect changes → Build only changed services → 1-3 minutes Deploy only changed services → Independent rollouts ``` ### Phase 2: Optimized Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ CI/CD Pipeline │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. DETECT CHANGES │ │ └── git diff → Which apps/** changed? │ │ │ │ 2. BUILD PARALLEL (Matrix Strategy) │ │ ├── Service A ──┐ │ │ ├── Service B ──┼── All build simultaneously │ │ ├── Service C ──┘ │ │ └── (Uses Docker layer caching) │ │ │ │ 3. DEPLOY INDEPENDENTLY │ │ ├── Each service has own Deployment │ │ ├── Rolling update strategy │ │ └── Health checks prevent bad rollouts │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ## Implementation Steps ### Step 1: Use Optimized Dockerfile ```bash # Build specific service docker build \ --build-arg SERVICE_NAME=users \ -f Dockerfile.optimized \ -t nxtgauge-users:latest . ``` **Key optimizations:** - `cargo-chef` for dependency caching (5-10x faster rebuilds) - Distroless base image (5MB vs 50MB Alpine) - Only copies needed service code ### Step 2: Use Build Scripts ```bash # Build only changed services ./scripts/build-changed.sh --detect # Or build specific service ./scripts/build-changed.sh users ``` ### Step 3: Deploy Only Changed Services ```bash # Deploy only changed services ./scripts/deploy-changed.sh --detect # Or deploy specific service ./scripts/deploy-changed.sh users ``` ### Step 4: Update K8s Deployments Add to each deployment YAML: ```yaml spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # Start 1 new pod before killing old maxUnavailable: 0 # Never have less than desired replicas # Better health checks template: spec: containers: - name: service startupProbe: # NEW: Don't kill pod during slow start httpGet: path: /health port: 9100 initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 30 # 2.5 minutes to start readinessProbe: # Traffic only when ready httpGet: path: /health port: 9100 periodSeconds: 5 failureThreshold: 3 livenessProbe: # Restart if unhealthy httpGet: path: /health port: 9100 periodSeconds: 10 failureThreshold: 6 # 1 minute before restart ``` ## GitHub Actions Setup The workflow `.github/workflows/deploy-changed.yml`: 1. **Parallel Builds** - All changed services build simultaneously 2. **Layer Caching** - `cache-from: type=gha` reuses Docker layers 3. **Independent Deploys** - Each service deploys separately 4. **Auto Rollback** - `kubectl rollout status` waits for success ## File Structure ``` nxtgauge-backend-rust/ ├── Dockerfile.optimized # New: Per-service optimized build ├── Dockerfile.template # Old: Keep for reference ├── .github/workflows/ │ ├── deploy-changed.yml # New: Smart CI/CD │ └── ... ├── scripts/ │ ├── build-changed.sh # New: Build only changes │ └── deploy-changed.sh # New: Deploy only changes └── DEPLOYMENT_OPTIMIZATION.md # This file ``` ## Performance Improvements | Metric | Before | After | Improvement | | ------------- | ----------- | -------------- | ------------------------ | | Build Time | 15-20 min | 1-3 min | **6-10x faster** | | Deploy Time | 10-15 min | 30 sec - 2 min | **5-10x faster** | | Image Size | 50-100 MB | 10-20 MB | **5x smaller** | | Failed Deploy | Restart all | Restart one | **Isolated** | | Shared Cache | None | cargo-chef | **5-10x faster rebuild** | ## Best Practices ### 1. Shared Dependencies (crates/) If you change `crates/`, ALL services rebuild (intentional - shared code) ### 2. Emergency Deploy ```bash # Deploy single service immediately ./scripts/deploy-changed.sh users ``` ### 3. Monitoring ```bash # Watch all rollouts kubectl get deployments -n nxtgauge -w # Check specific service kubectl rollout status deployment/nxtgauge-rust-users -n nxtgauge ``` ### 4. Rollback ```bash # Rollback specific service (not everything!) kubectl rollout undo deployment/nxtgauge-rust-users -n nxtgauge ``` ## Migration Plan 1. **Week 1**: Start using `Dockerfile.optimized` 2. **Week 2**: Update CI/CD to use `deploy-changed.yml` 3. **Week 3**: Monitor and tune resource limits 4. **Week 4**: Remove old Dockerfile.template ## Commands Reference ```bash # Build specific service docker build --build-arg SERVICE_NAME=users -f Dockerfile.optimized . # Build all changed ./scripts/build-changed.sh --detect # Deploy specific service ./scripts/deploy-changed.sh users # Deploy all changed ./scripts/deploy-changed.sh --detect # Check service status kubectl get pods -n nxtgauge -l app=nxtgauge-rust-users # View logs kubectl logs -n nxtgauge -l app=nxtgauge-rust-users --tail=100 -f ``` ## Need Help? 1. Test the optimized build locally: ```bash docker build --build-arg SERVICE_NAME=gateway -f Dockerfile.optimized -t test-gateway . ``` 2. Verify scripts work: ```bash ./scripts/build-changed.sh gateway ``` 3. Check K8s deployments: ```bash kubectl get deployments -n nxtgauge ```