Бэкап событий работает на живом контуре, а не только в режиме пропуска

Проверка на VPS вскрыла две поломки, которые не проявлялись, пока контур не запущен: ssh склеивал аргументы SQL-запроса в одну строку, и запрос падал с синтаксической ошибкой, а импорт на домашнем сервере требовал clickhouse-client, которого там нет. Теперь аргументы экранируются, клиент можно подменить обёрткой через docker compose (CLICKHOUSE_CLIENT), а скрипты в репозитории получили бит выполнения — иначе make check и make backup не запускались из свежего клона.
This commit is contained in:
MpakobecEx 2026-10-19 03:17:22 +05:00
parent c524d20259
commit 33e48d2803
8 changed files with 20 additions and 4 deletions

View File

@ -101,6 +101,16 @@ cp env/backup.env.example env/backup.env # VPS_SSH, VPS_PORT, VPS_PROJECT_DIR,
(`VPS_PROJECT_DIR`, там запускается `docker compose`); на домашнем сервере — `clickhouse-client`
и локальный ClickHouse. Настройка SSH-доступа — `deploy/ssh-access.md`.
Если ставить `clickhouse-client` на хост не хочется, укажите в `env/backup.env` переменную
`CLICKHOUSE_CLIENT` — путь к обёртке, которая выполняет клиент внутри контейнера:
```bash
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")/.."
exec docker compose --env-file env/backup.env -f docker-compose.yml exec -T clickhouse clickhouse-client "$@"
```
Проверочный прогон (без cron): `make backup E=test` или `./scripts/clickhouse_backup.sh test`.
Cron на домашнем сервере (вчерашний день уже закрыт, время московское):

View File

@ -104,7 +104,7 @@ make backup E=test # на домашнем сервере: ./scripts/clickho
## Версионирование
- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.3.8`.
- Единый источник версии — `common/version.py` (`__version__`), текущая — `0.3.9`.
- Схема — 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.8"
__version__ = "0.3.9"

0
scripts/check_contour.sh Normal file → Executable file
View File

8
scripts/clickhouse_backup.sh Normal file → Executable file
View File

@ -49,8 +49,14 @@ SSH=(ssh -i "$VPS_SSH_KEY" -p "$VPS_PORT" -o BatchMode=yes -o ServerAliveInterva
# Запустить команду на VPS. Пароль ClickHouse читается из окружения контейнера,
# поэтому клиент вызывается через `sh -c` уже внутри контейнера.
# ssh склеивает аргументы в одну строку и отдаёт её удалённому shell, поэтому каждый
# аргумент экранируем: в SQL есть пробелы, скобки и кавычки.
vps_ch() {
"${SSH[@]}" bash -s "$VPS_PROJECT_DIR" "$E" "$VPS_COMPOSE_FILE" "$@" <<'REMOTE'
local quoted=() arg
for arg in "$@"; do
quoted+=("$(printf '%q' "$arg")")
done
"${SSH[@]}" bash -s "$VPS_PROJECT_DIR" "$E" "$VPS_COMPOSE_FILE" "${quoted[@]}" <<'REMOTE'
set -euo pipefail
project_dir="$1"; contour="$2"; compose_file="$3"; shift 3
cd "$project_dir"

0
scripts/clickhouse_import.sh Normal file → Executable file
View File

0
start.sh Normal file → Executable file
View File

View File

@ -7,4 +7,4 @@ from common import __version__
def test_version_is_set():
assert __version__
assert __version__ == "0.3.8"
assert __version__ == "0.3.9"