From c524d202597aa3a644272ac6a49fe65dde4c7f2b Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Sun, 18 Oct 2026 04:48:54 +0500 Subject: [PATCH] =?UTF-8?q?=D0=91=D1=8D=D0=BA=D0=B0=D0=BF=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D0=B5=D1=82=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=BD,=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D1=83=D1=80=20=D0=BD=D0=B0=20VPS=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=83=D1=89=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - добавлена проверка запущенных сервисов контура на VPS перед выгрузкой - если clickhouse не запущен или каталога проекта нет, скрипт пишет причину в лог и выходит с кодом 0 - ошибки ssh по-прежнему считаются ошибкой и возвращают ненулевой код - версия 0.3.8 --- DEPLOY.md | 3 +++ README.md | 2 +- common/version.py | 2 +- scripts/clickhouse_backup.sh | 22 ++++++++++++++++++++++ tests/test_version.py | 2 +- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/DEPLOY.md b/DEPLOY.md index a392da9..1ab1727 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -112,6 +112,9 @@ Cron на домашнем сервере (вчерашний день уже з Ошибка на любом шаге оставляет данные на VPS (партиции не удаляются) и пишет понятный лог. Импорт дня идемпотентен: повторный прогон не дублирует строки. +Если контур на VPS не запущен (нет работающего `clickhouse` или не найден каталог проекта), +скрипт пишет об этом в лог и завершается с кодом 0 — для cron это не ошибка. + ## Обновление и откат ```bash diff --git a/README.md b/README.md index 980574e..c8d14b9 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ make backup E=test # на домашнем сервере: ./scripts/clickho ## Версионирование -- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.3.7`. +- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.3.8`. - Схема — SemVer-подобная (`MAJOR.MINOR.PATCH`); git-тег = `v` + версия (`v0.1`). - Docker-образы тегируются версией (Блок 2), события ClickHouse получают `bot_version` (Блок 3). - Выпуск: изменить `common/version.py` → коммит → аннотированный тег `vX.Y` → `git push --tags`. diff --git a/common/version.py b/common/version.py index 4eac622..9408623 100644 --- a/common/version.py +++ b/common/version.py @@ -7,4 +7,4 @@ from __future__ import annotations -__version__ = "0.3.7" +__version__ = "0.3.8" diff --git a/scripts/clickhouse_backup.sh b/scripts/clickhouse_backup.sh index 3511552..b420ab3 100644 --- a/scripts/clickhouse_backup.sh +++ b/scripts/clickhouse_backup.sh @@ -59,12 +59,34 @@ exec docker compose -p "$contour" --env-file "env/$contour.env" -f "$compose_fil REMOTE } +# Какие сервисы контура запущены на VPS (пусто, если проекта/контура нет). +vps_running_services() { + "${SSH[@]}" bash -s "$VPS_PROJECT_DIR" "$E" "$VPS_COMPOSE_FILE" <<'REMOTE' +set -uo pipefail +if [ ! -d "$1" ]; then + echo "каталог проекта $1 на VPS не найден" >&2 + exit 0 +fi +cd "$1" || exit 0 +docker compose -p "$2" --env-file "env/$2.env" -f "$3" ps --services --status running 2>/dev/null || true +REMOTE +} + DAY="$(TZ="$BACKUP_TZ" date -d 'yesterday' '+%Y-%m-%d')" PARTITION="${DAY//-/}" GRACE_CUTOFF="$(TZ="$BACKUP_TZ" date -d "${BACKUP_GRACE_DAYS} days ago" '+%Y%m%d')" log "Бэкап событий контура ${E} за ${DAY} (грейс ${BACKUP_GRACE_DAYS} дней, порог ${GRACE_CUTOFF})" +# Бот может быть не запущен (или ещё не развёрнут) — это не ошибка, просто пропускаем прогон. +if ! RUNNING="$(vps_running_services)"; then + fail "не удалось получить состояние контура ${E} на VPS (проверьте ssh и VPS_SSH)" +fi +if ! grep -qx 'clickhouse' <<<"$RUNNING"; then + log "Контур ${E} на VPS не запущен — бэкап пропущен, на VPS ничего не меняем" + exit 0 +fi + mkdir -p "$BACKUP_DIR" ARCHIVE="${BACKUP_DIR}/events_${DAY}.parquet.gz" diff --git a/tests/test_version.py b/tests/test_version.py index 2f52b2c..791455c 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -7,4 +7,4 @@ from common import __version__ def test_version_is_set(): assert __version__ - assert __version__ == "0.3.7" + assert __version__ == "0.3.8"