11 KiB
Celery Worker Container - Complete Implementation
Phase 8: Email Service Background Task Processing
Location: /deployment/docker/celery-worker/
Files Created
1. Dockerfile (2.8 KB)
Multi-stage Docker image for Celery worker container.
Features:
- Python 3.11-slim base image (minimal footprint)
- Build stage: Compiles dependencies with gcc/g++
- Runtime stage: Only runtime dependencies (ca-certificates, libpq5, curl)
- Non-root user (
celeryworkerUID 1000) for security - Health check via
celery inspect ping(30s interval, 15s startup) - Environment variables for Redis broker and result backend
- Logs volume:
/app/logs/for persistent logging
CMD:
celery -A tasks.celery_app worker \
--loglevel=info \
--concurrency=4 \
--time-limit=300 \
--soft-time-limit=280 \
--pool=prefork \
--queues=sync,send,delete,spam,periodic \
--hostname=celery-worker@%h \
--logfile=/app/logs/celery-worker.log
2. docker-compose.yml (6.7 KB)
Docker Compose service definitions for Celery ecosystem.
Services:
-
celery-worker - Main task processor
- Image: Custom (from Dockerfile)
- Container:
metabuilder-celery-worker - Concurrency: 4 worker processes
- Timeout: 300s hard, 280s soft
- Health check:
celery inspect ping(30s) - Resource limits: 2 CPU / 512 MB memory
- Logs: JSON-file driver (10MB / 3 files)
- Volumes:
celery_worker_logs:/app/logs
-
celery-beat - Task scheduler
- Image: Custom (same Dockerfile)
- Container:
metabuilder-celery-beat - Scheduler: PersistentScheduler (database-backed)
- Schedule DB:
/app/logs/celery-beat-schedule.db - Tasks:
sync-emails-every-5min- Periodic email synccleanup-stale-tasks-hourly- Redis cleanup
- Health check:
ps aux(process monitor) - Depends on: redis, postgres, celery-worker
-
celery-flower - Web monitoring dashboard
- Image:
mher/flower:2.0.1(official) - Container:
metabuilder-celery-flower - Port:
5556:5555 - URL: http://localhost:5556
- Database:
/data/flower.db(persistent SQLite) - Features: Task history, worker stats, real-time graphs
- Health check:
curl http://localhost:5555/health - Depends on: redis, celery-worker
- Image:
Volumes:
celery_worker_logs- tmpfs (100MB, in-memory) for logscelery_flower_data- local (persistent) for Flower database
Network: metabuilder-dev-network (external, from main compose)
3. README.md (13 KB)
Complete user guide for Celery worker operations.
Sections:
- Quick start guide (3 commands to get running)
- Architecture overview with diagrams
- Multi-tenant safety validation
- Queue types and priorities (sync, send, delete, spam, periodic)
- Task timeout configuration (hard/soft limits)
- Deployment instructions (Docker Compose)
- Configuration via environment variables
- Resource limits and tuning
- Monitoring with Flower dashboard
- Health checks (worker, beat, flower)
- Logs inspection and troubleshooting
- Task management (list, revoke, cancel, trigger)
- Queue management (depth, status, flush)
- Production checklist
4. SETUP.md (14 KB)
Step-by-step setup and operational guide.
Sections:
- Quick start (5-step guide)
- Environment setup (create .env, configure)
- Docker setup (build images, network, volumes)
- Database setup (PostgreSQL verification)
- Redis setup (broker/result backend)
- Configuration guide (concurrency, timeouts, memory, logging)
- Operational tasks (start, stop, restart, monitor)
- Monitoring commands (Flower, CLI tools, logs)
- Task management (list, check status, cancel, trigger)
- Troubleshooting (not starting, crashes, not processing, memory, timeouts, connectivity)
- Performance tuning (queue optimization, connection pooling)
- Production deployment (checklist, environment, build, Kubernetes)
5. ARCHITECTURE.md (19 KB)
Technical architecture documentation.
Sections:
- System overview with component diagrams
- Service architecture (workers, beat, flower, infrastructure)
- Component details (concurrency, queues, health checks)
- Data flow (email sync, email send)
- Multi-tenant safety (validation pattern, data isolation)
- Retry and error handling (exponential backoff)
- Health checks (worker, beat, flower, startup)
- Resource management (memory, CPU, connection pooling)
- Volume and persistence (tmpfs vs local)
- Security (task validation, credential handling, network)
- Monitoring and observability (metrics, logging, Flower UI)
- References (Celery docs, Flower docs, Redis docs)
6. .env.example (6.8 KB)
Environment variable configuration template.
Sections:
- Redis configuration (broker, result backend, SSL/TLS)
- Database configuration (PostgreSQL)
- Worker configuration (concurrency, timeouts, backoff)
- Celery beat scheduler configuration
- Logging configuration
- Email service configuration
- Task-specific settings (sync batch size, SMTP timeout)
- Security configuration (encryption keys, SSL verification)
- Monitoring and observability (Flower, Prometheus)
- Resource limits (Docker)
- Deployment mode (environment variable)
61 configurable settings with descriptions and sensible defaults.
7. manage.sh (15 KB)
Management script for lifecycle and monitoring commands.
Command Groups:
Lifecycle:
up- Start all servicesdown- Stop all servicesrestart- Restart all servicesrebuild- Rebuild Docker images
Monitoring:
logs [service]- Show logs (worker, beat, flower, redis, all)stats- Worker statisticshealth- Health check all servicesps- Show running containers
Task Management:
tasks [state]- List tasks (active, reserved, registered, failed)task:status <id>- Check task statustask:revoke <id>- Cancel running tasktask:purge- Clear all pending tasks
Queue Management:
queue:status- Show queue statisticsqueue:list- List all queues
Worker Operations:
worker:ping- Check if worker responsiveworker:info- Show worker information
Flower:
flower:open- Open Flower in browser
Development:
dev:logs- Follow all logsdev:shell- Open Python shelldev:test- Run test tasks
Maintenance:
clean:logs- Clear log filesclean:redis- Flush Redisclean:all- Clean all data
Help:
help- Show usage guideversion- Show version
Quick Start
1. Build and Start
cd /path/to/metabuilder
# Start with main compose + Celery
docker-compose -f deployment/docker/docker-compose.development.yml \
-f deployment/docker/celery-worker/docker-compose.yml \
up -d
2. Verify
# Check containers
docker ps | grep metabuilder
# Check health
docker-compose exec celery-worker celery -A tasks.celery_app inspect ping
3. Monitor
# Open Flower dashboard
http://localhost:5556
# Check logs
docker-compose logs -f celery-worker
Configuration Summary
Default Settings
concurrency: 4 # 4 concurrent worker processes
task_timeout: 300 seconds # 5 minutes hard limit
task_soft_timeout: 280 seconds # 4m 40s soft limit
redis_broker: redis://redis:6379/0 # Task queue
redis_result: redis://redis:6379/1 # Task results
database: postgresql://metabuilder:password@postgres:5432/metabuilder_dev
pool: prefork # Process-based (not threaded)
queues: sync,send,delete,spam,periodic # 5 task queue types
Memory Overhead
Per worker process: 100-150 MB
4 workers base: 400-600 MB
Docker limit: 512 MB
Recommended: Reserve 256 MB
Total stack (postgres, redis, workers, beat, flower):
~1.5-2 GB with all services running
Files Modified
None. All files are new in /deployment/docker/celery-worker/ directory.
Dependencies
External Services
- PostgreSQL 16: Database (metadata, credentials, email messages)
- Redis 7: Broker (task queue DB 0) + Result backend (DB 1)
- Docker: Container runtime
- docker-compose: Service orchestration
Python Packages (from services/email_service/requirements.txt)
celery[redis]==5.3.4- Task queue frameworkredis==5.0.1- Redis clientkombu==5.3.4- Message broking librarysqlalchemy==2.0.23- Database ORMpsycopg2-binary==2.9.9- PostgreSQL drivercelery-beat==2.5.0- Task schedulerflower==2.0.1- Monitoring dashboard (in separate image)
Base Images
python:3.11-slim- Worker and beat containers (385 MB)mher/flower:2.0.1- Flower monitoring (Official, lightweight)
Security Considerations
Multi-Tenant
- Every task validates
tenant_idanduser_idparameters - Cannot operate across tenant boundaries
- ACL checks before task execution
Credentials
- Email passwords encrypted in Credential entity
- Decrypted at runtime, never logged
- Encryption: SHA-512 + salt
Network
- All services on internal Docker network
- Only Flower (port 5556) exposed for monitoring
- Worker and Beat isolated from external access
User
- Non-root user
celeryworker(UID 1000) in container - Cannot write to system directories
- Limited filesystem access
Performance Characteristics
Throughput
- 4 concurrent workers × multiple tasks = High throughput
- Prefork pool: No GIL (Global Interpreter Lock) blocking
- Expected: 100-1000 tasks/hour depending on task complexity
Latency
- Queue to execution: <100ms (typical)
- Email sync: 5-30 seconds per mailbox
- Email send: 5-10 seconds per message
Scalability
- Horizontal: Run multiple worker containers
- Vertical: Increase concurrency per container
- Load balancing: Auto via Redis broker
Monitoring Integration
Built-in
- Flower web UI: http://localhost:5556
- Health checks: 30-second intervals
- Logging: Structured JSON format
- Task tracking: Result storage (1 hour TTL)
Optional
- Prometheus metrics: Can be added via prometheus-client
- Log aggregation: Use docker json-file driver with log aggregator
- APM: Integrate with DataDog, New Relic, etc.
Next Steps
- Start Services:
docker-compose up -d - Access Dashboard: http://localhost:5556
- Monitor Tasks:
docker-compose logs -f celery-worker - Review Code:
services/email_service/tasks/celery_app.py - Test Manually:
docker exec ... celery tasks - Production: See SETUP.md Production Deployment section
Support
- Documentation: README.md, SETUP.md, ARCHITECTURE.md
- Logs:
/app/logs/celery-worker.log,/app/logs/celery-beat.log - Monitoring: Flower UI at http://localhost:5556
- Email Service Code:
services/email_service/ - Email Client Plan:
docs/plans/2026-01-23-email-client-implementation.md
Version Information
- Phase: Phase 8 (Email Service Background Tasks)
- Created: January 24, 2026
- Python: 3.11
- Celery: 5.3.4
- Docker: Compose format 3.8
- Status: Production-ready