From eb1a11a5fdf3bff01406d45dd4989af71d16cade Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 11:37:39 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D1=80=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B8=D0=B7=20fai?= =?UTF-8?q?lover-=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2=20=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF-=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=B8=D0=BF=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rejoin-replica.sh: пароль репликации убран из скрипта (теперь через ~postgres/.pgpass), реальные IP заменены примерами из 192.0.2.0/24, удалены неиспользуемые переменные - keepalived.conf: реальный VIP заменён примером - backup-db-1c.sh и backup-db-pgsql.sh объединены в backup-db.sh: * set -euo pipefail — ошибка pg_dump больше не маскируется pigz * проверка целостности архива (gzip -t), битый файл удаляется * ротация считает и удаляет бэкапы отдельно по каждой БД * логи чистятся по возрасту, конфиг — /etc/backup-pg.conf * убран reindexdb после VACUUM FULL (избыточен) - pg_setup.sh, chr_install.sh: мелкие правки по shellcheck - CI: порог shellcheck ужесточён с error до warning https://claude.ai/code/session_01EbjDWNvEDZvxvnxzc5GDWE --- .github/workflows/lint.yml | 4 +- README.md | 10 +-- pgsql/backup-db-1c.sh | 126 ------------------------------- pgsql/backup-db-pgsql.sh | 122 ------------------------------ pgsql/backup-db.sh | 122 ++++++++++++++++++++++++++++++ pgsql/backup-pg.conf.example | 25 ++++++ pgsql/failover/keepalived.conf | 2 +- pgsql/failover/rejoin-replica.sh | 15 ++-- pgsql/pg_setup.sh | 3 - proxmox/chr_install.sh | 2 +- 10 files changed, 160 insertions(+), 271 deletions(-) delete mode 100644 pgsql/backup-db-1c.sh delete mode 100644 pgsql/backup-db-pgsql.sh create mode 100755 pgsql/backup-db.sh create mode 100644 pgsql/backup-pg.conf.example diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 7220d92..3f6f56a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,10 +11,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - # Порог error: при -S warning есть известные находки в бэкап-скриптах, - # после их исправления порог можно ужесточить до warning. - name: Run shellcheck - run: find . -name '*.sh' -print0 | xargs -0 shellcheck -S error + run: find . -name '*.sh' -print0 | xargs -0 shellcheck -S warning psscriptanalyzer: runs-on: ubuntu-latest diff --git a/README.md b/README.md index e27d26d..fd9ec68 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,10 @@ zabbix/ Шаблоны Zabbix | Скрипт | Назначение | |---|---| | `pg_setup.sh` | Установка и первичная настройка Postgres Pro 1C на Debian/Ubuntu: локали, часовой пояс, репозиторий, initdb с `--tune=1c`, pg_hba, пароль postgres. Параметры: `--pgver`, `--timezone`, `--lang`, `--postgres-pass`. Запуск от root. | -| `backup-db-1c.sh` | Бэкап (pg_dump + pigz) и обслуживание (vacuumdb/reindexdb) баз Postgres Pro 1C по списку из файла. Ротация старых копий. Для cron. | -| `backup-db-pgsql.sh` | То же для ванильного PostgreSQL (бинарники из `/usr/bin`). | +| `backup-db.sh` | Бэкап (pg_dump + pigz, с проверкой целостности архива) и обслуживание (vacuumdb) баз PostgreSQL / Postgres Pro по списку из файла. Ротация бэкапов отдельно по каждой БД, логов — по возрасту. Для cron. | +| `backup-pg.conf.example` | Пример конфига для `backup-db.sh` (копируется в `/etc/backup-pg.conf`): пути, retention, каталог бинарников. | -Зависимости бэкап-скриптов: `pigz`. Список баз — текстовый файл (по умолчанию `/var/lib/pgpro/scripts/DB`), по одной базе на строку. +Зависимости `backup-db.sh`: `pigz`. Список баз — текстовый файл (по умолчанию `/var/lib/pgpro/scripts/DB`), по одной базе на строку, `#` — комментарий. ### pgsql/failover/ @@ -56,7 +56,7 @@ zabbix/ Шаблоны Zabbix | `promote-standby.sh` | Повышение реплики до мастера (вызывается keepalived через `notify_master`). | | `rejoin-replica.sh` | При старте узла: если второй узел — живой мастер, пересоздаёт себя как реплику через `pg_basebackup`; иначе повышается до мастера. | -> ⚠️ Перед использованием замените в конфигах и скриптах IP-адреса, пароль keepalived и учётные данные репликации на свои (пароль репликации — через `~postgres/.pgpass`, права 600). +> ⚠️ Перед использованием замените в конфигах и скриптах IP-адреса (указаны примеры из 192.0.2.0/24) и пароль keepalived на свои. Пароль репликации в скриптах не хранится — создайте `~postgres/.pgpass` (права 600) со строкой `:5432:*:replicator:<пароль>`. ## routeros/ @@ -97,5 +97,5 @@ zabbix/ Шаблоны Zabbix GitHub Actions прогоняет линтеры на каждый push и pull request: -- **shellcheck** для всех `*.sh` (порог — ошибки); +- **shellcheck** для всех `*.sh` (порог — предупреждения); - **PSScriptAnalyzer** для всех `*.ps1` (порог — ошибки). diff --git a/pgsql/backup-db-1c.sh b/pgsql/backup-db-1c.sh deleted file mode 100644 index ca1e875..0000000 --- a/pgsql/backup-db-1c.sh +++ /dev/null @@ -1,126 +0,0 @@ -#!/bin/bash -PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/pgpro/1c-14/bin; - -#Скрипт для бэкапа и обслуживания баз данных PostgreSQL 1C - -# -PGPRO=/opt/pgpro/1c-14/bin - -#Базы для бэкапа -BASES="/var/lib/pgpro/scripts/DB" - -#Переменная даты и времени -DATA="$(date +%Y-%m-%d_%H-%M)" - -#Директория для логов -LOGS=/var/lib/pgpro/service_logs - -#Директория для бэкапов -BACKUPDIR=/var/lib/backup/pgpro - -#Минимальное количество бэкапов -FILEBACK="28" - - -CheckDir() -{ - if touch "$1"/"$2".test > /dev/null 2>&1 ; then - rm "$1"/"$2".test - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка создания файла, нет директории "$1" или отсутвуют права" - return 1 - fi -} - - -CheckDB() -{ - if [[ ! -f "$1" ]]; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка, файл со списком БД для резервного копирования "$1" не найден." >> $LOGS/$DATA.log - exit - else - return 0 - fi -} - - -Backup() -{ - CheckDir "$BACKUPDIR" "$DATA" - CheckDB "$BASES" - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт резервного копирования" "$1" >> "$LOGS"/"$DATA".log - sudo -u postgres $PGPRO/pg_dump -U postgres "$1" | pigz > "$BACKUPDIR"/"$DATA"-"$1".sql.gz 2>>"$LOGS"/"$DATA".log - if [[ $? -eq 0 ]]; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Резервное копирование закончено" "$1" >> "$LOGS"/"$DATA".log - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка создания резервной копии" "$1" >> "$LOGS"/"$DATA".log - return 1 - fi -} - - -ClearOldFiles() -{ - local FILES - local NUM="1" - FILES=$(find "$BACKUPDIR" -maxdepth 1 -type f -name "*.gz" | wc -l) - if [ "$FILES" -gt "$FILEBACK" ] ; then - FILEBACK=$((FILEBACK+NUM)) - cd $BACKUPDIR || exit - ls -tp | grep -v '/$' | tail -n +$FILEBACK | xargs -I {} rm -- {} - cd $LOGS || exit - ls -tp | grep -v '/$' | tail -n +$FILEBACK | xargs -I {} rm -- {} - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Очистка старых файлов и логов" >> "$LOGS"/"$DATA".log - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка очистки старых файлов и логов" >> "$LOGS"/"$DATA".log - return 1 - fi -} - - -Maintance() -{ - if [[ $(date "+%u") == 6 ]]; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт vacuumdb FULL" "$1" >> "$LOGS"/"$DATA".log - if sudo -Hiu postgres $PGPRO/vacuumdb --full --analyze --username postgres --dbname "$1" > /dev/null 2>&1 ; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец vacuumdb FULL" "$1" >> "$LOGS"/"$DATA".log - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка vacuumdb FULL" "$1" >> "$LOGS"/"$DATA".log - exit - fi - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт переиндексации" "$1" >> "$LOGS"/"$DATA".log - if sudo -Hiu postgres $PGPRO/reindexdb --username postgres --dbname "$1" > /dev/null 2>&1 ; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец переиндексации" "$1" >> "$LOGS"/"$DATA".log - else - exit - fi - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт vacuumdb" "$1" >> "$LOGS"/"$DATA".log - if sudo -Hiu postgres $PGPRO/vacuumdb --analyze --username postgres --dbname "$1" > /dev/null 2>&1 ; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец vacuumdb" "$1" >> "$LOGS"/"$DATA".log - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка vacuumdb" "$1" >> "$LOGS"/"$DATA".log - exit - fi - return 0 - fi -} - - -for i in $(cat $BASES); - do - if Backup $i ; then - Maintance $i - else - exit - fi - done - -ClearOldFiles $i - -(date +%Y-%m-%d_%H-%M) > /var/log/timestamp -echo "$(date +%Y-%m-%d_%H-%M-%S)" "Создание файла для мониторинга" >> "$LOGS"/"$DATA".log diff --git a/pgsql/backup-db-pgsql.sh b/pgsql/backup-db-pgsql.sh deleted file mode 100644 index 45f5f0e..0000000 --- a/pgsql/backup-db-pgsql.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash -#Скрипт для бэкапа и обслуживания баз данных PostgreSQL - - -#Базы для бэкапа -BASES="/var/lib/pgpro/scripts/DB" - -#Переменная даты и времени -DATA="$(date +%Y-%m-%d_%H-%M)" - -#Директория для логов -LOGS=/var/lib/pgpro/service_logs - -#Директория для бэкапов -BACKUPDIR=/var/lib/pgpro/_backup - -#Минимальное количество бэкапов -FILEBACK="5" - - -CheckDir() -{ - if touch "$1"/"$2".test > /dev/null 2>&1 ; then - rm "$1"/"$2".test - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка создания файла, нет директории "$1" или отсутвуют права" - return 1 - fi -} - - -CheckDB() -{ - if [[ ! -f "$1" ]]; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка, файл со списком БД для резервного копирования "$1" не найден." >> $LOGS/$DATA.log - exit - else - return 0 - fi -} - - -Backup() -{ - CheckDir "$BACKUPDIR" "$DATA" - CheckDir "$LOGS" "$DATA" - CheckDB "$BASES" - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт резервного копирования" "$1" >> "$LOGS"/"$DATA".log - /usr/bin/pg_dump -U postgres "$1" | pigz > "$BACKUPDIR"/"$DATA"-"$1".sql.gz 2>>"$LOGS"/"$DATA".log - if [[ $? -eq 0 ]]; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Резервное копирование закончено" "$1" >> "$LOGS"/"$DATA".log - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка создания резервной копии" "$1" >> "$LOGS"/"$DATA".log - return 1 - fi -} - - -ClearOldFiles() -{ - local FILES - local NUM="1" - FILES=$(find "$BACKUPDIR" -maxdepth 1 -type f -name "*-""$1"".sql.gz" | wc -l) - if [ "$FILES" -gt "$FILEBACK" ] ; then - FILEBACK=$((FILEBACK+NUM)) - cd $BACKUPDIR || exit - ls -tp | grep -v '/$' | tail -n +$FILEBACK | xargs -I {} rm -- {} - cd $LOGS || exit - ls -tp | grep -v '/$' | tail -n +$FILEBACK | xargs -I {} rm -- {} - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Очистка старых файлов и логов" >> "$LOGS"/"$DATA".log - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка очистки старых файлов и логов" >> "$LOGS"/"$DATA".log - return 1 - fi -} - - -Maintance() -{ - if [[ $(date "+%u") == 6 ]]; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт vacuumdb FULL" "$1" >> "$LOGS"/"$DATA".log - if /usr/bin/vacuumdb --full --analyze --username postgres --dbname "$1" > /dev/null 2>&1 ; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец vacuumdb FULL" "$1" >> "$LOGS"/"$DATA".log - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка vacuumdb FULL" "$1" >> "$LOGS"/"$DATA".log - exit - fi - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт переиндексации" "$1" >> "$LOGS"/"$DATA".log - if /usr/bin/reindexdb --username postgres --dbname "$1" > /dev/null 2>&1 ; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец переиндексации" "$1" >> "$LOGS"/"$DATA".log - else - exit - fi - return 0 - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Старт vacuumdb" "$1" >> "$LOGS"/"$DATA".log - if /usr/bin/vacuumdb --analyze --username postgres --dbname "$1" > /dev/null 2>&1 ; then - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Конец vacuumdb" "$1" >> "$LOGS"/"$DATA".log - else - echo "$(date +%Y-%m-%d_%H-%M-%S)" "Ошибка vacuumdb" "$1" >> "$LOGS"/"$DATA".log - exit - fi - return 0 - fi -} - - -for i in $(cat $BASES); - do - if Backup $i ; then - Maintance $i - ClearOldFiles $i - else - exit - fi - done - -(date +%Y-%m-%d_%H-%M) > "$LOGS"/timestamp -echo "$(date +%Y-%m-%d_%H-%M-%S)" "Создание файла для мониторинга" >> "$LOGS"/"$DATA".log diff --git a/pgsql/backup-db.sh b/pgsql/backup-db.sh new file mode 100755 index 0000000..83460ee --- /dev/null +++ b/pgsql/backup-db.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Бэкап и обслуживание баз данных PostgreSQL / Postgres Pro. +# Объединяет прежние backup-db-1c.sh и backup-db-pgsql.sh. +# Настройки переопределяются в конфиге: /etc/backup-pg.conf +# или путь к конфигу первым аргументом (см. backup-pg.conf.example). +set -euo pipefail + +# --- Настройки по умолчанию --- +PGBIN="" # каталог бинарников; пусто = из PATH (Postgres Pro 1C: /opt/pgpro/1c-14/bin) +BASES="/var/lib/pgpro/scripts/DB" # файл со списком БД, по одной на строку +LOGS="/var/lib/pgpro/service_logs" # каталог логов +BACKUPDIR="/var/lib/backup/pgpro" # каталог бэкапов +KEEP=28 # сколько последних бэкапов хранить для каждой БД +LOGKEEP_DAYS=60 # сколько дней хранить логи +TIMESTAMP_FILE="/var/log/timestamp" # файл-отметка для мониторинга + +CONF="${1:-/etc/backup-pg.conf}" +if [[ -f "$CONF" ]]; then + # shellcheck source=/dev/null + . "$CONF" +fi + +DATA="$(date +%Y-%m-%d_%H-%M)" +LOGFILE="$LOGS/$DATA.log" + +log() +{ + echo "$(date +%Y-%m-%d_%H-%M-%S)" "$*" >> "$LOGFILE" +} + +# Выполнить команду PostgreSQL от пользователя postgres +pg() +{ + local cmd="$1"; shift + [[ -n "$PGBIN" ]] && cmd="$PGBIN/$cmd" + if [[ "$EUID" -eq 0 ]]; then + sudo -u postgres "$cmd" "$@" + else + "$cmd" "$@" + fi +} + +Backup() +{ + local db="$1" + local out="$BACKUPDIR/$DATA-$db.sql.gz" + log "Старт резервного копирования" "$db" + # pipefail гарантирует, что ошибка pg_dump не потеряется за pigz; + # gzip -t отлавливает битый архив + if pg pg_dump -U postgres "$db" 2>>"$LOGFILE" | pigz > "$out" && gzip -t "$out" 2>>"$LOGFILE"; then + log "Резервное копирование закончено" "$db" + return 0 + else + log "Ошибка создания резервной копии" "$db" + rm -f -- "$out" + return 1 + fi +} + +Maintenance() +{ + local db="$1" + if [[ "$(date +%u)" -eq 6 ]]; then + # VACUUM FULL перестраивает и индексы, отдельный reindexdb не нужен + log "Старт vacuumdb FULL" "$db" + if pg vacuumdb --full --analyze --username postgres --dbname "$db" >>"$LOGFILE" 2>&1; then + log "Конец vacuumdb FULL" "$db" + else + log "Ошибка vacuumdb FULL" "$db" + return 1 + fi + else + log "Старт vacuumdb" "$db" + if pg vacuumdb --analyze --username postgres --dbname "$db" >>"$LOGFILE" 2>&1; then + log "Конец vacuumdb" "$db" + else + log "Ошибка vacuumdb" "$db" + return 1 + fi + fi +} + +ClearOldFiles() +{ + local db="$1" + # Удаляем бэкапы этой БД сверх KEEP последних (по времени изменения) + find "$BACKUPDIR" -maxdepth 1 -type f -name "*-$db.sql.gz" -printf '%T@ %p\n' \ + | sort -rn | tail -n +"$((KEEP + 1))" | cut -d' ' -f2- \ + | while IFS= read -r f; do + rm -f -- "$f" + log "Удалён старый бэкап" "${f##*/}" + done + # Логи чистим по возрасту + find "$LOGS" -maxdepth 1 -type f -name "*.log" -mtime +"$LOGKEEP_DAYS" -delete +} + +# --- Проверки --- +mkdir -p "$BACKUPDIR" "$LOGS" +if [[ ! -f "$BASES" ]]; then + log "Ошибка, файл со списком БД для резервного копирования $BASES не найден." + exit 1 +fi + +# --- Основной цикл --- +rc=0 +while IFS= read -r db; do + [[ -z "$db" || "$db" == \#* ]] && continue + if Backup "$db"; then + Maintenance "$db" || rc=1 + ClearOldFiles "$db" + else + rc=1 + fi +done < "$BASES" + +if [[ "$rc" -eq 0 ]]; then + date +%Y-%m-%d_%H-%M > "$TIMESTAMP_FILE" + log "Создание файла для мониторинга" +else + log "Завершено с ошибками" +fi +exit "$rc" diff --git a/pgsql/backup-pg.conf.example b/pgsql/backup-pg.conf.example new file mode 100644 index 0000000..37deca5 --- /dev/null +++ b/pgsql/backup-pg.conf.example @@ -0,0 +1,25 @@ +# Пример конфига для backup-db.sh. +# Скопируйте в /etc/backup-pg.conf и раскомментируйте нужные параметры — +# они переопределят значения по умолчанию из скрипта. + +# Каталог бинарников PostgreSQL; пусто или не задано = брать из PATH. +# Для Postgres Pro 1C: +#PGBIN="/opt/pgpro/1c-14/bin" + +# Файл со списком БД для бэкапа (по одной на строку, # — комментарий) +#BASES="/var/lib/pgpro/scripts/DB" + +# Каталог логов +#LOGS="/var/lib/pgpro/service_logs" + +# Каталог бэкапов +#BACKUPDIR="/var/lib/backup/pgpro" + +# Сколько последних бэкапов хранить для каждой БД +#KEEP=28 + +# Сколько дней хранить логи +#LOGKEEP_DAYS=60 + +# Файл-отметка для мониторинга (обновляется при успешном завершении) +#TIMESTAMP_FILE="/var/log/timestamp" diff --git a/pgsql/failover/keepalived.conf b/pgsql/failover/keepalived.conf index fd859d8..177e02e 100644 --- a/pgsql/failover/keepalived.conf +++ b/pgsql/failover/keepalived.conf @@ -25,7 +25,7 @@ vrrp_instance VI_1 { } virtual_ipaddress { - 195.117.117.30/32 dev eth0 label eth0:0 + 192.0.2.30/32 dev eth0 label eth0:0 # замените на ваш VIP } track_script { diff --git a/pgsql/failover/rejoin-replica.sh b/pgsql/failover/rejoin-replica.sh index 1e0d7a7..b158459 100644 --- a/pgsql/failover/rejoin-replica.sh +++ b/pgsql/failover/rejoin-replica.sh @@ -6,17 +6,14 @@ set -euo pipefail # === НАСТРОЙКИ === LOG="/var/log/postgresql/rejoin.log" DATA_DIR="/var/lib/pgpro/std-12/data" -PEER_IP="195.117.117.32" # IP предполагаемого мастера 32/31 в зависимости от того на какой ноде висит скрипт +PEER_IP="192.0.2.32" # IP второго узла (предполагаемого мастера) — замените на свой REPL_USER="replicator" -PASSWORD="replicate" PORT="5432" -MAX_ATTEMPTS=3 -RETRY_DELAY=5 -STARTUP_TIMEOUT=20 -ROLE_CHECK_ATTEMPTS=5 -ROLE_CHECK_DELAY=5 - +# Пароль репликации в скрипте не хранится. Создайте файл ~postgres/.pgpass +# (владелец postgres, права 600) со строкой: +# :5432:*:replicator:<пароль> +# psql и pg_basebackup подхватят его автоматически. sleep 100 # указывается для второго сервера, что бы не допустить одновременного поднятия двух мастеров @@ -31,7 +28,6 @@ echo "[$(date)] === STARTING SMART REJOIN ===" is_master() { local ip=$1 if runuser -l postgres -c " - export PGPASSWORD='$PASSWORD'; psql -h '$ip' -U '$REPL_USER' -p '$PORT' -d 'postgres' -Atc 'SELECT pg_is_in_recovery();' " 2>/dev/null | grep -q "^f$"; then return 0 # Это мастер @@ -100,7 +96,6 @@ become_replica() { echo "[$(date)] Running pg_basebackup from $PEER_IP..." if ! runuser -l postgres -c " - export PGPASSWORD='$PASSWORD'; pg_basebackup \ -h '$PEER_IP' \ -p '$PORT' \ diff --git a/pgsql/pg_setup.sh b/pgsql/pg_setup.sh index 269eff9..3497690 100644 --- a/pgsql/pg_setup.sh +++ b/pgsql/pg_setup.sh @@ -39,7 +39,6 @@ PG_BASE="/opt/pgpro/${PGVER}" PG_BIN="${PG_BASE}/bin" PG_DATA="/var/lib/pgpro/${PGVER}/data" PG_HBA="${PG_DATA}/pg_hba.conf" -PG_CONF="${PG_DATA}/postgresql.conf" PG_MAJOR="$(echo "${PGVER}" | sed -E 's/.*-([0-9]+).*/\1/')" export DEBIAN_FRONTEND=noninteractive @@ -110,7 +109,6 @@ if [[ "${PG_INSTALLED}" -eq 1 ]]; then fi # 2) Проверка существования каталога данных кластера -DID_DATA_BACKUP=0 if [[ -d "${PG_DATA}" ]]; then log_warn "Обнаружен каталог данных: ${PG_DATA}" if ask_yes_no "Продолжить установку? Это может перезаписать данные. [y/N]" "N"; then @@ -120,7 +118,6 @@ if [[ -d "${PG_DATA}" ]]; then PG_DATA_BKP="${PG_DATA}.backup.$(date +%F_%H%M%S)" fi run "Резервная копия каталога данных в ${PG_DATA_BKP}" mv "${PG_DATA}" "${PG_DATA_BKP}" - DID_DATA_BACKUP=1 else log_warn "Резервная копия не выполнена. Старый ${PG_DATA} будет удалён при переинициализации." fi diff --git a/proxmox/chr_install.sh b/proxmox/chr_install.sh index f2fe9ed..b27393c 100644 --- a/proxmox/chr_install.sh +++ b/proxmox/chr_install.sh @@ -23,7 +23,7 @@ then echo "-- CHR image is available." else echo "-- Downloading CHR $version image file." - cd /root/temp + cd /root/temp || exit 1 echo "---------------------------------------------------------------------------" wget https://download.mikrotik.com/routeros/$version/chr-$version.img.zip unzip chr-$version.img.zip