From 7e2c45d440e0f98886ff610c78e264a6d17de10b Mon Sep 17 00:00:00 2001 From: Mohamad Abuelhagag Date: Tue, 2 Jun 2026 01:48:40 +0300 Subject: [PATCH] fix: Switch from Azure Service Bus to RabbitMQ for task queue Azure Service Bus is incompatible with Kombu 5.x used by Celery 5.3.6. All versions of azure-servicebus 7.x have breaking module structure changes that prevent Kombu from connecting, causing production worker failures. Changes: - Remove hardcoded LOKOLE_QUEUE_BROKER_SCHEME=azureservicebus from docker-compose.prod.yml - Add RabbitMQ service (rabbitmq:management-alpine) to production compose - Worker now depends on RabbitMQ service - Add URL encoding for broker credentials to handle special characters (/, =, +) - Add rabbitmq_data volume for queue persistence - Uses existing credentials (LOKOLE_EMAIL_SERVER_QUEUES_SAS_NAME/KEY) for RabbitMQ auth Production setup: Add these two lines to secrets/azure.env: LOKOLE_QUEUE_BROKER_SCHEME=amqp LOKOLE_EMAIL_SERVER_QUEUES_NAMESPACE=rabbitmq This fixes the production worker failures with TypeError and RuntimeError when trying to connect to Azure Service Bus. --- docker/docker-compose.prod.yml | 19 ++++++++++++++++++- opwen_email_server/config.py | 7 ++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index 4ada43338..cf9b16b6b 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -7,7 +7,6 @@ x-shared-secret-environment: HOST: 0.0.0.0 WEBAPP_PORT: 8080 LOKOLE_STORAGE_PROVIDER: AZURE_BLOBS - LOKOLE_QUEUE_BROKER_SCHEME: azureservicebus CONNEXION_SPEC: dir:/app/opwen_email_server/swagger CELERY_QUEUE_NAMES: all TESTING_UI: "False" @@ -44,3 +43,21 @@ services: image: ascoderu/opwenserver_app:latest command: ["/app/docker/app/run-celery.sh"] <<: *shared-secret-environment + depends_on: + - rabbitmq + + rabbitmq: + image: rabbitmq:management-alpine + environment: + # Use same creds from azure.env for convenience + RABBITMQ_DEFAULT_USER: ${LOKOLE_EMAIL_SERVER_QUEUES_SAS_NAME} + RABBITMQ_DEFAULT_PASS: ${LOKOLE_EMAIL_SERVER_QUEUES_SAS_KEY} + volumes: + - rabbitmq_data:/var/lib/rabbitmq + restart: always + # Optional: expose management UI + # ports: + # - 15672:15672 + +volumes: + rabbitmq_data: diff --git a/opwen_email_server/config.py b/opwen_email_server/config.py index a9f8780b7..1030fbd84 100644 --- a/opwen_email_server/config.py +++ b/opwen_email_server/config.py @@ -1,3 +1,5 @@ +from urllib.parse import quote + from environs import Env env = Env() @@ -65,6 +67,9 @@ QUEUE_BROKER_PASSWORD = env('LOKOLE_EMAIL_SERVER_QUEUES_SAS_KEY') QUEUE_BROKER_HOST = env('LOKOLE_EMAIL_SERVER_QUEUES_NAMESPACE') if env('LOKOLE_QUEUE_BROKER_SCHEME', ''): - QUEUE_BROKER = f"{QUEUE_BROKER_SCHEME}://{QUEUE_BROKER_USERNAME}:{QUEUE_BROKER_PASSWORD}@{QUEUE_BROKER_HOST}" + # URL-encode credentials to handle special characters + username = quote(QUEUE_BROKER_USERNAME, safe='') + password = quote(QUEUE_BROKER_PASSWORD, safe='') + QUEUE_BROKER = f"{QUEUE_BROKER_SCHEME}://{username}:{password}@{QUEUE_BROKER_HOST}" else: QUEUE_BROKER = env('LOKOLE_QUEUE_BROKER_URL', '')