From 16bd8c06b52de1702a8c958dbc50dae387042baf Mon Sep 17 00:00:00 2001 From: MpakobecEx Date: Mon, 19 Oct 2026 03:17:22 +0500 Subject: [PATCH] =?UTF-8?q?=D0=91=D1=8D=D0=BA=D0=B0=D0=BF=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D0=BD=D0=B0=20=D0=B6=D0=B8=D0=B2=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80=D0=B5,=20=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B2?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверка на VPS вскрыла две поломки, которые не проявлялись, пока контур не запущен: ssh склеивал аргументы SQL-запроса в одну строку, и запрос падал с синтаксической ошибкой, а импорт на домашнем сервере требовал clickhouse-client, которого там нет. Теперь аргументы экранируются, клиент можно подменить обёрткой через docker compose (CLICKHOUSE_CLIENT), а скрипты в репозитории получили бит выполнения — иначе make check и make backup не запускались из свежего клона. --- DEPLOY.md | 10 ++++++++++ README.md | 2 +- common/version.py | 2 +- scripts/check_contour.sh | 0 scripts/clickhouse_backup.sh | 8 +++++++- scripts/clickhouse_import.sh | 0 start.sh | 0 tests/test_version.py | 2 +- 8 files changed, 20 insertions(+), 4 deletions(-) mode change 100644 => 100755 scripts/check_contour.sh mode change 100644 => 100755 scripts/clickhouse_backup.sh mode change 100644 => 100755 scripts/clickhouse_import.sh mode change 100644 => 100755 start.sh diff --git a/DEPLOY.md b/DEPLOY.md index 1ab1727..443b309 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -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 на домашнем сервере (вчерашний день уже закрыт, время московское): diff --git a/README.md b/README.md index c8d14b9..637aca0 100644 --- a/README.md +++ b/README.md @@ -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`. diff --git a/common/version.py b/common/version.py index 9408623..13e8aef 100644 --- a/common/version.py +++ b/common/version.py @@ -7,4 +7,4 @@ from __future__ import annotations -__version__ = "0.3.8" +__version__ = "0.3.9" diff --git a/scripts/check_contour.sh b/scripts/check_contour.sh old mode 100644 new mode 100755 diff --git a/scripts/clickhouse_backup.sh b/scripts/clickhouse_backup.sh old mode 100644 new mode 100755 index b420ab3..3903a0b --- a/scripts/clickhouse_backup.sh +++ b/scripts/clickhouse_backup.sh @@ -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" diff --git a/scripts/clickhouse_import.sh b/scripts/clickhouse_import.sh old mode 100644 new mode 100755 diff --git a/start.sh b/start.sh old mode 100644 new mode 100755 diff --git a/tests/test_version.py b/tests/test_version.py index 791455c..3e2765b 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.8" + assert __version__ == "0.3.9"