From 74d503fe36a59a14451451f2cce8c1ab56766afc Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 20 Aug 2026 23:09:28 +0300 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=20=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF=D0=B0=20?= =?UTF-8?q?=D0=B2=20S3=20=D0=BD=D0=B5=20=D0=BF=D1=80=D0=BE=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BB=D0=B0=20TLS=20=E2=80=94=20=D1=83=20aws-cli?= =?UTF-8?q?=20=D1=81=D0=B2=D0=BE=D0=B9=20CA-=D0=B1=D0=B0=D0=BD=D0=B4=D0=BB?= =?UTF-8?q?=20(#2203)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit aws-cli v2 (образ amazon/aws-cli:latest) использует собственный набор корневых сертификатов из botocore, а не системное хранилище контейнера. В нём нет корня, которым подписан сертификат Selectel S3 (s3.ru-1.storage.selcloud.ru), поэтому docker run падал на SSL validation failed / CERTIFICATE_VERIFY_FAILED: self-signed certificate in certificate chain — и ночной S3-upload не проходил каждый раз, хотя ключи и bucket были верны. Проверено на проде: без AWS_CA_BUNDLE — SSL validation failed; с AWS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt (системное хранилище контейнера, содержит нужный GlobalSign-корень) — upload 11 МБ проходит, код возврата 0, объект подтверждён чтением вторым ключом. Правка — одна переменная окружения в docker run в обоих скриптах: - ops/backup.sh (main DB backup) - tradein-mvp/deploy/backup-tradein-db.sh (tradein DB backup, #3004) --- ops/backup.sh | 5 +++++ tradein-mvp/deploy/backup-tradein-db.sh | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/ops/backup.sh b/ops/backup.sh index 33c0ed08..cd0d49f5 100755 --- a/ops/backup.sh +++ b/ops/backup.sh @@ -157,9 +157,14 @@ log "Globals dump OK: ${globals_out} ($(du -h "$globals_out" | cut -f1))" if [[ -n "${S3_ENDPOINT:-}" && -n "${S3_BUCKET:-}" && -n "${S3_ACCESS_KEY:-}" && -n "${S3_SECRET_KEY:-}" ]]; then for f in "$out" "$globals_out"; do log "Uploading to s3://${S3_BUCKET}/$(basename "$f")" + # aws-cli v2 ships its own CA bundle (baked into botocore) instead of + # trusting the system store, and it's missing the root that Selectel's + # cert chains up to — so uploads fail with CERTIFICATE_VERIFY_FAILED + # unless we point it at the container's system store, which has it. docker run --rm \ -e AWS_ACCESS_KEY_ID="$S3_ACCESS_KEY" \ -e AWS_SECRET_ACCESS_KEY="$S3_SECRET_KEY" \ + -e AWS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt \ -v "$LOCAL_BACKUP_DIR":/backup:ro \ amazon/aws-cli:latest \ --endpoint-url "$S3_ENDPOINT" \ diff --git a/tradein-mvp/deploy/backup-tradein-db.sh b/tradein-mvp/deploy/backup-tradein-db.sh index 73814f1e..39eb3644 100755 --- a/tradein-mvp/deploy/backup-tradein-db.sh +++ b/tradein-mvp/deploy/backup-tradein-db.sh @@ -122,9 +122,14 @@ log "Globals ok: $globals_out ($(du -h "$globals_out" | cut -f1))" if [[ -n "${S3_ENDPOINT:-}" && -n "${S3_BUCKET:-}" && -n "${S3_ACCESS_KEY:-}" && -n "${S3_SECRET_KEY:-}" ]]; then for f in "$out" "$globals_out"; do log "Заливаю в s3://${S3_BUCKET}/$(basename "$f")" + # У aws-cli v2 свой CA-бандл (вшит в botocore), а не системное хранилище — + # в нём нет корня, которым подписан сертификат Selectel. Без переменной + # ниже выгрузка падает на CERTIFICATE_VERIFY_FAILED; системное хранилище + # контейнера этот корень содержит. docker run --rm \ -e AWS_ACCESS_KEY_ID="$S3_ACCESS_KEY" \ -e AWS_SECRET_ACCESS_KEY="$S3_SECRET_KEY" \ + -e AWS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt \ -v "$BACKUP_DIR":/backup:ro \ amazon/aws-cli:latest \ --endpoint-url "$S3_ENDPOINT" \ -- 2.45.3