Skip to main content

CLI, Security & Extensions

This guide covers the command-line interface (CLI), the bootstep mechanism for extending worker functionality, and message signing security.

Command-Line Interface​

The Celery CLI is built using click and provides a unified entry point for all Celery commands.

Global vs. Subcommand Options​

In Celery 5.0+, global options (like -A for the app instance) must be placed before the subcommand. Using them after the subcommand will result in an error.

# Correct usage
celery -A proj worker -l INFO

# Incorrect usage (will trigger a custom error message)
celery worker -A proj -l INFO

The CLI entry point is defined in celery/bin/celery.py. It supports several global options:

  • -A, --app: The Celery app instance to use.
  • -b, --broker: Broker URL.
  • --result-backend: Result backend URL.
  • --workdir: Directory to change to at startup.
  • -C, --no-color: Disable colorized output.

Starting a Worker​

The worker subcommand (implemented in celery/bin/worker.py) is used to start a worker instance.

# Start a worker with 4 concurrent processes
celery -A proj worker --concurrency=4

# Start a worker using the eventlet pool
celery -A proj worker -P eventlet -c 1000

# Start a worker listening to specific queues
celery -A proj worker -Q hipri,lopri

Common worker options include:

  • -n, --hostname: Set a custom node name.
  • -c, --concurrency: Number of child processes or threads.
  • -P, --pool: Pool implementation (prefork, eventlet, gevent, solo).
  • -l, --loglevel: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).
  • -B, --beat: Also run the celery beat periodic task scheduler (Note: Not recommended for production).

Extending the Worker with Bootsteps​

Bootsteps allow you to hook into the worker lifecycle to add custom components or services. The worker is composed of several default bootsteps defined in celery/worker/components.py.

Creating a Custom Bootstep​

To create a bootstep, subclass celery.bootsteps.Step or celery.bootsteps.StartStopStep.

from celery import bootsteps

class MyCustomStep(bootsteps.StartStopStep):
requires = ('celery.worker.components:Pool',)

def __init__(self, parent, **kwargs):
# parent is the WorkController (Worker) instance
print(f'Initializing custom step for {parent.hostname}')

def start(self, parent):
# Logic to run when the worker starts
print('Custom step started')

def stop(self, parent):
# Logic to run when the worker stops
print('Custom step stopped')

Registering Bootsteps​

You can register your custom bootstep by adding it to the app.steps['worker'] set.

from celery import Celery

app = Celery('myapp')
app.steps['worker'].add(MyCustomStep)

Conditional Inclusion​

Use include_if to decide whether a step should be loaded based on the worker configuration.

class OptionalStep(bootsteps.Step):
def include_if(self, parent):
return parent.app.conf.my_custom_setting

def create(self, parent):
# This is called if include_if returns True
return self

Message Security​

Celery provides a message signing system to ensure that tasks and results have not been tampered with. This is implemented via the auth serializer in celery/security/.

Configuring Message Signing​

To enable message signing, you must provide a private key, a certificate, and a directory containing trusted certificates.

from celery import Celery

app = Celery('secure_app')

app.conf.update(
security_key='ssl/worker.key',
security_certificate='ssl/worker.pem',
security_cert_store='ssl/*.pem',
task_serializer='auth',
event_serializer='auth',
accept_content=['auth'],
result_accept_content=['json']
)

# Initialize the security system
app.setup_security()

Requirements and Constraints​

  • Cryptography Library: The cryptography library must be installed.
  • Serializer Configuration: You must set task_serializer to 'auth' and include 'auth' in accept_content.
  • Certificate Store: The security_cert_store should be a glob pattern (e.g., /var/ssl/*.pem) pointing to the public certificates of all trusted clients/workers.
  • Insecure Serializers: Calling setup_security() automatically disables insecure serializers (like pickle) unless they are explicitly allowed.

Troubleshooting Security​

If the security settings are incomplete, app.setup_security() will raise an ImproperlyConfigured exception. Ensure that all three paths (security_key, security_certificate, and security_cert_store) are valid and accessible.

# Example of a common error if settings are missing
# celery.exceptions.ImproperlyConfigured: You have to configure a special task serializer...