πŸš€ React-WordPress Deployment & DevOps

Master CI/CD, Docker, Kubernetes, CDN, monitoring, and enterprise-grade deployment strategies

1
2
3
4
5
6

πŸ“Š Complete Deployment Architecture Overview

Modern deployment isn't just about getting code to productionβ€”it's about creating a resilient, scalable, and observable infrastructure that can handle millions of users while maintaining sub-second response times.

graph TB subgraph "Development" A[Local Dev] --> B[Git Push] B --> C[GitHub/GitLab] end subgraph "CI/CD Pipeline" C --> D[GitHub Actions] D --> E[Build & Test] E --> F[Docker Build] F --> G[Push to Registry] end subgraph "Container Orchestration" G --> H[Kubernetes Cluster] H --> I[Pod Deployment] I --> J[Service Mesh] J --> K[Load Balancer] end subgraph "CDN & Edge" K --> L[CloudFlare CDN] L --> M[Edge Workers] M --> N[Global PoPs] end subgraph "Monitoring" H --> O[Prometheus] O --> P[Grafana] H --> Q[ELK Stack] Q --> R[Kibana] end style A fill:#f9f,stroke:#333,stroke-width:4px style H fill:#bbf,stroke:#333,stroke-width:4px style L fill:#bfb,stroke:#333,stroke-width:4px

⚑ Zero-Downtime Deployments

Blue-green deployments with automatic rollback capabilities

πŸ”„ Auto-Scaling

Horizontal pod autoscaling based on CPU, memory, and custom metrics

🌍 Global Distribution

Multi-region deployment with geo-distributed databases

πŸ”„ CI/CD Pipelines: Automated Excellence

Continuous Integration and Continuous Deployment pipelines are the backbone of modern software delivery. Let's build a bulletproof pipeline that tests, builds, and deploys your React-WordPress application automatically.

GitHub Actions Complete Pipeline

# .github/workflows/production-deployment.yml
name: Production Deployment Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  # Job 1: Testing & Quality Gates
  test-and-quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: |
          npm ci
          npm run test:unit
          npm run test:e2e
          npm audit --audit-level=moderate

  # Job 2: Build Docker Images
  build-and-push:
    needs: test-and-quality
    runs-on: ubuntu-latest
    steps:
      - uses: docker/build-push-action@v5
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}

  # Job 3: Deploy to Kubernetes
  deploy:
    needs: build-and-push
    runs-on: ubuntu-latest
    steps:
      - run: |
          helm upgrade --install app ./helm \
            --set image.tag=${{ github.sha }}
πŸ’‘ Pipeline Best Practices:
  • Use matrix builds to test multiple versions
  • Implement quality gates that block bad code
  • Sign container images for supply chain security
  • Generate SBOMs for vulnerability tracking
  • Always run smoke tests after deployment

🐳 Docker Containerization: Production-Ready Images

Docker containers ensure your application runs consistently across all environments. Let's create optimized, secure containers for both React and WordPress.

Multi-Stage React Dockerfile

# Dockerfile.react - Optimized React production build
# Stage 1: Dependencies
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

# Stage 2: Builder
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build

# Stage 3: Production
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

☸️ Kubernetes Deployment: Enterprise Scale

Kubernetes provides orchestration, scaling, and self-healing capabilities for your containerized applications.

Kubernetes Deployment Manifest

# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: react-wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: react-wordpress
  template:
    metadata:
      labels:
        app: react-wordpress
    spec:
      containers:
      - name: app
        image: ghcr.io/yourorg/app:latest
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"

🌐 CDN Configuration: Global Performance

Content Delivery Networks ensure your application loads blazing fast from anywhere in the world. Let's configure CloudFlare for optimal performance.

CloudFlare Workers Edge Caching

// cloudflare-worker.js - Edge caching and optimization
addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    const url = new URL(request.url)
    
    // Cache static assets aggressively
    if (url.pathname.match(/\.(js|css|jpg|png|gif|svg|woff2?)$/)) {
        const cache = caches.default
        let response = await cache.match(request)
        
        if (!response) {
            response = await fetch(request)
            const headers = new Headers(response.headers)
            headers.set('Cache-Control', 'public, max-age=31536000')
            
            response = new Response(response.body, {
                status: response.status,
                statusText: response.statusText,
                headers: headers
            })
            
            event.waitUntil(cache.put(request, response.clone()))
        }
        
        return response
    }
    
    // Add security headers
    const response = await fetch(request)
    const newHeaders = new Headers(response.headers)
    
    newHeaders.set('X-Content-Type-Options', 'nosniff')
    newHeaders.set('X-Frame-Options', 'DENY')
    newHeaders.set('X-XSS-Protection', '1; mode=block')
    newHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin')
    
    return new Response(response.body, {
        status: response.status,
        statusText: response.statusText,
        headers: newHeaders
    })
}

πŸš€ CDN Performance Optimizations

  • βœ… Image optimization with WebP/AVIF conversion
  • βœ… Brotli compression for text assets
  • βœ… HTTP/3 with QUIC protocol
  • βœ… Automatic minification of CSS/JS
  • βœ… Smart routing to nearest edge location
  • βœ… DDoS protection and rate limiting

πŸ“Š Monitoring and Logging: Complete Observability

You can't improve what you can't measure. Let's implement comprehensive monitoring and logging for complete system observability.

πŸ” Monitoring Stack Components

  • Prometheus: Metrics collection and storage
  • Grafana: Visualization and dashboards
  • Elasticsearch: Log aggregation and search
  • Kibana: Log visualization and analysis
  • Jaeger: Distributed tracing
  • AlertManager: Alert routing and management

Prometheus Configuration

# prometheus-config.yaml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

rule_files:
  - "alerts.yml"

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)

Application Metrics Implementation

// metrics.js - Custom application metrics
const prometheus = require('prom-client');

// Create a Registry
const register = new prometheus.Registry();

// Add default metrics
prometheus.collectDefaultMetrics({ register });

// Custom metrics
const httpRequestDuration = new prometheus.Histogram({
    name: 'http_request_duration_seconds',
    help: 'Duration of HTTP requests in seconds',
    labelNames: ['method', 'route', 'status'],
    buckets: [0.1, 0.5, 1, 2, 5]
});

const activeUsers = new prometheus.Gauge({
    name: 'active_users_total',
    help: 'Number of active users'
});

const apiErrors = new prometheus.Counter({
    name: 'api_errors_total',
    help: 'Total number of API errors',
    labelNames: ['endpoint', 'error_type']
});

register.registerMetric(httpRequestDuration);
register.registerMetric(activeUsers);
register.registerMetric(apiErrors);

// Middleware to track metrics
const metricsMiddleware = (req, res, next) => {
    const end = httpRequestDuration.startTimer();
    
    res.on('finish', () => {
        end({ 
            method: req.method, 
            route: req.route?.path || req.path, 
            status: res.statusCode 
        });
    });
    
    next();
};

module.exports = { register, metricsMiddleware };

Logging Configuration

// logger.js - Structured logging with Winston
const winston = require('winston');
const { ElasticsearchTransport } = require('winston-elasticsearch');

const logger = winston.createLogger({
    level: process.env.LOG_LEVEL || 'info',
    format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.errors({ stack: true }),
        winston.format.json()
    ),
    defaultMeta: { 
        service: 'react-wordpress',
        environment: process.env.NODE_ENV
    },
    transports: [
        // Console transport for development
        new winston.transports.Console({
            format: winston.format.combine(
                winston.format.colorize(),
                winston.format.simple()
            )
        }),
        
        // Elasticsearch transport for production
        new ElasticsearchTransport({
            level: 'info',
            clientOpts: { 
                node: process.env.ELASTICSEARCH_URL || 'http://localhost:9200'
            },
            index: 'logs-react-wordpress'
        })
    ]
});

// Log request details
const requestLogger = (req, res, next) => {
    logger.info('Request received', {
        method: req.method,
        url: req.url,
        ip: req.ip,
        userAgent: req.get('user-agent')
    });
    next();
};

module.exports = { logger, requestLogger };

πŸ’Ύ Backup Strategies: Never Lose Data

A robust backup strategy is your insurance policy against data loss. Let's implement comprehensive backup and disaster recovery procedures.

πŸ“¦ 3-2-1 Backup Rule

  • 3 copies of important data
  • 2 different storage media
  • 1 offsite backup location

Automated Backup Script

#!/bin/bash
# backup.sh - Comprehensive backup script

# Configuration
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

# Database backup
echo "Starting database backup..."
mysqldump \
    --host=$DB_HOST \
    --user=$DB_USER \
    --password=$DB_PASS \
    --single-transaction \
    --routines \
    --triggers \
    --all-databases > ${BACKUP_DIR}/mysql_${DATE}.sql

# Compress the backup
gzip ${BACKUP_DIR}/mysql_${DATE}.sql

# WordPress files backup
echo "Backing up WordPress files..."
tar -czf ${BACKUP_DIR}/wordpress_${DATE}.tar.gz \
    --exclude='*/cache/*' \
    --exclude='*/backup/*' \
    /var/www/html

# Upload to S3
echo "Uploading to S3..."
aws s3 cp ${BACKUP_DIR}/mysql_${DATE}.sql.gz \
    s3://your-backup-bucket/mysql/ \
    --storage-class GLACIER

aws s3 cp ${BACKUP_DIR}/wordpress_${DATE}.tar.gz \
    s3://your-backup-bucket/wordpress/ \
    --storage-class GLACIER

# Clean up old backups
echo "Cleaning up old backups..."
find ${BACKUP_DIR} -type f -mtime +${RETENTION_DAYS} -delete

# Verify backup integrity
echo "Verifying backup..."
gunzip -t ${BACKUP_DIR}/mysql_${DATE}.sql.gz
if [ $? -eq 0 ]; then
    echo "Backup completed successfully"
    # Send success notification
    curl -X POST $SLACK_WEBHOOK \
        -H 'Content-Type: application/json' \
        -d '{"text":"βœ… Backup completed successfully"}'
else
    echo "Backup verification failed!"
    # Send failure alert
    curl -X POST $SLACK_WEBHOOK \
        -H 'Content-Type: application/json' \
        -d '{"text":"❌ Backup failed! Immediate attention required"}'
    exit 1
fi

Kubernetes Persistent Volume Backup

# velero-backup.yaml - Kubernetes cluster backup with Velero
apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: daily-backup
  namespace: velero
spec:
  schedule: "0 2 * * *"  # Daily at 2 AM
  template:
    ttl: 720h  # Keep backups for 30 days
    includedNamespaces:
      - react-wordpress
      - production
    includedResources:
      - persistentvolumeclaims
      - persistentvolumes
      - deployments
      - services
      - configmaps
      - secrets
    storageLocation: aws-backup
    volumeSnapshotLocations:
      - aws-snapshots
Backup Type Frequency Retention Storage Location
Database (Full) Daily 30 days S3 Glacier
Database (Incremental) Hourly 7 days S3 Standard
WordPress Files Daily 30 days S3 Glacier
Container Images On Build 90 days Container Registry
Kubernetes Config On Change Indefinite Git Repository

🎯 Complete DevOps Checklist

Use this checklist to ensure your deployment pipeline is production-ready:

βœ… Pre-Deployment Checklist

  • β˜‘οΈ All tests passing (unit, integration, e2e)
  • β˜‘οΈ Security scan completed (no critical vulnerabilities)
  • β˜‘οΈ Performance benchmarks met
  • β˜‘οΈ Documentation updated
  • β˜‘οΈ Database migrations tested
  • β˜‘οΈ Rollback procedure documented
  • β˜‘οΈ Monitoring alerts configured
  • β˜‘οΈ Backup verified and tested
  • β˜‘οΈ Load testing completed
  • β˜‘οΈ SSL certificates valid

⚠️ Common Pitfalls to Avoid

  • ❌ Hardcoding secrets in code or Docker images
  • ❌ Not setting resource limits on containers
  • ❌ Ignoring backup restoration testing
  • ❌ Skipping security headers configuration
  • ❌ Not implementing rate limiting
  • ❌ Forgetting to set up alerting
  • ❌ Using latest tags in production
  • ❌ Not documenting runbooks