From be205b3b14f493089d0a42cc38b90e3f3c2623a5 Mon Sep 17 00:00:00 2001 From: emelinda Date: Mon, 10 Aug 2026 01:11:53 +0300 Subject: [PATCH] =?UTF-8?q?Processing:=20=D0=BE=D0=B4=D0=B8=D0=BD=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D1=80=D0=B5=D1=82=20=D0=BD=D0=B0=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D1=87,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20django-auth.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Следующая задача падала на run.py:91 data = json.load(file) json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) то есть снова читала пустой файл — на этот раз django-auth.json. Аннотации пода показали, почему: VAULT_MOUNT_PATH у движка ОДИН НА ВСЕ файлы. Он подставляет его в каждую аннотацию, меняя только имя ключа: agent-inject-file-django-auth: django-auth.json agent-inject-template-django-auth: {{- with secret "secrets/data/apps/processing/yc-s3" -}} Ключа django-auth.json в том секрете не было, агент отрендерил пустоту. Поэтому путь переименован в secrets/apps/processing/job-files: имя yc-s3 описывало один из файлов и врало о содержимом. В секрет добавлен ключ django-auth.json — объект {"token": "..."}, а не голая строка, потому что задача читает файл целиком через json.load. Значение то же, что у workspaces в DJANGO_BASIC_AUTH: base64 от логина и пароля администратора. Правило на будущее: появился новый файл, который движок кладёт в под задачи, — добавляется ключ в этот же секрет, с именем ровно как у файла. --- aero/roles/sarex_stack/defaults/main.yml | 14 +++++++++++++- apps/processing/aero/kustomization.yaml | 10 ++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/aero/roles/sarex_stack/defaults/main.yml b/aero/roles/sarex_stack/defaults/main.yml index aa31285..1d6da0c 100644 --- a/aero/roles/sarex_stack/defaults/main.yml +++ b/aero/roles/sarex_stack/defaults/main.yml @@ -407,8 +407,20 @@ vault_app_secrets: # # endpoint БЕЗ схемы: протокол задаёт use_ssl. У нас MinIO внутри кластера по # http, поэтому use_ssl: false. - - path: secrets/apps/processing/yc-s3 + # + # Путь ОДИН НА ВСЕ файлы задач: движок подставляет VAULT_MOUNT_PATH в каждую + # аннотацию, меняя только имя ключа. Добавляется файл — добавляется ключ + # СЮДА, с именем ровно как у файла. + - path: secrets/apps/processing/job-files data: + # Basic-токен администратора django. Задача читает файл целиком как JSON + # (run.py: json.load), поэтому здесь именно объект с ключом token, а не + # голая строка. Значение — то же, что у workspaces в DJANGO_BASIC_AUTH: + # base64 от "логин:пароль" учётки, которую заводит роль. + # Без ключа файл рендерится пустым и задача падает на + # json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) + django-auth.json: >- + {"token": "{{ (superuser_name ~ ':' ~ superuser_password) | b64encode }}"} yc-s3-service-account.json: >- {"endpoint": "minio.minio.svc.cluster.local:9000", "bucket_name": "{{ sarex_django_s3_bucket }}", diff --git a/apps/processing/aero/kustomization.yaml b/apps/processing/aero/kustomization.yaml index f893903..9409b10 100644 --- a/apps/processing/aero/kustomization.yaml +++ b/apps/processing/aero/kustomization.yaml @@ -275,14 +275,20 @@ patches: # {{- with secret "" -}} # {{ index .Data.data "yc-s3-service-account.json" }} # Отсюда два следствия: путь пишется в форме чтения KV v2 (с /data/), а в - # секрете обязан быть ключ с именем ФАЙЛА — yc-s3-service-account.json. + # секрете обязан быть ключ с именем ФАЙЛА. + # + # Путь ОДИН НА ВСЕ ФАЙЛЫ, которые движок кладёт в поды задач: он + # подставляет VAULT_MOUNT_PATH в каждую аннотацию, меняя только имя + # ключа. Так, для django-auth аннотация ссылается на этот же путь и ищет + # в нём ключ django-auth.json. Поэтому имя пути нейтральное (job-files), + # а не по имени одного из файлов, — иначе оно врёт о содержимом. # Сам секрет кладёт ansible, vault_app_secrets. - op: add path: /spec/values/services/backend/envs/- value: name: VAULT_MOUNT_PATH value: - _default: secrets/data/apps/processing/yc-s3 + _default: secrets/data/apps/processing/job-files # S3 из Vault, как у api. - op: add