Files
metabuilder/frontends/emailclient/PHASE_8_REDIS_SUMMARY.md
2026-03-09 22:30:41 +00:00

15 KiB

Phase 8: Redis Container Implementation - Complete Summary

Overview

Successfully created a production-ready Redis 7 container configured as a Celery broker and result backend for the Email Client implementation. This Phase 8 deployment includes comprehensive health checks, persistence configuration, monitoring tools, and backup/recovery scripts.

Deliverables

1. Docker Container Files

Location: deployment/docker/redis/

File Purpose Key Features
Dockerfile Redis 7 Alpine-based container Multi-stage build, health checks, entrypoint script
redis.conf Production Redis configuration 512MB memory limit, RDB+AOF persistence, allkeys-lru eviction, authentication
docker-entrypoint.sh Container initialization script Environment variable substitution, Redis verification, monitoring
.dockerignore Docker build context exclusions Reduces build context size
README.md Comprehensive documentation Setup, usage, monitoring, troubleshooting

2. Docker Compose Configuration

Updated: docker-compose.yml

redis:
  build:
    context: ./deployment/docker/redis
    dockerfile: Dockerfile
  image: emailclient-redis:latest
  environment:
    REDIS_PASSWORD: ${REDIS_PASSWORD:-redis_development_password}
    REDIS_MAXMEMORY: ${REDIS_MAXMEMORY:-512mb}
    REDIS_MAXMEMORY_POLICY: ${REDIS_MAXMEMORY_POLICY:-allkeys-lru}
  healthcheck:
    test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
    interval: 30s
    timeout: 10s
    retries: 3
    start_period: 5s
  volumes:
    - redis-data:/data
  networks:
    - emailclient-net
  restart: unless-stopped

Key Updates:

  • Build from custom Dockerfile (not official image)
  • Environment variable substitution
  • Native health checks with healthcheck directive
  • Enhanced email-service dependencies on Redis health

3. Environment Configuration Files

File Purpose Environment
.env.redis Redis environment variables template All
docker-compose.dev.yml Development overrides Development
docker-compose.prod.yml Production overrides Production

4. Utility Scripts

Script Purpose Usage
backup.sh Redis backup and restore ./backup.sh {backup|restore|analyze|list}
monitor.sh Health and performance monitoring ./monitor.sh {health|monitor|slowlog|stats}

Both scripts are:

  • Executable (chmod +x)
  • Fully documented with color output
  • Error handling and validation
  • Production-ready

5. Documentation

File Content Audience
deployment/docker/redis/README.md Container setup and usage DevOps, Developers
docs/DEPLOYMENT.md Complete deployment guide DevOps, System Admins

Architecture

Redis Configuration Highlights

┌─────────────────────────────────────────────────┐
│            Redis 7 Alpine Container              │
├─────────────────────────────────────────────────┤
│                                                  │
│  Authentication:                                │
│  - requirepass: (environment variable)          │
│  - ACL support available                        │
│                                                  │
│  Memory Management:                             │
│  - maxmemory: 512MB (configurable)              │
│  - maxmemory-policy: allkeys-lru (configurable) │
│  - Memory sampling: 5 entries                   │
│                                                  │
│  Persistence:                                   │
│  - RDB Snapshots:                               │
│    - 15 min if 1+ key changed                   │
│    - 5 min if 10+ keys changed                  │
│    - 1 min if 10,000+ keys changed              │
│  - AOF (Append-Only File):                      │
│    - Every write to journal                     │
│    - Fsync every second (everysec)              │
│    - Auto-rewrite at 64MB                       │
│                                                  │
│  Celery Integration:                            │
│  - Database 0: Tasks and results                │
│  - JSON serialization                           │
│  - Result expiration: 24 hours                  │
│                                                  │
│  Health Checks:                                 │
│  - Every 30 seconds                             │
│  - Command: redis-cli --raw incr ping           │
│  - 3 retry attempts                             │
│                                                  │
│  Port: 6379/tcp                                 │
│  Volume: /data (persistent)                     │
└─────────────────────────────────────────────────┘

Configuration Details

Memory Management

Max Memory: 512MB
Eviction Policy: allkeys-lru

When memory exceeds 512MB:
1. Identify least recently used key
2. Remove it
3. Continue until memory < maxmemory
4. Process next command

Alternative policies available:
- volatile-lru: Only keys with TTL
- allkeys-lfu: Least frequently used
- volatile-lfu: Keys with TTL (LFU)
- allkeys-random: Random removal
- volatile-random: Keys with TTL (random)
- volatile-ttl: Closest to expiration
- noeviction: Return error (strict)

Persistence

RDB (Point-in-Time Snapshots):
├─ Saved to: /data/dump.rdb
├─ Compression: Yes (LZF)
├─ Checksum: Enabled
└─ Restore: Automatic on startup

AOF (Continuous Journaling):
├─ Saved to: /data/appendonly.aof
├─ Fsync Policy: everysec
├─ Auto-rewrite: At 64MB / 100% growth
├─ Preamble: RDB format (Redis 7+)
└─ Corruption Recovery: Enabled

Recovery:
1. On startup, Redis loads RDB first
2. Then replays AOF on top of RDB
3. Combined state = crash-resistant

Celery Broker Configuration

Redis acts as:
├─ Message Broker:
│  └─ Delivers tasks to workers
├─ Result Backend:
│  └─ Stores task results
└─ Cache:
   └─ Stores frequently accessed data

CELERY_BROKER_URL=redis://:password@redis:6379/0
CELERY_RESULT_BACKEND=redis://:password@redis:6379/0

Task Flow:
1. Flask app enqueues task to Redis
2. Celery worker picks up task
3. Worker executes task
4. Result stored in Redis DB 0
5. Flask app retrieves result

Environment Variables

Development (Default)

REDIS_PASSWORD=redis_development_password
REDIS_MAXMEMORY=512mb
REDIS_MAXMEMORY_POLICY=allkeys-lru
# Generate strong password
REDIS_PASSWORD=$(openssl rand -base64 32)

# Larger memory allocation
REDIS_MAXMEMORY=1gb

# Volatile eviction (only remove TTL keys)
REDIS_MAXMEMORY_POLICY=volatile-lru

# Celery settings
CELERY_TASK_TIME_LIMIT=3600
CELERY_TASK_SOFT_TIME_LIMIT=3000
CELERY_WORKER_CONCURRENCY=4

Health Check

# Docker Compose health status
docker-compose ps
# Shows: "emailclient-redis Up ... (healthy)"

# Manual health check
docker-compose exec redis redis-cli --raw incr ping
# Returns: integer response (healthy)

# Detailed health monitoring
./deployment/docker/redis/monitor.sh health
# Shows: Server info, memory, connections, stats

Backup & Recovery

Automated Backup (Cron)

# Add to crontab
0 2 * * * /path/to/deployment/docker/redis/backup.sh backup

# Keeps last 30 days of backups
# Manifest file with checksums
# Automatic cleanup of old backups

Manual Backup

./deployment/docker/redis/backup.sh backup
# Output: redis-data/redis_backup_20260124_020000.rdb
#         With MD5 and SHA256 checksums

Recovery

./deployment/docker/redis/backup.sh restore /path/to/backup.rdb
# Stops container
# Restores RDB file
# Starts container
# Verifies health

Database Analysis

./deployment/docker/redis/monitor.sh analyze
# Shows:
# - Total keys by type
# - Memory breakdown
# - Largest keys (top 10)
# - Eviction statistics

Monitoring

Real-Time Monitoring

./deployment/docker/redis/monitor.sh monitor
# Continuous display (5s refresh):
# - Memory usage with warning thresholds
# - Connected clients
# - Commands per second
# - Database size
# - Evicted keys / rejected connections
# - AOF status
# - Uptime

Slow Query Log

./deployment/docker/redis/monitor.sh slowlog
# Shows: Last 10 slow commands
# Helps identify performance issues

Command Statistics

./deployment/docker/redis/monitor.sh stats
# Shows: Most frequently executed commands
# Helps understand workload patterns

Deployment Steps

Development (Quick Start)

# 1. Build
docker-compose build redis

# 2. Start
docker-compose up -d redis

# 3. Verify
docker-compose exec redis redis-cli ping
# Output: PONG

# 4. Check logs
docker-compose logs redis

Production (Full Setup)

# 1. Generate secrets
export REDIS_PASSWORD=$(openssl rand -base64 32)

# 2. Create persistent storage
sudo mkdir -p /mnt/data/redis
sudo chown 999:999 /mnt/data/redis
sudo chmod 700 /mnt/data/redis

# 3. Build images
docker-compose build

# 4. Start with production config
docker-compose -f docker-compose.yml \
               -f docker-compose.prod.yml \
               up -d

# 5. Verify health
docker-compose ps
docker-compose exec redis redis-cli -a $REDIS_PASSWORD ping

# 6. Setup backups
0 2 * * * /path/to/backup.sh backup

# 7. Setup monitoring
*/5 * * * * /path/to/monitor.sh health >> /var/log/redis-health.log

Integration Points

Email Service Integration

# services/email_service/celery_app.py
import os
from celery import Celery

app = Celery('email_service')

app.conf.update(
    broker_url=os.getenv('CELERY_BROKER_URL'),
    result_backend=os.getenv('CELERY_RESULT_BACKEND'),
    task_serializer='json',
    result_serializer='json',
    accept_content=['json'],
)

# Usage in Flask app
from celery_app import app as celery_app

@celery_app.task
def sync_imap_account(account_id):
    # Background task to sync IMAP
    pass

# Trigger task
sync_imap_account.delay(account_id=123)

Docker Network

emailclient-net (bridge network)
├─ postfix (SMTP server)
├─ dovecot (IMAP/POP3 server)
├─ redis (Cache & broker) ← NEW
├─ email-service (Flask app)
└─ postgres (Database)

Service Discovery:
- All containers resolve by name
- email-service → redis:6379
- password passed via env var

Security Considerations

Development

  • Default password used (acceptable for dev)
  • Debug logging enabled
  • All interfaces accessible

Production

# 1. Generate strong password
REDIS_PASSWORD=$(openssl rand -base64 32)

# 2. Store in secure vault
# - AWS Secrets Manager
# - Hashicorp Vault
# - Kubernetes Secrets
# - Azure Key Vault

# 3. Restrict network access
# - Bind to 127.0.0.1 or VPC subnet
# - Use firewall rules
# - TLS encryption for inter-service communication

# 4. Enable ACL (Redis 6+)
# - Fine-grained permissions per user
# - Separate read/write access

# 5. Disable dangerous commands
# - FLUSHDB/FLUSHALL
# - KEYS (use SCAN instead)
# - MONITOR (performance impact)

Performance Characteristics

Memory Usage

Empty Redis: ~2-3MB
With 1M keys (avg 100B): ~100-150MB
With 1M keys (avg 1KB): ~1GB+

Memory optimization:
1. Use small keys: "u:123" not "user:123"
2. Compress large values
3. Set TTL to auto-expire old data
4. Use Redis streams for queues
5. Monitor eviction events

Throughput

Baseline (empty):
- Single threaded: ~100k ops/sec
- Network bound: depends on latency
- Common ops:
  * SET: 50-80k ops/sec
  * GET: 50-80k ops/sec
  * INCR: 50-80k ops/sec
  * LPUSH/LPOP: 30-50k ops/sec

Celery tasks (via broker):
- Enqueue speed: 1-5k tasks/sec
- Processing speed: depends on workers
- Typical latency: 1-10ms per task

Scaling

Single Redis instance suitable for:
- <50k QPS
- <1GB working set
- <1000 concurrent connections

For higher scale:
1. Redis Cluster: Horizontal sharding
2. Redis Sentinel: High availability
3. Managed Redis: AWS ElastiCache, Cloud Memorystore
4. Separate read replicas: For read-heavy workloads

Files Created

emailclient/
├── deployment/docker/redis/
│   ├── Dockerfile
│   ├── redis.conf
│   ├── docker-entrypoint.sh
│   ├── backup.sh
│   ├── monitor.sh
│   ├── README.md
│   ├── .dockerignore
│   └── .env.redis
├── docker-compose.yml (UPDATED)
├── docker-compose.dev.yml (NEW)
├── docker-compose.prod.yml (NEW)
└── docs/DEPLOYMENT.md (NEW)

Testing Checklist

  • Dockerfile builds successfully
  • Container starts and passes health checks
  • Redis CLI accessible from email-service
  • RDB snapshots created on schedule
  • AOF journaling enabled
  • Persistence survives container restart
  • Environment variables substituted correctly
  • Health check responds in <10s
  • Memory limits enforced
  • Eviction policy works correctly
  • Backup script creates valid RDB files
  • Restore script recovers data correctly
  • Monitor script shows real-time stats
  • Docker Compose integration complete
  • Email-service can connect with password

Troubleshooting Quick Reference

Issue Solution
Container won't start Check logs: docker-compose logs redis
High memory usage Run monitor.sh analyze, check eviction stats
Slow performance Run monitor.sh slowlog, check command stats
Connection refused Verify password and health: monitor.sh health
Data loss after restart Check RDB/AOF enabled: redis-cli CONFIG GET save
Backup fails Check permissions: ls -la deployment/docker/redis/

Next Steps

  1. Start Development: docker-compose up -d
  2. Create Test Data: Use backup.sh to verify
  3. Setup Monitoring: Configure monitor.sh cron job
  4. Production Deployment: Use docker-compose.prod.yml
  5. Backup Strategy: Schedule backup.sh in crontab
  6. Documentation: Customize docs/DEPLOYMENT.md for your infrastructure
  7. Security Hardening: Generate production passwords and secrets
  8. Load Testing: Test Celery throughput under expected load

References


Summary

Phase 8 Redis container implementation is COMPLETE and PRODUCTION-READY.

Key Achievements: Production Redis 7 Docker image with health checks Comprehensive persistence (RDB + AOF) Celery broker integration with authentication Full monitoring and backup/recovery tooling Development and production configurations Complete documentation and guides Security hardening recommendations Integration with existing services

Status: Ready for development and production deployment.

Last Updated: 2026-01-24 Version: 1.0.0 Phase: 8 Complete