From c7263b4088cd948593f12114cb65b1f80b5baa03 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 21 Aug 2026 15:13:25 +0500 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF?= =?UTF-8?q?=D1=8B=20=E2=80=94=20+x=20=D0=BD=D0=B0=20deploy-=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=B0=D1=85=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B5=D0=BF=D0=BB=D0=BE=D0=B5=20tradein,=20=D1=82=D0=B8?= =?UTF-8?q?=D1=85=D0=B8=D0=B9=20s3=20cp=20(#3005)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Почему: cron на проде звал оба бэкап-скрипта сырым путём (и tradein, и — вопреки комментарию в deploy.yml — основной ops/backup.sh), то есть держался только на git-режиме файла; потеря бита = молчаливый отказ бэкапа, как в #71. Cron-строки переведены на `bash ` на самом хосте (21.08, копия старого crontab ~/crontab.bak.20260821); здесь — вторая линия защиты по образцу deploy.yml:541 и честная шапка скрипта. Попутно: `aws s3 cp` без --no-progress пишет в лог по ~300 строк прогресса за каждый прогон (/tmp/tradein-backup.log), за ними не видно итоговых строк — убрано в обоих скриптах. Refs #3005 --- .forgejo/workflows/deploy-tradein.yml | 5 +++++ ops/backup.sh | 2 +- tradein-mvp/deploy/backup-tradein-db.sh | 8 +++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/deploy-tradein.yml b/.forgejo/workflows/deploy-tradein.yml index 76d332bf..f2a2e7d3 100644 --- a/.forgejo/workflows/deploy-tradein.yml +++ b/.forgejo/workflows/deploy-tradein.yml @@ -689,6 +689,11 @@ jobs: chmod 600 .env.runtime set -a; source .env.runtime; set +a + # Re-assert +x на deploy-скриптах (#3005, по образцу deploy.yml ops/*.sh из #71). + # Cron зовёт backup-tradein-db.sh через `bash`, так что бит ему не нужен — + # но любой другой вызов сырым путём не должен зависеть от git-режима файла. + chmod +x deploy/*.sh 2>/dev/null || true + # External network для Caddy (он в основном gendesign-стеке) docker network inspect gendesign_shared >/dev/null 2>&1 \ || docker network create gendesign_shared diff --git a/ops/backup.sh b/ops/backup.sh index 4c6c92b2..997c9558 100755 --- a/ops/backup.sh +++ b/ops/backup.sh @@ -168,7 +168,7 @@ if [[ -n "${S3_ENDPOINT:-}" && -n "${S3_BUCKET:-}" && -n "${S3_ACCESS_KEY:-}" && -v "$LOCAL_BACKUP_DIR":/backup:ro \ amazon/aws-cli:latest \ --endpoint-url "$S3_ENDPOINT" \ - s3 cp "/backup/$(basename "$f")" "s3://${S3_BUCKET}/" + s3 cp --no-progress "/backup/$(basename "$f")" "s3://${S3_BUCKET}/" done log "S3 upload OK" else diff --git a/tradein-mvp/deploy/backup-tradein-db.sh b/tradein-mvp/deploy/backup-tradein-db.sh index fc523de3..95bfea43 100755 --- a/tradein-mvp/deploy/backup-tradein-db.sh +++ b/tradein-mvp/deploy/backup-tradein-db.sh @@ -5,8 +5,10 @@ # Запускается из cron на прод-хосте. pg_dump идёт через `docker exec` # (локальный сокет внутри контейнера — пароль не нужен). # -# Crontab пример (ежедневно в 04:30 UTC): -# 30 4 * * * /opt/gendesign/tradein-mvp/deploy/backup-tradein-db.sh >> /tmp/tradein-backup.log 2>&1 +# Crontab (ежедневно в 04:30 по времени хоста = 01:30 UTC; на проде именно так, #3005). +# Вызывать через `bash `, а не сырым путём — тогда потеря бита +x не сломает +# бэкап молча (инцидент #71 у основного бэкапа): +# 30 4 * * * bash /opt/gendesign/tradein-mvp/deploy/backup-tradein-db.sh >> /tmp/tradein-backup.log 2>&1 # # Restore: # gunzip -c tradein-YYYYMMDD-HHMMSS.sql.gz | \ @@ -133,7 +135,7 @@ if [[ -n "${S3_ENDPOINT:-}" && -n "${S3_BUCKET:-}" && -n "${S3_ACCESS_KEY:-}" && -v "$BACKUP_DIR":/backup:ro \ amazon/aws-cli:latest \ --endpoint-url "$S3_ENDPOINT" \ - s3 cp "/backup/$(basename "$f")" "s3://${S3_BUCKET}/" + s3 cp --no-progress "/backup/$(basename "$f")" "s3://${S3_BUCKET}/" done log "Выгрузка в S3 ok" else