Mayan EDMS utilise Celery pour exécuter toutes les opérations lourdes en arrière-plan : conversion de fichiers, OCR, indexation, signatures GPG, envoi d'emails, recherche, etc. L'architecture repose sur 5 workers spécialisés couvrant 30+ queues avec des priorités et des caractéristiques distinctes.
Fichiers clés :
mayan/celery.py — initialisation de l'application Celerymayan/settings/base.py — paramètres Celery de basemayan/apps/task_manager/ — classes Worker, CeleryQueue, TaskTypemayan/apps/*/queues.py — définition des queues par appBroker (Redis / RabbitMQ)
│
├── Worker A ──► converter, events_fast
├── Worker B ──► documents_*, parsing, indexing, workflows, metadata, sources...
├── Worker C ──► périodiques, trash, exports, mailing, duplicates...
├── Worker D ──► ocr, file_metadata, signatures_slow, storage_periodic
└── Worker E ──► search, search_slow
Beat Scheduler (django_celery_beat) ──► tâches périodiques → queues transient
| Paramètre | Valeur par défaut |
|---|---|
| Concurrence | 4 processus |
| Priorité (nice) | 0 (plus haute) |
| Mémoire max/enfant | 500 Mo |
| Tâches max/enfant | 4 000 |
Queues :
converter (transient) — génération d'images pour la visionneuseevents_fast — enregistrement d'événementsUsage : Traite les requêtes d'affichage de documents. Doit répondre le plus vite possible.
| Paramètre | Valeur par défaut |
|---|---|
| Concurrence | 4 processus |
| Priorité (nice) | 2 |
| Mémoire max/enfant | 500 Mo |
| Tâches max/enfant | 4 000 |
Queues :
documents_fast — création de DocumentFiledocuments_slow — upload, déplacement vers la corbeilledocuments_file — checksum, mimetype, nombre de pages, tailledocuments_file_slow — suppression de fichiersdocuments_version — opérations sur les versions (append, reset, export, delete)parsing — extraction de texte (document parsing)indexing — ajout/suppression de documents dans les indexstorage — suppression des uploads partagésfile_caching — purge des partitions de cachesources — actions de source en arrière-planworkflows — déclenchement de workflows, vérification d'escaladesmetadata — ajout/suppression de métadonnées obligatoiresUsage : Cœur du traitement documentaire. C'est le worker le plus sollicité.
| Paramètre | Valeur par défaut |
|---|---|
| Concurrence | 4 processus |
| Priorité (nice) | 10 |
| Mémoire max/enfant | 500 Mo |
| Tâches max/enfant | 1 000 |
Queues :
documents_periodic (transient) — vérification des délais de corbeille et de suppression, purge des stubsdocuments_trash — vidage de la corbeille, suppression définitivesources_periodic (transient) — vérification des sources planifiées (watchfolder, email)events_slow (transient) — purge, export et nettoyage des événementsstatistics (transient) — exécution des statistiquesfile_caching_slow — purge complète des cachesdocuments_downloads — compression de fichiers pour téléchargementduplicates — scan et nettoyage des doublonsduplicates_slow — scan global des doublonsdocument_exports — export de versions de documentsmailing — envoi d'emailscheckouts_periodic (transient) — vérification des checkouts expirésworkflows_slow — vérification globale des escalades de workflowindexing_slow — reconstruction d'indexUsage : Maintenance et tâches secondaires. La priorité basse (nice=10) évite d'impacter les workers A et B.
| Paramètre | Valeur par défaut |
|---|---|
| Concurrence | 1 processus |
| Priorité (nice) | 15 (plus basse) |
| Mémoire max/enfant | 500 Mo |
| Tâches max/enfant | 500 |
Queues :
ocr — traitement OCR des pages de documentsfile_metadata — extraction de métadonnées de fichiers (tous drivers)signatures_slow — vérification de signatures manquantes, rafraîchissementstorage_periodic (transient) — suppression des uploads et téléchargements périmésUsage : Opérations longues et intensives en CPU/IO. Un seul processus évite la saturation des ressources.
| Paramètre | Valeur par défaut |
|---|---|
| Concurrence | 4 processus |
| Priorité (nice) | 2 |
| Mémoire max/enfant | 500 Mo |
| Tâches max/enfant | 20 000 |
Queues :
search — indexation/déindexation d'instances, purge des resultsetssearch_slow — réindexation complète du backendUsage : Dédié exclusivement à la recherche. Le max_tasks_per_child élevé (20 000) reflète des tâches légères et nombreuses.
Toutes les variables sont préfixées MAYAN_ dans Docker.
| Variable | Worker A | Worker B | Worker C | Worker D | Worker E |
|---|---|---|---|---|---|
WORKER_*_CONCURRENCY |
4 | 4 | 4 | 1 | 4 |
WORKER_*_MAX_MEMORY_PER_CHILD |
500 000 | 500 000 | 500 000 | 500 000 | 500 000 |
WORKER_*_MAX_TASKS_PER_CHILD |
4 000 | 4 000 | 1 000 | 500 | 20 000 |
WORKER_*_NICE_LEVEL |
0 | 2 | 10 | 15 | 2 |
Exemple de configuration personnalisée :
# docker-compose.yml ou supervisor
environment:
MAYAN_WORKER_B_CONCURRENCY: 8
MAYAN_WORKER_B_MAX_MEMORY_PER_CHILD: 1000000
MAYAN_WORKER_D_CONCURRENCY: 2
Note :
MAX_MEMORY_PER_CHILDest en octets (500 000 = ~488 Mo).
environment:
MAYAN_CELERY_BROKER_URL: redis://redis:6379/0
MAYAN_CELERY_RESULT_BACKEND: redis://redis:6379/0
environment:
MAYAN_CELERY_BROKER_URL: amqp://mayan:password@rabbitmq:5672/mayan
MAYAN_CELERY_RESULT_BACKEND: redis://redis:6379/0
| Variable | Défaut | Description |
|---|---|---|
CELERY_BROKER_URL |
memory:// |
URL de connexion au broker |
CELERY_BROKER_LOGIN_METHOD |
AMQPLAIN |
Méthode d'authentification AMQP |
CELERY_BROKER_USE_SSL |
None |
Activer SSL sur la connexion broker |
CELERY_RESULT_BACKEND |
None |
URL du backend de résultats |
Attention :
memory://est le défaut — il ne fonctionne qu'en développement (processus unique). En production, Redis ou RabbitMQ est obligatoire.
| Variable | Défaut | Description |
|---|---|---|
CELERY_ACCEPT_CONTENT |
('json',) |
Formats de messages acceptés |
CELERY_BEAT_SCHEDULER |
django_celery_beat.schedulers.DatabaseScheduler |
Classe du scheduler périodique |
CELERY_DISABLE_RATE_LIMITS |
True |
Désactiver les rate limits par tâche |
CELERY_ENABLE_UTC |
True |
Utiliser UTC |
CELERY_RESULT_SERIALIZER |
json |
Sérialisation des résultats |
CELERY_TASK_ALWAYS_EAGER |
False |
Exécution synchrone (dev uniquement) |
CELERY_TASK_CREATE_MISSING_QUEUES |
True |
Créer les queues manquantes automatiquement |
CELERY_TASK_DEFAULT_QUEUE |
celery |
Queue par défaut |
CELERY_TASK_EAGER_PROPAGATES |
True |
Propager les exceptions en mode eager |
CELERY_TASK_SERIALIZER |
json |
Sérialisation des messages de tâche |
CELERY_TIMEZONE |
UTC |
Timezone des tâches |
MAYAN_CELERY_CLASS |
celery.Celery |
Classe de l'application Celery |
Le scheduler django_celery_beat (base de données) gère toutes les tâches récurrentes. Les intervalles sont configurables via les smart settings.
| Tâche | Queue | Description |
|---|---|---|
task_document_type_document_trash_periods_check |
documents_periodic |
Vérifie les délais de mise à la corbeille par type de document |
task_document_type_document_stubs_delete |
documents_periodic |
Supprime les stubs expirés |
task_document_type_trashed_document_delete_periods_check |
documents_periodic |
Vérifie les délais de suppression définitive |
task_workflow_instance_do_check_escalation_all |
workflows_slow |
Vérifie les escalades de workflow sur toutes les instances |
task_shared_upload_stale_delete |
storage_periodic |
Supprime les uploads partagés périmés |
task_download_files_stale_delete |
storage_periodic |
Supprime les fichiers de téléchargement périmés |
task_event_prune |
events_slow |
Purge les anciens événements |
task_check_expired_check_outs |
checkouts_periodic |
Libère les checkouts expirés |
task_saved_resultset_expired_delete |
search |
Purge les resultsets de recherche expirés (toutes les 5 min) |
Les intervalles sont des smart settings modifiables via variable d'environnement. Exemple :
# Vérifier les escalades de workflow toutes les 10 minutes (en secondes)
MAYAN_WORKFLOW_STATE_ESCALATION_CHECK_INTERVAL: 600
| Paramètre | Développement | Production |
|---|---|---|
CELERY_BROKER_URL |
memory:// |
redis://... ou amqp://... |
CELERY_TASK_ALWAYS_EAGER |
True |
False |
CELERY_RESULT_BACKEND |
Non défini | redis://... |
En développement (CELERY_TASK_ALWAYS_EAGER=True), toutes les tâches s'exécutent synchroniquement dans le processus principal — aucun worker séparé n'est nécessaire.
celery -A mayan worker \
--loglevel=ERROR \
-Ofair \
--queues=documents_fast,documents_slow,documents_file \
--concurrency=4
# Obtenir les queues d'un worker
./manage.py platforms_template worker_queues --worker=worker_b
# → documents_fast,documents_slow,documents_file,documents_file_slow,...
# Lancer le worker avec son script
/usr/local/bin/run_worker.sh worker_b
celery -A mayan beat --loglevel=ERROR
Worker A (nice=0, concurrency=4)
├── converter [transient] task_content_object_image_generate
└── events_fast task_event_commit
Worker B (nice=2, concurrency=4)
├── documents_fast task_document_file_create
├── documents_slow task_document_file_upload, task_document_move_to_trash
├── documents_file task_document_file_checksum_update, _mimetype_, _page_count_, _size_, _version_create_
├── documents_file_slow task_document_file_delete
├── documents_version task_document_version_page_list_*, _export_, _delete_
├── parsing task_parse_document_file
├── indexing task_index_instance_document_add, _remove_
├── storage task_shared_upload_delete
├── file_caching task_cache_partition_purge
├── sources task_source_backend_action_background_task
├── workflows task_launch_workflow_for, task_workflow_instance_do_check_escalation
└── metadata task_remove_metadata_type, task_add_required_metadata_type
Worker C (nice=10, concurrency=4)
├── documents_periodic [transient] task_document_type_document_trash_periods_check, _stubs_delete_, _trashed_delete_
├── documents_trash task_trash_can_empty, task_trashed_document_delete
├── sources_periodic [transient] task_source_action_execute
├── events_slow [transient] task_event_prune, _queryset_clear_, _queryset_export_
├── statistics [transient] task_execute_statistic
├── file_caching_slow task_cache_purge
├── documents_downloads task_document_file_compress
├── duplicates task_duplicates_clean_empty_lists, task_duplicates_scan_for
├── duplicates_slow task_duplicates_scan_all
├── document_exports task_document_version_export
├── mailing task_send_object
├── checkouts_periodic [transient] task_check_expired_check_outs
├── workflows_slow task_workflow_instance_do_check_escalation_all, task_launch_all_workflows
└── indexing_slow task_index_template_rebuild
Worker D (nice=15, concurrency=1)
├── ocr task_document_version_ocr_process, _page_ocr_process_, _ocr_finished_
├── file_metadata task_document_file_metadata_process, _finished_, task_metadata_driver_process
├── signatures_slow task_verify_missing_embedded_signature, task_refresh_signature_information
└── storage_periodic [transient] task_shared_upload_stale_delete, task_download_files_stale_delete
Worker E (nice=2, concurrency=4)
├── search task_deindex_instance, task_index_instance, task_index_instances,
│ task_index_related_instance_m2m, task_saved_resultset_expired_delete
└── search_slow task_reindex_backend
Queues transient : livraison en mémoire uniquement (delivery_mode=1). Si le broker redémarre, les messages en attente sont perdus. Utilisé pour les tâches périodiques car elles seront replanifiées de toute façon.
environment:
# Worker B : plus de processus pour les gros volumes documentaires
MAYAN_WORKER_B_CONCURRENCY: 16
MAYAN_WORKER_B_MAX_MEMORY_PER_CHILD: 1000000
# Worker D : autoriser 2 processus OCR parallèles
MAYAN_WORKER_D_CONCURRENCY: 2
# docker-compose.yml
worker_b_1:
image: mayanedms/mayanedms:egyptian
command: /usr/local/bin/run_worker.sh worker_b
environment:
MAYAN_WORKER_B_CONCURRENCY: 8
worker_b_2:
image: mayanedms/mayanedms:egyptian
command: /usr/local/bin/run_worker.sh worker_b
environment:
MAYAN_WORKER_B_CONCURRENCY: 8
Les deux instances de worker_b consomment les mêmes queues en parallèle (work stealing).
| Déploiement | Worker A | Worker B | Worker C | Worker D | Worker E |
|---|---|---|---|---|---|
| Petit (< 10k docs) | 2 | 4 | 2 | 1 | 2 |
| Moyen (10k–100k docs) | 4 | 8 | 4 | 2 | 4 |
| Grand (> 100k docs) | 4 | 16 | 8 | 4 | 8 |
# Workers connectés au broker
docker exec mayan-app-1 celery -A mayan inspect ping
# Tâches en cours d'exécution
docker exec mayan-app-1 celery -A mayan inspect active
# Tâches dans une queue spécifique (Redis)
docker exec mayan-redis-1 redis-cli llen documents_fast
Administration → Outils → Task Manager affiche :
flower:
image: mher/flower
command: celery --broker=redis://redis:6379/0 flower --port=5555
ports:
- "5555:5555"
| Besoin | Action |
|---|---|
| Accélérer la conversion/visionneuse | Augmenter MAYAN_WORKER_A_CONCURRENCY |
| Accélérer le traitement des documents | Augmenter MAYAN_WORKER_B_CONCURRENCY |
| Accélérer l'OCR | Augmenter MAYAN_WORKER_D_CONCURRENCY (attention RAM) |
| Accélérer la recherche | Augmenter MAYAN_WORKER_E_CONCURRENCY |
| Changer le broker | MAYAN_CELERY_BROKER_URL |
| Exécuter sans workers séparés (dev) | MAYAN_CELERY_TASK_ALWAYS_EAGER=true |
| Surveiller les queues | Redis CLI llen <queue_name> ou Flower |
| Identifier quelle queue traite une tâche | Voir le mapping complet ci-dessus |