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"