From 1bf00821acb66a408bacc0d6bf041457f8d5f4f2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 15 Jul 2026 01:22:10 +0000 Subject: [PATCH] =?UTF-8?q?wal-g-cfg:=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BF=D0=B8=D0=B9=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D0=B2?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При конфигурации файлового хранилища проверяется наличие каталога назначения. Если каталог отсутствует, он создаётся с правами postgres:postgres (базовый каталог на шаге конфигурации и подкаталог каждого кластера в цикле обработки). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01SiMQMpcCNttwku3vbdkhjn --- pgsql/pgpro/wal-g-scripts/wal-g-cfg.sh | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pgsql/pgpro/wal-g-scripts/wal-g-cfg.sh b/pgsql/pgpro/wal-g-scripts/wal-g-cfg.sh index c7938e1..9f63017 100644 --- a/pgsql/pgpro/wal-g-scripts/wal-g-cfg.sh +++ b/pgsql/pgpro/wal-g-scripts/wal-g-cfg.sh @@ -68,6 +68,22 @@ json_escape() { printf '%s' "$s" } +# Гарантирует существование каталога для файловых копий. +# Если каталог отсутствует — создаёт его и выдаёт права postgres:postgres. +ensure_backup_dir() { + local dir="$1" + if [[ -d "$dir" ]]; then + echo "INFO: каталог для копий уже существует: ${dir}" + return 0 + fi + echo "INFO: каталог для копий не обнаружен, создаю: ${dir}" + if ! install -d -o "$PG_SUPERUSER" -g "$PG_SUPERUSER" -m 700 "$dir"; then + echo "ERROR: не удалось создать каталог ${dir}" >&2 + return 1 + fi + echo "OK: создан каталог ${dir} (владелец ${PG_SUPERUSER}:${PG_SUPERUSER})" +} + # Жив ли кластер на порту (по unix-сокету). pg_alive() { local port="$1" timeout="${2:-3}" @@ -481,6 +497,11 @@ else WALG_FILE_PREFIX_BASE="$(prompt_default 'Базовый каталог WALG_FILE_PREFIX' '/backup')" WALG_FILE_PREFIX_BASE="${WALG_FILE_PREFIX_BASE%/}" J_WALG_FILE_PREFIX_BASE="$(json_escape "$WALG_FILE_PREFIX_BASE")" + + # Проверяем/создаём базовый каталог для файловых копий (права postgres:postgres). + if ! ensure_backup_dir "$WALG_FILE_PREFIX_BASE"; then + exit 1 + fi fi # ============================================================================= @@ -530,6 +551,14 @@ for PGPORT in "${SELECTED_PORTS[@]}"; do echo "INFO: PGDATA = ${PGDATA}" + # --- Для файлового варианта гарантируем каталог назначения текущего кластера --- + if [[ "$BACKEND" == "file" ]]; then + if ! ensure_backup_dir "${WALG_FILE_PREFIX_BASE}/${PGPORT}"; then + echo "WARN: пропуск порта ${PGPORT}: нет каталога для копий" >&2 + continue + fi + fi + # --- Решаем, нужно ли (пере)записывать конфиг --- WRITE_CFG=1 if [[ -f "$CFG" ]]; then