#!/bin/bash # B23: ежедневный прикладной бэкап ВЕКТОРа (без planet_osm_*; OSM восстанавливается b16-import.sh). # # ВАЖНО: дампить ТОЛЬКО /usr/lib/postgresql/16/bin/pg_dump. pg_wrapper в контейнере # postgres:16 указывает на клиент PG18: pg_dump 18 создаёт архив версии 1.16, # который pg_restore 16 не читает ("unsupported version"), и пишет # "SET transaction_timeout", отсутствующий в PG16-сервере. # См. setup грабли: scripts/restore-app.sh. set -u DATE=$(date +%F) LOG=/var/log/vector-backup.log KEEP_DAYS=14 PG16=/usr/lib/postgresql/16/bin log() { echo "[$(date '+%F %T')] $*" >> "$LOG"; } log "backup start $DATE" # 1. Дамп прикладных таблиц (маленький, ~80 КБ) docker exec vector-postgres "$PG16/pg_dump" -U postgres -d vector_mchs \ --exclude-table='planet_osm_*' -F c -f "/tmp/vector_app_${DATE}.dump" \ || { log "PG_DUMP FAILED"; exit 1; } # 2. Выгрузка из контейнера mkdir -p /root/backups docker cp "vector-postgres:/tmp/vector_app_${DATE}.dump" "/root/backups/" \ || { log "DOCKER_CP FAILED"; exit 1; } docker exec vector-postgres rm -f "/tmp/vector_app_${DATE}.dump" # 3. .env и compose-конфигурация (JWT_SECRET, пароль БД, CONTOUR_TOKEN) tar czf "/root/backups/vector_env_${DATE}.tar.gz" -C /root/vector .env docker-compose.yml 2>/dev/null chmod 600 /root/backups/vector_env_*.tar.gz # 4. Проверка дампа: pg_restore 16 читает оглавление (формат/целостность) docker cp "/root/backups/vector_app_${DATE}.dump" vector-postgres:/tmp/verify.dump docker exec vector-postgres "$PG16/pg_restore" --list /tmp/verify.dump > /dev/null 2>&1 \ || { log "DUMP VERIFY FAILED"; exit 1; } docker exec vector-postgres rm -f /tmp/verify.dump # 5. Чистка старше KEEP_DAYS find /root/backups -name "vector_app_*.dump" -mtime +$KEEP_DAYS -delete find /root/backups -name "vector_env_*.tar.gz" -mtime +$KEEP_DAYS -delete log "backup ok: $(du -h "/root/backups/vector_app_${DATE}.dump" | cut -f1)"