- Add complete dark mode system with theme context and toggle - Implement dark mode toggle component in navigation menu - Add client-side routing with SSR-safe signal handling - Fix language selector styling for better dark mode compatibility - Add documentation system with mdBook integration - Improve navigation menu with proper external/internal link handling - Add comprehensive project documentation and configuration - Enhance theme system with localStorage persistence - Fix arena panic issues during server-side rendering - Add proper TypeScript configuration and build optimizations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
700 lines
15 KiB
Markdown
700 lines
15 KiB
Markdown
# 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 <repository-url>
|
|
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) |