Бэкап пропускает прогон, если контур на VPS не запущен

- добавлена проверка запущенных сервисов контура на VPS перед выгрузкой
- если clickhouse не запущен или каталога проекта нет, скрипт пишет причину в лог и выходит с кодом 0
- ошибки ssh по-прежнему считаются ошибкой и возвращают ненулевой код
- версия 0.3.8
This commit is contained in:
MpakobecEx 2026-10-18 04:48:54 +05:00
parent a28bd622c7
commit 14cf86e31c
5 changed files with 28 additions and 3 deletions

View File

@ -112,6 +112,9 @@ Cron на домашнем сервере (вчерашний день уже з
Ошибка на любом шаге оставляет данные на VPS (партиции не удаляются) и пишет понятный лог.
Импорт дня идемпотентен: повторный прогон не дублирует строки.
Если контур на VPS не запущен (нет работающего `clickhouse` или не найден каталог проекта),
скрипт пишет об этом в лог и завершается с кодом 0 — для cron это не ошибка.
## Обновление и откат
```bash

View File

@ -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`.

View File

@ -7,4 +7,4 @@
from __future__ import annotations
__version__ = "0.3.7"
__version__ = "0.3.8"

View File

@ -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"

View File

@ -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"