# Deployment Guide This guide covers the deployment of the Rustelo application with comprehensive monitoring, health checks, and CI/CD pipeline setup. ## Table of Contents 1. [Overview](#overview) 2. [Prerequisites](#prerequisites) 3. [Docker Setup](#docker-setup) 4. [Health Checks](#health-checks) 5. [Metrics and Monitoring](#metrics-and-monitoring) 6. [CI/CD Pipeline](#cicd-pipeline) 7. [Deployment Commands](#deployment-commands) 8. [Production Deployment](#production-deployment) 9. [Troubleshooting](#troubleshooting) ## Overview The Rustelo application includes the following deployment features: - **Docker Containerization**: Multi-stage builds with optimized production images - **Health Check Endpoints**: Kubernetes-compatible liveness and readiness probes - **Prometheus Metrics**: Comprehensive application and system metrics - **GitHub Actions CI/CD**: Automated testing, building, and deployment - **Grafana Dashboards**: Pre-configured monitoring dashboards ## Prerequisites ### System Requirements - **Docker**: Version 20.0+ with Docker Compose - **Node.js**: Version 18+ (for frontend builds) - **Git**: For version control and CI/CD - **curl**: For health checks and API testing ### Optional (for monitoring) - **Prometheus**: For metrics collection - **Grafana**: For visualization - **PostgreSQL**: For production database - **Redis**: For caching and sessions ## Docker Setup ### 1. Basic Development Setup ```bash # Clone the repository git clone cd rustelo # Start development environment docker-compose up -d # View logs docker-compose logs -f ``` ### 2. Production Setup ```bash # Build and deploy production ./deploy.sh deploy -e production --migrate --backup # Check deployment status ./deploy.sh status # View application logs ./deploy.sh logs -f ``` ### 3. Environment-Specific Configurations #### Development ```bash # Use development profile docker-compose --profile dev up -d # Or use the deploy script ./deploy.sh deploy -e development ``` #### Staging ```bash # Deploy to staging ./deploy.sh deploy -e staging --migrate ``` #### Production ```bash # Deploy to production with full monitoring ./deploy.sh deploy -e production --migrate --backup ``` ## Health Checks The application provides comprehensive health check endpoints: ### Endpoints | Endpoint | Purpose | Description | |----------|---------|-------------| | `/health` | Comprehensive health check | Checks all components (database, auth, content, email, system) | | `/health/live` | Liveness probe | Simple check if application is running | | `/health/ready` | Readiness probe | Checks if application can handle traffic | ### Example Health Check Response ```json { "status": "healthy", "timestamp": "2024-01-15T10:30:00Z", "version": "0.1.0", "environment": "production", "uptime_seconds": 3600, "components": [ { "name": "database", "status": "healthy", "message": "Database connection successful", "response_time_ms": 25, "metadata": { "pool_size": 10, "idle_connections": 8 } }, { "name": "auth_service", "status": "healthy", "message": "Authentication service operational", "response_time_ms": 12, "metadata": {} } ], "summary": { "healthy": 5, "degraded": 0, "unhealthy": 0 } } ``` ### Kubernetes Health Check Configuration ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: rustelo-app spec: template: spec: containers: - name: rustelo image: rustelo:latest ports: - containerPort: 3030 livenessProbe: httpGet: path: /health/live port: 3030 initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 readinessProbe: httpGet: path: /health/ready port: 3030 initialDelaySeconds: 5 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 3 ``` ## Metrics and Monitoring ### Prometheus Metrics The application exposes metrics at `/metrics` endpoint with the following categories: #### HTTP Metrics - `rustelo_http_requests_total`: Total HTTP requests by method, path, status - `rustelo_http_request_duration_seconds`: Request duration histogram - `rustelo_http_requests_in_flight`: Current number of active requests #### Database Metrics - `rustelo_db_connections_active`: Active database connections - `rustelo_db_connections_idle`: Idle database connections - `rustelo_db_queries_total`: Total database queries by operation and table - `rustelo_db_query_duration_seconds`: Database query duration histogram #### Authentication Metrics - `rustelo_auth_requests_total`: Authentication requests by type and status - `rustelo_auth_failures_total`: Authentication failures by type and reason - `rustelo_auth_sessions_active`: Number of active sessions - `rustelo_auth_token_generations_total`: Total tokens generated #### Content Metrics - `rustelo_content_requests_total`: Content requests by type and status - `rustelo_content_cache_hits_total`: Content cache hits - `rustelo_content_cache_misses_total`: Content cache misses - `rustelo_content_processing_duration_seconds`: Content processing time #### System Metrics - `rustelo_memory_usage_bytes`: Memory usage in bytes - `rustelo_cpu_usage_percent`: CPU usage percentage - `rustelo_disk_usage_bytes`: Disk usage by path - `rustelo_uptime_seconds`: Application uptime ### Grafana Setup #### 1. Start Monitoring Stack ```bash # Start with monitoring services docker-compose --profile monitoring up -d # Access Grafana at http://localhost:3000 # Default credentials: admin/admin ``` #### 2. Pre-configured Dashboards - **Rustelo Application Overview**: Main application metrics - **System Resources**: CPU, memory, disk usage - **Database Performance**: Connection pool, query metrics - **Authentication Analytics**: Login patterns, failures - **Content Management**: Cache performance, processing times #### 3. Custom Metrics You can add custom business metrics in your application: ```rust // Record custom events metrics.record_user_registration(); metrics.record_content_view(); metrics.record_rate_limit_hit(); ``` ### Alerting Rules Example Prometheus alerting rules: ```yaml groups: - name: rustelo rules: - alert: HighErrorRate expr: rate(rustelo_http_requests_total{status_code=~"5.."}[5m]) > 0.1 for: 2m labels: severity: warning annotations: summary: "High error rate detected" description: "Error rate is {{ $value }} requests per second" - alert: DatabaseConnectionPoolExhausted expr: rustelo_db_connections_idle == 0 for: 1m labels: severity: critical annotations: summary: "Database connection pool exhausted" description: "No idle database connections available" - alert: HighMemoryUsage expr: rustelo_memory_usage_bytes > 1000000000 # 1GB for: 5m labels: severity: warning annotations: summary: "High memory usage" description: "Memory usage is {{ $value }} bytes" ``` ## CI/CD Pipeline ### GitHub Actions Workflow The CI/CD pipeline includes: 1. **Test Suite**: Runs on every push and PR 2. **Security Audit**: Vulnerability scanning 3. **Docker Build**: Multi-platform image building 4. **Deployment**: Automated deployment to staging/production ### Pipeline Stages #### 1. Testing Stage ```yaml - name: Run tests run: cargo test --all-features env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432/rustelo_test REDIS_URL: redis://localhost:6379 ``` #### 2. Security Stage ```yaml - name: Run security audit run: cargo audit - name: Run cargo-deny uses: EmbarkStudios/cargo-deny-action@v1 ``` #### 3. Build Stage ```yaml - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event_name == 'release' }} tags: ${{ steps.meta.outputs.tags }} cache-from: type=gha cache-to: type=gha,mode=max ``` #### 4. Deployment Stage ```yaml - name: Deploy to production run: | ./deploy.sh deploy -e production --migrate --backup ./deploy.sh health ``` ### Required Secrets Set these secrets in your GitHub repository: ```bash DOCKER_USERNAME=your_docker_username DOCKER_PASSWORD=your_docker_password PRODUCTION_SSH_KEY=your_production_server_ssh_key DATABASE_URL=your_production_database_url ``` ## Deployment Commands ### Using the Deploy Script ```bash # Basic deployment ./deploy.sh deploy # Deploy with options ./deploy.sh deploy -e staging --migrate --backup # Scale application ./deploy.sh scale -s 3 # Check status ./deploy.sh status # View logs ./deploy.sh logs -f # Health check ./deploy.sh health # Update to latest ./deploy.sh update # Stop application ./deploy.sh stop # Clean up ./deploy.sh clean ``` ### Manual Docker Compose Commands ```bash # Build and start services docker-compose up -d --build # Scale specific service docker-compose up -d --scale app=3 # View logs docker-compose logs -f app # Check service status docker-compose ps # Stop all services docker-compose down # Remove volumes (WARNING: destroys data) docker-compose down -v ``` ## Production Deployment ### 1. Server Preparation ```bash # Update system sudo apt update && sudo apt upgrade -y # Install Docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Install Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # Create application directory sudo mkdir -p /opt/rustelo cd /opt/rustelo ``` ### 2. Environment Configuration ```bash # Create production environment file cat > .env.production << EOF ENVIRONMENT=production DATABASE_URL=postgresql://username:password@localhost:5432/rustelo_prod REDIS_URL=redis://localhost:6379 RUST_LOG=info ENABLE_METRICS=true ENABLE_HEALTH_CHECK=true EOF ``` ### 3. SSL/TLS Setup ```bash # Generate certificates (using Let's Encrypt) sudo apt install certbot sudo certbot certonly --standalone -d yourdomain.com # Update docker-compose.yml to use certificates # Mount certificates in nginx service ``` ### 4. Database Setup ```bash # Create production database sudo -u postgres createdb rustelo_prod sudo -u postgres createuser rustelo_user # Run migrations ./deploy.sh migrate -e production ``` ### 5. Monitoring Setup ```bash # Start monitoring stack docker-compose --profile monitoring up -d # Configure Grafana # 1. Open http://your-server:3000 # 2. Login with admin/admin # 3. Import dashboards from monitoring/grafana/dashboards/ ``` ### 6. Backup Strategy ```bash # Create backup script cat > backup.sh << 'EOF' #!/bin/bash DATE=$(date +%Y%m%d_%H%M%S) docker-compose exec -T db pg_dump -U postgres rustelo_prod > /opt/backups/rustelo_backup_$DATE.sql find /opt/backups -name "rustelo_backup_*.sql" -mtime +7 -delete EOF # Add to crontab crontab -e # Add: 0 2 * * * /opt/rustelo/backup.sh ``` ## Troubleshooting ### Common Issues #### 1. Application Won't Start ```bash # Check container logs docker-compose logs app # Check system resources docker stats # Verify environment variables docker-compose config ``` #### 2. Database Connection Issues ```bash # Test database connectivity docker-compose exec app psql $DATABASE_URL -c "SELECT 1" # Check database logs docker-compose logs db # Verify connection pool settings curl http://localhost:3030/health | jq '.components[] | select(.name == "database")' ``` #### 3. Health Check Failures ```bash # Check detailed health status curl -s http://localhost:3030/health | jq . # Test individual components curl -s http://localhost:3030/health/live curl -s http://localhost:3030/health/ready ``` #### 4. Performance Issues ```bash # Check metrics curl -s http://localhost:3030/metrics | grep rustelo_ # Monitor resource usage docker stats --no-stream # Check for slow queries docker-compose exec db psql -U postgres -c "SELECT query, calls, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;" ``` ### Debugging Commands ```bash # Enter container shell docker-compose exec app bash # Check application logs docker-compose logs -f app # Test endpoints curl -v http://localhost:3030/health curl -v http://localhost:3030/metrics # Check database docker-compose exec db psql -U postgres rustelo_prod # Monitor in real-time watch -n 5 'docker stats --no-stream' ``` ### Recovery Procedures #### 1. Database Recovery ```bash # Restore from backup docker-compose exec -T db psql -U postgres rustelo_prod < backup_file.sql # Reset database (WARNING: destroys data) docker-compose down docker volume rm rustelo_postgres_data docker-compose up -d db ./deploy.sh migrate -e production ``` #### 2. Application Recovery ```bash # Restart application docker-compose restart app # Full restart docker-compose down docker-compose up -d # Rollback to previous version docker-compose down docker-compose pull docker-compose up -d ``` ## Security Considerations ### 1. Container Security - Use non-root user in containers - Scan images for vulnerabilities - Keep base images updated - Use multi-stage builds to reduce attack surface ### 2. Network Security - Use internal networks for service communication - Expose only necessary ports - Implement rate limiting - Use TLS for all external communications ### 3. Data Protection - Encrypt sensitive data at rest - Use encrypted database connections - Implement proper backup encryption - Regular security audits ### 4. Access Control - Use strong authentication - Implement role-based access control - Regular password rotation - Monitor access logs ## Performance Tuning ### 1. Application Optimization ```toml # config.toml optimizations [database] max_connections = 20 min_connections = 5 connect_timeout = 10 [server] worker_threads = 4 max_request_size = 1048576 [app] enable_compression = true cache_size = 1000 ``` ### 2. Database Optimization ```sql -- Create indexes for frequently queried columns CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_content_created_at ON content(created_at); -- Analyze query performance EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'user@example.com'; ``` ### 3. Container Resource Limits ```yaml services: app: deploy: resources: limits: cpus: '2.0' memory: 1G reservations: cpus: '1.0' memory: 512M ``` ## Maintenance ### Regular Tasks 1. **Daily**: Check application logs and health status 2. **Weekly**: Review metrics and performance 3. **Monthly**: Update dependencies and security patches 4. **Quarterly**: Review and update monitoring alerts ### Maintenance Commands ```bash # Update system packages sudo apt update && sudo apt upgrade -y # Update Docker images docker-compose pull docker-compose up -d # Clean up unused resources docker system prune -f # Backup database ./deploy.sh backup # Check for security updates cargo audit ``` For more detailed information, refer to the individual documentation files: - [Configuration Guide](CONFIG_README.md) - [Email Configuration](templates/email/README.md) - [Security Guide](docs/SECURITY.md) - [API Documentation](docs/API.md)