celery-config-patterns
celery-config-patterns
Provides production-ready Celery configuration templates for all major Python frameworks (Django, Flask, FastAPI, standalone) with complete broker setup (Redis, RabbitMQ), security best practices, and framework-specific integration patterns.
Use When
- Configuring Celery for the first time in any Python project
- Integrating Celery with Django, Flask, FastAPI, or standalone applications
- Setting up Redis or RabbitMQ as message broker
- Creating production-ready Celery configurations
- Implementing task routing and queue configurations
- Setting up monitoring and logging for Celery
- Migrating Celery configurations between frameworks
Directory Structure
celery-config-patterns/
├── SKILL.md # This file
├── scripts/
│ ├── validate-config.sh # Validate Celery configuration
│ ├── detect-framework.sh # Auto-detect Python framework
│ ├── generate-config.sh # Generate framework-specific config
│ └── test-broker-connection.sh # Test broker connectivity
├── templates/
│ ├── celery-app-standalone.py # Standalone Celery app
│ ├── celery-app-django.py # Django Celery integration
│ ├── celery-app-flask.py # Flask Celery integration
│ ├── celery-app-fastapi.py # FastAPI Celery integration
│ ├── config-redis.py # Redis broker configuration
│ ├── config-rabbitmq.py # RabbitMQ broker configuration
│ ├── tasks-example.py # Sample task definitions
│ └── beat-schedule.py # Celery Beat schedule config
└── examples/
├── django-setup.md # Complete Django setup guide
├── flask-setup.md # Complete Flask setup guide
├── fastapi-setup.md # Complete FastAPI setup guide
└── standalone-setup.md # Standalone Python setup guide
Instructions
Step 1: Detect Framework
Use the detection script to identify the Python framework:
bash scripts/detect-framework.sh
Detects:
- Django (looks for
manage.py,settings.py) - Flask (looks for Flask imports,
app.py) - FastAPI (looks for FastAPI imports,
main.py) - Standalone (no framework detected)
Step 2: Select Template
Based on framework detection, choose the appropriate template:
| Framework | Template | Integration File |
|---|---|---|
| Django | celery-app-django.py |
projectname/celery.py |
| Flask | celery-app-flask.py |
app/celery.py or celery.py |
| FastAPI | celery-app-fastapi.py |
app/celery.py or celery.py |
| Standalone | celery-app-standalone.py |
celery_app.py |
Step 3: Configure Broker
Choose broker configuration template:
Redis (Recommended for simplicity):
# Use templates/config-redis.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
RabbitMQ (Recommended for production):
# Use templates/config-rabbitmq.py
CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'rpc://'
Step 4: Generate Configuration
Use the generation script:
bash scripts/generate-config.sh --framework=django --broker=redis
bash scripts/generate-config.sh --framework=flask --broker=rabbitmq
bash scripts/generate-config.sh --framework=fastapi --broker=redis
Script will:
- Copy appropriate framework template
- Apply broker configuration
- Create environment file with placeholders
- Add to .gitignore if needed
- Generate setup documentation
Step 5: Validate Configuration
Run validation script before starting Celery:
bash scripts/validate-config.sh
Validates:
- Celery app exists and is importable
- Broker connection is valid
- Configuration syntax is correct
- Required environment variables are set
- Task discovery paths are correct
Step 6: Test Broker Connection
Verify broker connectivity:
bash scripts/test-broker-connection.sh
Tests:
- Broker URL is reachable
- Authentication credentials are valid
- Connection pool can be established
- Basic message routing works
Template Descriptions
celery-app-standalone.py
Standalone Celery application without web framework integration.
Features:
- Basic Celery app configuration
- Task autodiscovery from tasks.py
- Configurable broker and backend
- Logging setup
- Beat schedule integration
Usage:
# celery_app.py
from celery import Celery
app = Celery('myapp')
app.config_from_object('celeryconfig')
@app.task
def add(x, y):
return x + y
celery-app-django.py
Django-specific Celery configuration using Django settings.
Features:
- Reads configuration from Django settings
- Auto-discovers tasks in all installed apps
- Uses Django's database for result backend (optional)
- Integrates with Django logging
- Supports Django-celery-beat for periodic tasks
Usage:
# myproject/celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
celery-app-flask.py
Flask-specific Celery configuration with Flask app context.
Features:
- Flask app factory pattern support
- Celery app context integration
- Uses Flask configuration
- Compatible with Flask-Celery extensions
- Request context handling for tasks
Usage:
# celery.py
from celery import Celery
def make_celery(app):
celery = Celery(app.import_name)
celery.conf.update(app.config)
return celery
# app.py
celery = make_celery(app)
celery-app-fastapi.py
FastAPI-specific Celery configuration with async support.
Features:
- FastAPI lifespan event integration
- Async task support
- Pydantic model validation in tasks
- Background task coordination
- API endpoint integration examples
Usage:
# celery.py
from celery import Celery
celery_app = Celery('fastapi_app')
celery_app.config_from_object('celeryconfig')
# main.py
from fastapi import FastAPI
from celery_app import celery_app
config-redis.py
Redis broker and result backend configuration.
Features:
- Connection pooling
- SSL/TLS support
- Sentinel configuration
- Health checks
- Connection retry logic
Configuration:
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True
CELERY_REDIS_MAX_CONNECTIONS = 50
config-rabbitmq.py
RabbitMQ broker configuration with advanced routing.
Features:
- Virtual host configuration
- Exchange and queue declarations
- Routing keys and bindings
- Dead letter queues
- Priority queues
Configuration:
CELERY_BROKER_URL = 'amqp://user:pass@localhost:5672//'
CELERY_RESULT_BACKEND = 'rpc://'
CELERY_TASK_ROUTES = {
'app.tasks.critical': {'queue': 'critical'},
'app.tasks.normal': {'queue': 'default'},
}
tasks-example.py
Example task definitions with best practices.
Features:
- Basic task examples
- Task with retry logic
- Task with rate limiting
- Task with time limits
- Task with custom routing
- Task with result expiration
Examples:
@app.task(bind=True, max_retries=3)
def process_data(self, data):
try:
# Process data
return result
except Exception as exc:
raise self.retry(exc=exc, countdown=60)
@app.task(rate_limit='10/m')
def send_email(to, subject, body):
# Send email
pass
beat-schedule.py
Celery Beat periodic task scheduling.
Features:
- Crontab schedules
- Interval schedules
- Solar schedules
- Task arguments and kwargs
- Timezone support
Examples:
CELERY_BEAT_SCHEDULE = {
'cleanup-every-midnight': {
'task': 'app.tasks.cleanup',
'schedule': crontab(hour=0, minute=0),
},
'report-every-monday': {
'task': 'app.tasks.weekly_report',
'schedule': crontab(day_of_week=1, hour=9),
},
}
Script Usage
validate-config.sh
Validates Celery configuration for errors.
Usage:
bash scripts/validate-config.sh
bash scripts/validate-config.sh --config=celeryconfig.py
bash scripts/validate-config.sh --app=myapp.celery:app
Checks:
- Python syntax is valid
- Celery app is importable
- Broker URL format is correct
- Required settings are present
- Task modules can be discovered
- No conflicting configurations
Exit Codes:
- 0: Configuration is valid
- 1: Validation errors found
- 2: Import errors
detect-framework.sh
Detects Python web framework in current project.
Usage:
bash scripts/detect-framework.sh
bash scripts/detect-framework.sh /path/to/project
Output:
{
"framework": "django",
"version": "4.2.0",
"celery_location": "myproject/celery.py",
"settings_location": "myproject/settings.py"
}
Detection Logic:
- Django: Check for
manage.pyandsettings.py - Flask: Check for Flask imports and
app.py - FastAPI: Check for FastAPI imports and
main.py - Standalone: No framework files detected
generate-config.sh
Generates framework-specific Celery configuration.
Usage:
bash scripts/generate-config.sh --framework=django --broker=redis
bash scripts/generate-config.sh --framework=flask --broker=rabbitmq --output=celery_config.py
Options:
--framework: django, flask, fastapi, standalone--broker: redis, rabbitmq--output: Custom output file path--with-beat: Include Celery Beat configuration--with-monitoring: Include monitoring configuration
Generated Files:
- Celery app configuration
.env.examplewith broker credentials- Setup documentation
- Example tasks file
test-broker-connection.sh
Tests message broker connectivity.
Usage:
bash scripts/test-broker-connection.sh
bash scripts/test-broker-connection.sh redis://localhost:6379/0
bash scripts/test-broker-connection.sh amqp://guest:guest@localhost:5672//
Tests:
- DNS resolution of broker host
- Port connectivity
- Authentication
- Basic message publish/consume
- Connection pooling
Output:
✓ Broker host is reachable
✓ Port 6379 is open
✓ Authentication successful
✓ Message publish successful
✓ Message consume successful
✓ Connection pool working
All tests passed!
Examples
Django Setup Example
See examples/django-setup.md for complete walkthrough:
- Install dependencies
- Create Celery app in
myproject/celery.py - Configure in
settings.py - Create tasks in app directories
- Run worker and beat
Flask Setup Example
See examples/flask-setup.md for complete walkthrough:
- Install dependencies
- Create Celery factory function
- Initialize with Flask app
- Define tasks
- Run worker
FastAPI Setup Example
See examples/fastapi-setup.md for complete walkthrough:
- Install dependencies
- Create Celery app
- Integrate with FastAPI lifespan
- Create async tasks
- Run worker alongside FastAPI
Standalone Setup Example
See examples/standalone-setup.md for complete walkthrough:
- Install Celery and broker
- Create celery_app.py
- Create celeryconfig.py
- Define tasks
- Run worker
Security Requirements
All configuration templates and examples in this skill follow strict security rules:
Environment Variables:
- Broker credentials use placeholders:
your_redis_password_here - Connection strings never include real passwords
- All sensitive values read from environment
Example .env.example:
# Redis Configuration
CELERY_BROKER_URL=redis://:your_redis_password_here@localhost:6379/0
CELERY_RESULT_BACKEND=redis://:your_redis_password_here@localhost:6379/0
# RabbitMQ Configuration
CELERY_BROKER_URL=amqp://your_rabbitmq_user:your_rabbitmq_password@localhost:5672//
Code Examples:
# ALWAYS read from environment
import os
CELERY_BROKER_URL = os.getenv('CELERY_BROKER_URL', 'redis://localhost:6379/0')
Security Checklist:
- No hardcoded broker passwords
- No hardcoded database credentials
- All examples use environment variables
- .env added to .gitignore
- .env.example provided with placeholders
- Documentation explains credential management
Configuration Best Practices
Production Settings:
# Task execution
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
# Performance
CELERY_WORKER_PREFETCH_MULTIPLIER = 4
CELERY_WORKER_MAX_TASKS_PER_CHILD = 1000
CELERY_BROKER_POOL_LIMIT = 10
# Reliability
CELERY_TASK_ACKS_LATE = True
CELERY_TASK_REJECT_ON_WORKER_LOST = True
CELERY_TASK_TIME_LIMIT = 300
CELERY_TASK_SOFT_TIME_LIMIT = 240
Development Settings:
# Easier debugging
CELERY_TASK_ALWAYS_EAGER = True
CELERY_TASK_EAGER_PROPAGATES = True
Troubleshooting
Broker Connection Failed:
# Test broker connectivity
bash scripts/test-broker-connection.sh
# Check broker is running
# Redis: redis-cli ping
# RabbitMQ: rabbitmqctl status
Tasks Not Discovered:
# Validate configuration
bash scripts/validate-config.sh
# Check task module paths
celery -A myapp inspect registered
Import Errors:
# Verify Python path includes project
export PYTHONPATH="${PYTHONPATH}:/path/to/project"
# Check Celery app is importable
python -c "from myapp.celery import app; print(app)"
Requirements
Python Packages:
- celery>=5.3.0
- redis>=4.5.0 (for Redis broker)
- kombu>=5.3.0 (for RabbitMQ broker)
Framework-Specific:
- Django: django-celery-beat, django-celery-results
- Flask: Flask-Celery
- FastAPI: No additional packages
Broker Requirements:
- Redis: redis-server running on port 6379
- RabbitMQ: rabbitmq-server running on port 5672
System Tools:
- bash (for scripts)
- python3 (3.8+)
- Access to broker (Redis/RabbitMQ)
Skill Version: 1.0.0 Last Updated: 2025-11-16