From 1f336b6f9392dbfd725644efa9ea41c175c03bdd Mon Sep 17 00:00:00 2001 From: emelinda Date: Mon, 10 Aug 2026 01:35:27 +0300 Subject: [PATCH] =?UTF-8?q?Django:=20s3-proxy=20=D1=85=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=A7=D0=A3=D0=96=D0=9E=D0=99=20MinIO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раздача медиа отвечала 500 на каждую плитку, а под капотом был настоящий ответ S3: SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided status code: 403, request id: 18CA4386CBFA3E5D Ключ к разгадке — что ответ пришёл БЫСТРО (0.07 с) и с настоящим request id. То есть это не таймаут до недоступного хоста: s3-proxy реально достучался до чужого MinIO. В base адрес зашит внутри vault-шаблона: AWS_API_ENDPOINT=https://minio.contour.infra.sarex.tech и это домен другого контура. Наши ключи там не подходят — к счастью, иначе контур молча читал бы и писал в чужое хранилище. Ровно та же ловушка, что была у backend и celery: значение внутри шаблона аннотации, через values не перекрывается, поэтому заменяется аннотация целиком. Тогда я поправил два релиза из трёх и до s3-proxy не дошёл. После правки чужой домен в рендере clusters/aero/apps не встречается ни разу. --- apps/django/aero/kustomization.yaml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/apps/django/aero/kustomization.yaml b/apps/django/aero/kustomization.yaml index 11cd372..982f086 100644 --- a/apps/django/aero/kustomization.yaml +++ b/apps/django/aero/kustomization.yaml @@ -101,6 +101,32 @@ patches: path: /spec/values/services/celery/image/name/_default value: cr.yandex/crp3ccidau046kdj8g9q/backend:production_f813140d + # --- s3-proxy: S3 внутри кластера ------------------------------------------ + # В base адрес MinIO зашит ВНУТРИ vault-шаблона: + # AWS_API_ENDPOINT=https://minio.contour.infra.sarex.tech + # Это чужой контур. Через values не перекрыть — значение внутри шаблона + # аннотации, поэтому заменяем аннотацию целиком, как у backend и celery. + # + # Проявлялось не отказом в соединении, а тем, что s3-proxy ДОСТУЧАЛСЯ до + # чужого MinIO и получил от него настоящий ответ S3: + # SignatureDoesNotMatch: The request signature we calculated does not + # match the signature you provided + # наружу это выглядело как 500 на каждую плитку /media/orthophotos/... + # Наши ключи в чужом хранилище, разумеется, не подходят — и хорошо, что так: + # иначе контур молча читал бы и писал в чужой S3. + - target: {kind: HelmRelease, name: s3-proxy} + patch: | + - op: replace + path: /spec/values/services/s3-proxy/podAnnotations/_default/vault.hashicorp.com~1agent-inject-template-s3 + value: | + {{- with secret "secrets/data/minio/apps/django" }} + AWS_API_ENDPOINT=http://minio.minio.svc.cluster.local:9000 + {{- $buckets := index .Data.data "buckets" }} + AWS_S3_BUCKET={{ if gt (len $buckets) 0 }}{{ index (index $buckets 0) "name" }}{{ else }}django{{ end }} + AWS_ACCESS_KEY_ID={{ index .Data.data "access_key" }} + AWS_SECRET_ACCESS_KEY={{ index .Data.data "secret_key" }} + {{- end }} + # --- backend: убираем зависимости, которых в контуре нет ------------------ - target: {kind: HelmRelease, name: backend} patch: |