From c2a9bae0dbed08a36de7ffbeb6d680a70d83e623 Mon Sep 17 00:00:00 2001 From: emelinda Date: Sat, 8 Aug 2026 18:12:32 +0300 Subject: [PATCH] =?UTF-8?q?Celery=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D1=91?= =?UTF-8?q?=D0=BD=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80=D0=B5=20?= =?UTF-8?q?aero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Worker был отключён патчем удаления, пока не было очередей. RabbitMQ и MinIO развёрнуты, схема БД накачена — включаем. Расхождения с base у celery ровно те же, что у backend: нет Kafka, MinIO живёт внутри кластера. Аннотации инжекции несуществующих секретов убраны — иначе vault-agent-init не отрендерит шаблон и под навсегда останется в Init:Error. SERVER_ZITADEL_ENABLED не трогаем: в base у celery он уже False. Миграции и создание администратора в стартовый скрипт worker'а намеренно НЕ добавлены: схемой владеет backend, а два процесса, катящих миграции при одновременном старте, — гонка на ровном месте. Тег образа выравнен с backend (production_f813140d вместо production_a96dead0). Разные версии кода у web и worker ломаются не при старте, а на конкретной задаче, когда worker десериализует аргументы по своей версии модели. --- apps/django/aero/kustomization.yaml | 60 ++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/apps/django/aero/kustomization.yaml b/apps/django/aero/kustomization.yaml index 65828eb..f1600d2 100644 --- a/apps/django/aero/kustomization.yaml +++ b/apps/django/aero/kustomization.yaml @@ -19,18 +19,58 @@ patches: target: kind: ConfigMap name: nginx-configmap - # --- Состав контура ------------------------------------------------------- - # celery выключен: очереди подключим вместе с остальными фоновыми задачами. - # s3-proxy ВКЛЮЧЁН — он отдаёт медиафайлы браузеру с CORS и Range, а бакет - # уже создан, так что проверять его есть на чём. + # --- celery: те же правки, что и у backend -------------------------------- + # Worker крутит тот же образ и те же настройки, поэтому и расхождения с base + # у него ровно те же: нет Kafka, нет Zitadel, MinIO живёт внутри кластера. + # Обоснования — в блоке backend ниже, здесь не дублирую. + # + # SERVER_ZITADEL_ENABLED правки не требует: в base у celery он уже "False" + # (в отличие от backend). - target: {kind: HelmRelease, name: celery} patch: | - $patch: delete - apiVersion: helm.toolkit.fluxcd.io/v2 - kind: HelmRelease - metadata: - name: celery - namespace: django + - op: remove + path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-kafka + - op: remove + path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-kafka + - op: remove + path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-secret-django-common + - op: remove + path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-common + - op: replace + path: /spec/values/services/celery/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-django-s3 + value: |- + {{- with secret "secrets/data/minio/apps/django" }} + AWS_S3_ENDPOINT_URL=http://minio.minio.svc.cluster.local:9000 + S3_HOST=http://minio.minio.svc.cluster.local:9000 + {{- $buckets := index .Data.data "buckets" }} + S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }} + S3_LOGIN={{ index .Data.data "access_key" }} + S3_PASSWORD={{ index .Data.data "secret_key" }} + {{- end }} + + # Стартовый скрипт без подключения django-kafka: этого секрета в контуре + # нет. migrate и создание администратора сюда НЕ добавляются — схемой + # владеет backend, а два процесса, катящих миграции наперегонки при + # одновременном старте, — это гонка на ровном месте. + - op: replace + path: /spec/values/services/celery/deployment/args/_default/0 + value: | + set -a + [ -f /vault/secrets/django-postgresql ] && . /vault/secrets/django-postgresql + [ -f /vault/secrets/django-rabbitmq ] && . /vault/secrets/django-rabbitmq + [ -f /vault/secrets/django-s3 ] && . /vault/secrets/django-s3 + [ -f /vault/secrets/django-jwt-private ] && export JWT_PRIVATE_KEY="$(cat /vault/secrets/django-jwt-private)" + [ -f /vault/secrets/django-jwt-public ] && export JWT_PUBLIC_KEY="$(cat /vault/secrets/django-jwt-public)" + set +a + exec celery -A config worker -B -l info -E -Q default -n default_worker.%h --concurrency=2 + + # Тег образа выравнен с backend. В base у celery production_a96dead0, а у + # backend production_f813140d — worker и web крутили бы разный код, и + # рассинхрон вылезал бы не при старте, а на конкретной задаче: worker + # десериализует аргументы по своей версии модели. + - op: replace + path: /spec/values/services/celery/image/name/_default + value: cr.yandex/crp3ccidau046kdj8g9q/backend:production_f813140d # --- backend: убираем зависимости, которых в контуре нет ------------------ - target: {kind: HelmRelease, name: backend}