Бэкап пропускает прогон, если контур на VPS не запущен
- добавлена проверка запущенных сервисов контура на VPS перед выгрузкой - если clickhouse не запущен или каталога проекта нет, скрипт пишет причину в лог и выходит с кодом 0 - ошибки ssh по-прежнему считаются ошибкой и возвращают ненулевой код - версия 0.3.8
This commit is contained in:
parent
a28bd622c7
commit
c524d20259
|
|
@ -112,6 +112,9 @@ Cron на домашнем сервере (вчерашний день уже з
|
||||||
Ошибка на любом шаге оставляет данные на VPS (партиции не удаляются) и пишет понятный лог.
|
Ошибка на любом шаге оставляет данные на VPS (партиции не удаляются) и пишет понятный лог.
|
||||||
Импорт дня идемпотентен: повторный прогон не дублирует строки.
|
Импорт дня идемпотентен: повторный прогон не дублирует строки.
|
||||||
|
|
||||||
|
Если контур на VPS не запущен (нет работающего `clickhouse` или не найден каталог проекта),
|
||||||
|
скрипт пишет об этом в лог и завершается с кодом 0 — для cron это не ошибка.
|
||||||
|
|
||||||
## Обновление и откат
|
## Обновление и откат
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
|
||||||
|
|
@ -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`).
|
- Схема — SemVer-подобная (`MAJOR.MINOR.PATCH`); git-тег = `v` + версия (`v0.1`).
|
||||||
- Docker-образы тегируются версией (Блок 2), события ClickHouse получают `bot_version` (Блок 3).
|
- Docker-образы тегируются версией (Блок 2), события ClickHouse получают `bot_version` (Блок 3).
|
||||||
- Выпуск: изменить `common/version.py` → коммит → аннотированный тег `vX.Y` → `git push --tags`.
|
- Выпуск: изменить `common/version.py` → коммит → аннотированный тег `vX.Y` → `git push --tags`.
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,4 @@
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
__version__ = "0.3.7"
|
__version__ = "0.3.8"
|
||||||
|
|
|
||||||
|
|
@ -59,12 +59,34 @@ exec docker compose -p "$contour" --env-file "env/$contour.env" -f "$compose_fil
|
||||||
REMOTE
|
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')"
|
DAY="$(TZ="$BACKUP_TZ" date -d 'yesterday' '+%Y-%m-%d')"
|
||||||
PARTITION="${DAY//-/}"
|
PARTITION="${DAY//-/}"
|
||||||
GRACE_CUTOFF="$(TZ="$BACKUP_TZ" date -d "${BACKUP_GRACE_DAYS} days ago" '+%Y%m%d')"
|
GRACE_CUTOFF="$(TZ="$BACKUP_TZ" date -d "${BACKUP_GRACE_DAYS} days ago" '+%Y%m%d')"
|
||||||
|
|
||||||
log "Бэкап событий контура ${E} за ${DAY} (грейс ${BACKUP_GRACE_DAYS} дней, порог ${GRACE_CUTOFF})"
|
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"
|
mkdir -p "$BACKUP_DIR"
|
||||||
ARCHIVE="${BACKUP_DIR}/events_${DAY}.parquet.gz"
|
ARCHIVE="${BACKUP_DIR}/events_${DAY}.parquet.gz"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,4 @@ from common import __version__
|
||||||
|
|
||||||
def test_version_is_set():
|
def test_version_is_set():
|
||||||
assert __version__
|
assert __version__
|
||||||
assert __version__ == "0.3.7"
|
assert __version__ == "0.3.8"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue