vm:pgvector:03-backup

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
vm:pgvector:03-backup [2025/08/30 17:38] adminvm:pgvector:03-backup [2025/08/30 17:39] (текущий) admin
Строка 37: Строка 37:
 </code> </code>
  
-Скопируйте содержимое скрипта и настройте переменные:+Скопируйте в файл следующий скрипт:
  
 <code bash> <code bash>
-Пути+#!/bin/bash 
 +  
 +# Скрипт резервного копирования PGVector 
 +# Запуск: /opt/scripts/pgvector-backup.sh 
 +  
 +# Настройки
 COMPOSE_FILE="/opt/pgvector/docker-compose.yml" COMPOSE_FILE="/opt/pgvector/docker-compose.yml"
 PGVECTOR_DIR="/opt/pgvector" PGVECTOR_DIR="/opt/pgvector"
 BACKUP_DIR="/opt/backups/pgvector" BACKUP_DIR="/opt/backups/pgvector"
- +DATE=$(date +"%Y%m%d_%H%M%S") 
-База данных+BACKUP_NAME="pgvector_backup_${DATE}" 
 +RETENTION_DAYS=10  Храним бекапы 10 дней 
 +  
 +# Настройки базы данных
 DB_CONTAINER="pgvector_postgres" DB_CONTAINER="pgvector_postgres"
 DB_USER="postgres" DB_USER="postgres"
 DB_PASSWORD="ваш_пароль_здесь" DB_PASSWORD="ваш_пароль_здесь"
 DB_NAME="postgres" DB_NAME="postgres"
 + 
 +# Логирование
 +LOG_FILE="${BACKUP_DIR}/backup.log"
 + 
 +# Функция логирования
 +log() {
 +    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
 +}
 + 
 +# Создаем директорию для бекапов если не существует
 +mkdir -p "$BACKUP_DIR"
 + 
 +log "=== Начало резервного копирования PGVector ==="
 + 
 +# Проверяем что compose файл существует
 +if [ ! -f "$COMPOSE_FILE" ]; then
 +    log "ОШИБКА: Файл $COMPOSE_FILE не найден!"
 +    exit 1
 +fi
 + 
 +# Переходим в директорию с PGVector
 +cd "$PGVECTOR_DIR" || {
 +    log "ОШИБКА: Не удалось перейти в директорию $PGVECTOR_DIR"
 +    exit 1
 +}
 +# Проверяем что контейнеры запущены
 +log "Проверяем статус контейнеров..."
 +if ! docker-compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then
 +    log "ОШИБКА: Контейнеры не запущены! Запустите их перед созданием бекапа."
 +    exit 1
 +fi
 +# Создаем дамп базы данных (пока контейнеры работают)
 +log "Создаем дамп базы данных..."
 +DB_DUMP_PATH="${BACKUP_DIR}/${BACKUP_NAME}_database.sql"
 +# Экспортируем пароль для pg_dump
 +export PGPASSWORD="$DB_PASSWORD"
 +docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" --no-password --verbose > "$DB_DUMP_PATH" 2>> "$LOG_FILE"
 +if [ $? -eq 0 ] && [ -s "$DB_DUMP_PATH" ]; then
 +    log "Дамп базы данных создан: $DB_DUMP_PATH"
 +    
 +    # Получаем размер дампа
 +    DB_DUMP_SIZE=$(du -h "$DB_DUMP_PATH" | cut -f1)
 +    log "Размер дампа БД: $DB_DUMP_SIZE"
 +else
 +    log "ОШИБКА: Не удалось создать дамп базы данных или файл пуст"
 +    rm -f "$DB_DUMP_PATH"
 +    exit 1
 +fi
 +# Очищаем переменную окружения
 +unset PGPASSWORD
 +# Останавливаем контейнеры
 +log "Останавливаем контейнеры PGVector..."
 +docker-compose -f "$COMPOSE_FILE" down
 + 
 +if [ $? -eq 0 ]; then
 +    log "Контейнеры успешно остановлены"
 +else
 +    log "ОШИБКА: Не удалось остановить контейнеры"
 +    exit 1
 +fi
 + 
 +# Ждем пару секунд для полной остановки
 +sleep 5
 + 
 +# Создаем архив с данными (включая дамп БД)
 +log "Создаем архив данных..."
 +BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz"
 + 
 +tar -czf "$BACKUP_PATH" \
 +    --exclude='*.log' \
 +    --exclude='**/lost+found' \
 +    -C "$BACKUP_DIR" "${BACKUP_NAME}_database.sql" \
 +    -C "$PGVECTOR_DIR" \
 +    postgres_data/ \
 +    pgadmin_data/ \
 +    docker-compose.yml
 + 
 +if [ $? -eq 0 ]; then
 +    log "Архив создан: $BACKUP_PATH"
 + 
 +    # Получаем размер архива
 +    BACKUP_SIZE=$(du -h "$BACKUP_PATH" | cut -f1)
 +    log "Размер архива: $BACKUP_SIZE"
 +    
 +    # Удаляем отдельный файл дампа, так как он теперь в архиве
 +    rm -f "$DB_DUMP_PATH"
 +    log "Отдельный файл дампа БД удален (включен в архив)"
 +else
 +    log "ОШИБКА: Не удалось создать архив"
 + 
 +    # Пытаемся запустить контейнеры даже при ошибке
 +    log "Запускаем контейнеры после ошибки..."
 +    docker-compose -f "$COMPOSE_FILE" up -d
 +    exit 1
 +fi
 + 
 +# Запускаем контейнеры обратно
 +log "Запускаем контейнеры PGVector..."
 +docker-compose -f "$COMPOSE_FILE" up -d
 + 
 +if [ $? -eq 0 ]; then
 +    log "Контейнеры успешно запущены"
 +else
 +    log "ОШИБКА: Не удалось запустить контейнеры"
 +    exit 1
 +fi
 + 
 +# Ждем запуска сервисов
 +sleep 15
 + 
 +# Проверяем что все контейнеры работают
 +log "Проверяем статус контейнеров..."
 +RUNNING_CONTAINERS=$(docker-compose -f "$COMPOSE_FILE" ps --services --filter "status=running" | wc -l)
 +TOTAL_CONTAINERS=$(docker-compose -f "$COMPOSE_FILE" ps --services | wc -l)
 +if [ "$RUNNING_CONTAINERS" -eq "$TOTAL_CONTAINERS" ]; then
 +    log "Все контейнеры ($RUNNING_CONTAINERS/$TOTAL_CONTAINERS) работают корректно"
 +else
 +    log "ПРЕДУПРЕЖДЕНИЕ: Работают только $RUNNING_CONTAINERS из $TOTAL_CONTAINERS контейнеров"
 +fi
 +# Проверяем доступность базы данных
 +log "Проверяем подключение к базе данных..."
 +export PGPASSWORD="$DB_PASSWORD"
 +if docker exec "$DB_CONTAINER" pg_isready -U "$DB_USER" -d "$DB_NAME" > /dev/null 2>&1; then
 +    log "База данных доступна и готова к работе"
 +else
 +    log "ПРЕДУПРЕЖДЕНИЕ: База данных может быть недоступна"
 +fi
  
-Retention +Проверяем что расширение pgvector доступно 
-RETENTION_DAYS=10+log "Проверяем расширение pgvector..." 
 +if docker exec "$DB_CONTAINER" psql -U "$DB_USER" -d "$DB_NAME" -c "SELECT extname FROM pg_extension WHERE extname='vector';" 2>/dev/null | grep -q "vector"; then 
 +    log "Расширение pgvector активно и работает" 
 +else 
 +    log "ПРЕДУПРЕЖДЕНИЕ: Расширение pgvector может быть неактивно" 
 +fi 
 +unset PGPASSWORD 
 +  
 +# Удаляем старые бекапы 
 +log "Удаляем бекапы старше $RETENTION_DAYS дней..." 
 +DELETED_COUNT=$(find "$BACKUP_DIR" -name "pgvector_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete -print | wc -l) 
 +log "Удалено старых бекапов: $DELETED_COUNT" 
 +  
 +# Показываем статистику бекапов 
 +BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/pgvector_backup_*.tar.gz 2>/dev/null | wc -l) 
 +TOTAL_SIZE=$(du -sh "${BACKUP_DIR}" 2>/dev/null | cut -f1) 
 +log "Общее количество бекапов: $BACKUP_COUNT" 
 +log "Общий размер папки бекапов: $TOTAL_SIZE" 
 +# Получаем информацию о свободном месте на диске 
 +BACKUP_DISK_USAGE=$(df -h "$BACKUP_DIR" | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)"}'
 +ROOT_DISK_USAGE=$(df -h / | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)"}'
 +log "Свободное место на диске бекапов: $BACKUP_DISK_USAGE" 
 +if [ "$BACKUP_DIR" != "/" ] && [ "$(df "$BACKUP_DIR" | awk 'NR==2 {print $1}')" != "$(df / | awk 'NR==2 {print $1}')" ]; then 
 +    log "Свободное место на корневом диске: $ROOT_DISK_USAGE" 
 +fi 
 +# Получаем процент заполнения диска с бекапами для предупреждений 
 +BACKUP_DISK_PERCENT=$(df "$BACKUP_DIR" | awk 'NR==2 {print $5}' | sed 's/%//'
 +if [ "$BACKUP_DISK_PERCENT" -gt 90 ]; then 
 +    log "⚠️ ПРЕДУПРЕЖДЕНИЕ: Диск заполнен более чем на 90%!" 
 +elif [ "$BACKUP_DISK_PERCENT" -gt 80 ]; then 
 +    log "⚠️ ВНИМАНИЕ: Диск заполнен более чем на 80%" 
 +fi 
 +  
 +log "=== Резервное копирование завершено успешно ===" 
 +# Формируем сообщение для Telegram 
 +TELEGRAM_MESSAGE="✅ PGVector backup completed 
 +📁 Backup: $BACKUP_NAME ($BACKUP_SIZE) 
 +💾 DB dump: $DB_DUMP_SIZE   
 +📊 Total backups: $BACKUP_COUNT 
 +💿 Disk space: $BACKUP_DISK_USAGE" 
 +# Добавляем предупреждение о месте, если нужно 
 +if [ "$BACKUP_DISK_PERCENT" -gt 90 ]; then 
 +    TELEGRAM_MESSAGE="$TELEGRAM_MESSAGE 
 +⚠️ WARNING: Disk >90% full!" 
 +elif [ "$BACKUP_DISK_PERCENT" -gt 80 ]; then 
 +    TELEGRAM_MESSAGE="$TELEGRAM_MESSAGE 
 +⚠️ ATTENTION: Disk >80% full" 
 +fi 
 +# Отправляем уведомление в Telegram (опционально) 
 +curl -s -X POST "https://api.telegram.org/bot[ВАШ_ТОКЕН]/sendMessage"
 +     -d chat_id="[ВАШ_CHAT_ID]"
 +     -d text="$TELEGRAM_MESSAGE" > /dev/null 
 +exit 0
 </code> </code>
 +
 +**Обязательно измените следующие параметры:**
 +  * ''DB_PASSWORD="ваш_пароль_здесь"'' - укажите реальный пароль БД
 +  * ''[ВАШ_ТОКЕН]'' - токен Telegram бота
 +  * ''[ВАШ_CHAT_ID]'' - ID чата для уведомлений
  
 ==== 3. Установка прав выполнения ==== ==== 3. Установка прав выполнения ====
  • vm/pgvector/03-backup.1756575485.txt.gz
  • Последнее изменение: 2025/08/30 17:38
  • admin