vm:pgvector:03-backup

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
vm:pgvector:03-backup [2025/08/29 08:39] adminvm:pgvector:03-backup [2025/08/30 17:39] (текущий) admin
Строка 1: Строка 1:
-====== Скрипт резервного копирования PGVector ======+====== Резервное копирование PGVector ======
  
 ===== Описание ===== ===== Описание =====
  
-Скрипт автоматизированного резервного копирования для контейнеров PGVector (PostgreSQL с расширением vector) и pgAdmin. Создает полные бекапы включающие SQL дампы и архивы данных.+Автоматизированный скрипт для создания резервных копий **PGVector** с поддержкой: 
 +  * Дампов базы данных PostgreSQL 
 +  * Архивирования файлов данных 
 +  * Автоматической очистки старых бекапов 
 +  * Мониторинга дискового пространства 
 +  * Уведомлений в Telegram
  
-**Возможности:** +===== Требования =====
-  * Создание SQL дампов базы данных +
-  * Архивирование папок с данными PostgreSQL и pgAdmin +
-  * Автоматическая очистка старых бекапов +
-  * Подробное логирование операций +
-  * Проверка работоспособности сервисов +
-  * Уведомления в Telegram (опционально)+
  
-<note tip> +  * Docker и Docker Compose 
-Скрипт безопасно останавливает контейнеры для создания консистентного бекапа и автоматически запускает их обратно. +  * Bash 4.0+ 
-</note> +  * Утилиты: ''tar'', ''gzip'', ''find'', ''curl'' 
- +  * Права root или sudo
-===== Предварительные требования ===== +
- +
-  * Docker и Docker Compose установлены +
-  * Контейнеры PGVector запущены из директории ''/opt/pgvector'' +
-  * Права root или sudo для выполнения операций+
  
 ===== Установка ===== ===== Установка =====
  
-==== Шаг 1Создание директории для скриптов ====+==== 1Создание директорий ====
  
 <code bash> <code bash>
 +# Создаем необходимые директории
 sudo mkdir -p /opt/scripts sudo mkdir -p /opt/scripts
 sudo mkdir -p /opt/backups/pgvector sudo mkdir -p /opt/backups/pgvector
 +
 +# Устанавливаем права доступа
 +sudo chmod 755 /opt/scripts
 +sudo chmod 755 /opt/backups
 </code> </code>
  
-==== Шаг 2Создание файла скрипта ====+==== 2Создание скрипта ====
  
 <code bash> <code bash>
Строка 38: Строка 37:
 </code> </code>
  
-Скопируйте следующий код в файл:+Скопируйте в файл следующий скрипт:
  
-<file bash /opt/scripts/pgvector-backup.sh>+<code bash>
 #!/bin/bash #!/bin/bash
 + 
 # Скрипт резервного копирования PGVector # Скрипт резервного копирования PGVector
 # Запуск: /opt/scripts/pgvector-backup.sh # Запуск: /opt/scripts/pgvector-backup.sh
 + 
 # Настройки # Настройки
 COMPOSE_FILE="/opt/pgvector/docker-compose.yml" COMPOSE_FILE="/opt/pgvector/docker-compose.yml"
Строка 52: Строка 52:
 BACKUP_NAME="pgvector_backup_${DATE}" BACKUP_NAME="pgvector_backup_${DATE}"
 RETENTION_DAYS=10  # Храним бекапы 10 дней RETENTION_DAYS=10  # Храним бекапы 10 дней
 + 
 # Настройки базы данных # Настройки базы данных
 +DB_CONTAINER="pgvector_postgres"
 +DB_USER="postgres"
 +DB_PASSWORD="ваш_пароль_здесь"
 DB_NAME="postgres" DB_NAME="postgres"
-DB_USER="postgres" + 
-DB_PASSWORD="YOUR_POSTGRES_PASSWORD"  # Замените на ваш пароль из docker-compose.yml +
-DB_CONTAINER="pgvector_postgres" +
 # Логирование # Логирование
 LOG_FILE="${BACKUP_DIR}/backup.log" LOG_FILE="${BACKUP_DIR}/backup.log"
 + 
 # Функция логирования # Функция логирования
 log() { log() {
     echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"     echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
 } }
 + 
 # Создаем директорию для бекапов если не существует # Создаем директорию для бекапов если не существует
 mkdir -p "$BACKUP_DIR" mkdir -p "$BACKUP_DIR"
 + 
 log "=== Начало резервного копирования PGVector ===" log "=== Начало резервного копирования PGVector ==="
 + 
 # Проверяем что compose файл существует # Проверяем что compose файл существует
 if [ ! -f "$COMPOSE_FILE" ]; then if [ ! -f "$COMPOSE_FILE" ]; then
Строка 77: Строка 77:
     exit 1     exit 1
 fi fi
 + 
 # Переходим в директорию с PGVector # Переходим в директорию с PGVector
 cd "$PGVECTOR_DIR" || { cd "$PGVECTOR_DIR" || {
Строка 83: Строка 83:
     exit 1     exit 1
 } }
- 
 # Проверяем что контейнеры запущены # Проверяем что контейнеры запущены
-if ! docker-compose ps | grep -q "Up"; then +log "Проверяем статус контейнеров..." 
-    log "ПРЕДУПРЕЖДЕНИЕНе все контейнеры запущены"+if ! docker-compose -f "$COMPOSE_FILE" ps | grep -q "Up"; then 
 +    log "ОШИБКАКонтейнеры не запущены! Запустите их перед созданием бекапа." 
 +    exit 1
 fi fi
- +# Создаем дамп базы данных (пока контейнеры работают)
-# Создаем дамп базы данных+
 log "Создаем дамп базы данных..." log "Создаем дамп базы данных..."
-DB_DUMP_FILE="${BACKUP_DIR}/${BACKUP_NAME}_database.sql" +DB_DUMP_PATH="${BACKUP_DIR}/${BACKUP_NAME}_database.sql
-docker exec -t "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" > "$DB_DUMP_FILE" +# Экспортируем пароль для pg_dump 
- +export PGPASSWORD="$DB_PASSWORD
-if [ $? -eq 0 ]; then +docker exec "$DB_CONTAINER" pg_dump -U "$DB_USER" -d "$DB_NAME" --no-password --verbose > "$DB_DUMP_PATH" 2>> "$LOG_FILE
-    log "Дамп базы данных создан: $DB_DUMP_FILE+if [ $? -eq 0 ] && [ -s "$DB_DUMP_PATH" ]; then 
-    DB_SIZE=$(du -h "$DB_DUMP_FILE" | cut -f1) +    log "Дамп базы данных создан: $DB_DUMP_PATH
-    log "Размер дампа базы данных: $DB_SIZE"+     
 +    # Получаем размер дампа 
 +    DB_DUMP_SIZE=$(du -h "$DB_DUMP_PATH" | cut -f1) 
 +    log "Размер дампа БД: $DB_DUMP_SIZE"
 else else
-    log "ОШИБКА: Не удалось создать дамп базы данных"+    log "ОШИБКА: Не удалось создать дамп базы данных или файл пуст" 
 +    rm -f "$DB_DUMP_PATH"
     exit 1     exit 1
 fi fi
- +Очищаем переменную окружения 
-Создаем дамп всех баз данных (включая системные+unset PGPASSWORD 
-log "Создаем полный дамп всех баз данных..." +# Останавливаем контейнеры
-DB_FULL_DUMP_FILE="${BACKUP_DIR}/${BACKUP_NAME}_all_databases.sql" +
-docker exec -t "$DB_CONTAINER" pg_dumpall -U "$DB_USER" > "$DB_FULL_DUMP_FILE" +
- +
-if [ $? -eq 0 ]; then +
-    log "Полный дамп баз данных создан: $DB_FULL_DUMP_FILE" +
-    DB_FULL_SIZE=$(du -h "$DB_FULL_DUMP_FILE" | cut -f1) +
-    log "Размер полного дампа: $DB_FULL_SIZE" +
-else +
-    log "ПРЕДУПРЕЖДЕНИЕ: Не удалось создать полный дамп баз данных" +
-fi +
- +
-# Останавливаем контейнеры для консистентного бекапа файлов+
 log "Останавливаем контейнеры PGVector..." log "Останавливаем контейнеры PGVector..."
 docker-compose -f "$COMPOSE_FILE" down docker-compose -f "$COMPOSE_FILE" down
 + 
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     log "Контейнеры успешно остановлены"     log "Контейнеры успешно остановлены"
Строка 126: Строка 118:
     exit 1     exit 1
 fi fi
 + 
 # Ждем пару секунд для полной остановки # Ждем пару секунд для полной остановки
 sleep 5 sleep 5
- +  
-# Создаем архив с данными+# Создаем архив с данными (включая дамп БД)
 log "Создаем архив данных..." log "Создаем архив данных..."
-BACKUP_ARCHIVE="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" +BACKUP_PATH="${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" 
-tar -czf "$BACKUP_ARCHIVE" \+  
 +tar -czf "$BACKUP_PATH" \
     --exclude='*.log' \     --exclude='*.log' \
     --exclude='**/lost+found' \     --exclude='**/lost+found' \
-    --exclude='tmp/' +    -C "$BACKUP_DIR" "${BACKUP_NAME}_database.sql" 
-    --exclude='log/' \+    -C "$PGVECTOR_DIR" \
     postgres_data/ \     postgres_data/ \
     pgadmin_data/ \     pgadmin_data/ \
     docker-compose.yml     docker-compose.yml
 + 
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
-    log "Архив создан: $BACKUP_ARCHIVE+    log "Архив создан: $BACKUP_PATH
-    + 
     # Получаем размер архива     # Получаем размер архива
-    ARCHIVE_SIZE=$(du -h "$BACKUP_ARCHIVE" | cut -f1) +    BACKUP_SIZE=$(du -h "$BACKUP_PATH" | cut -f1) 
-    log "Размер архива: $ARCHIVE_SIZE"+    log "Размер архива: $BACKUP_SIZE" 
 +     
 +    # Удаляем отдельный файл дампа, так как он теперь в архиве 
 +    rm -f "$DB_DUMP_PATH" 
 +    log "Отдельный файл дампа БД удален (включен в архив)"
 else else
     log "ОШИБКА: Не удалось создать архив"     log "ОШИБКА: Не удалось создать архив"
-    + 
     # Пытаемся запустить контейнеры даже при ошибке     # Пытаемся запустить контейнеры даже при ошибке
     log "Запускаем контейнеры после ошибки..."     log "Запускаем контейнеры после ошибки..."
Строка 156: Строка 153:
     exit 1     exit 1
 fi fi
 + 
 # Запускаем контейнеры обратно # Запускаем контейнеры обратно
 log "Запускаем контейнеры PGVector..." log "Запускаем контейнеры PGVector..."
 docker-compose -f "$COMPOSE_FILE" up -d docker-compose -f "$COMPOSE_FILE" up -d
 + 
 if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
     log "Контейнеры успешно запущены"     log "Контейнеры успешно запущены"
Строка 167: Строка 164:
     exit 1     exit 1
 fi fi
 + 
 # Ждем запуска сервисов # Ждем запуска сервисов
-log "Ожидаем запуска сервисов..." +sleep 15 
-sleep 30 + 
 # Проверяем что все контейнеры работают # Проверяем что все контейнеры работают
 log "Проверяем статус контейнеров..." log "Проверяем статус контейнеров..."
-if docker-compose -f "$COMPOSE_FILE" ps | grep -"Up"; then +RUNNING_CONTAINERS=$(docker-compose -f "$COMPOSE_FILE" ps --services --filter "status=running" wc -l) 
-    log "Контейнеры работают корректно"+TOTAL_CONTAINERS=$(docker-compose -f "$COMPOSE_FILEps --services | wc -l) 
 +if [ "$RUNNING_CONTAINERS" -eq "$TOTAL_CONTAINERS" ]; then 
 +    log "Все контейнеры ($RUNNING_CONTAINERS/$TOTAL_CONTAINERS) работают корректно"
 else else
-    log "ПРЕДУПРЕЖДЕНИЕ: Некоторые контейнеры могут работать некорректно"+    log "ПРЕДУПРЕЖДЕНИЕ: Работают только $RUNNING_CONTAINERS из $TOTAL_CONTAINERS контейнеров"
 fi fi
- +# Проверяем доступность базы данных
-# Проверяем подключение к базе данных+
 log "Проверяем подключение к базе данных..." log "Проверяем подключение к базе данных..."
-if docker exec "$DB_CONTAINER" pg_isready -U "$DB_USER" >/dev/null 2>&1; then +export PGPASSWORD="$DB_PASSWORD" 
-    log "База данных доступна"+if docker exec "$DB_CONTAINER" pg_isready -U "$DB_USER" -d "$DB_NAME" > /dev/null 2>&1; then 
 +    log "База данных доступна и готова к работе"
 else else
     log "ПРЕДУПРЕЖДЕНИЕ: База данных может быть недоступна"     log "ПРЕДУПРЕЖДЕНИЕ: База данных может быть недоступна"
Строка 190: Строка 188:
 # Проверяем что расширение pgvector доступно # Проверяем что расширение pgvector доступно
 log "Проверяем расширение pgvector..." log "Проверяем расширение pgvector..."
-if docker exec "$DB_CONTAINER" psql -U "$DB_USER" -d "$DB_NAME" -c "SELECT extname FROM pg_extension WHERE extname='vector';" | grep -q "vector"; then +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 активно"+    log "Расширение pgvector активно и работает"
 else else
     log "ПРЕДУПРЕЖДЕНИЕ: Расширение pgvector может быть неактивно"     log "ПРЕДУПРЕЖДЕНИЕ: Расширение pgvector может быть неактивно"
 fi fi
- +unset PGPASSWORD 
-# Создаем итоговый архив с дампами базы данных + 
-log "Создаем итоговый архив с дампами базы данных..." +
-FINAL_BACKUP="${BACKUP_DIR}/${BACKUP_NAME}_complete.tar.gz" +
- +
-# Добавляем в архив файлы данных и дампы +
-tar -czf "$FINAL_BACKUP" -C "$BACKUP_DIR"+
-    "${BACKUP_NAME}.tar.gz"+
-    "${BACKUP_NAME}_database.sql"+
-    "${BACKUP_NAME}_all_databases.sql" +
- +
-if [ $? -eq 0 ]; then +
-    log "Итоговый архив создан: $FINAL_BACKUP" +
-     +
-    # Получаем размер итогового архива +
-    FINAL_SIZE=$(du -h "$FINAL_BACKUP" | cut -f1) +
-    log "Размер итогового архива: $FINAL_SIZE" +
-     +
-    # Удаляем промежуточные файлы +
-    rm -f "$BACKUP_ARCHIVE" "$DB_DUMP_FILE" "$DB_FULL_DUMP_FILE" +
-    log "Промежуточные файлы удалены" +
-else +
-    log "ОШИБКА: Не удалось создать итоговый архив" +
-fi +
 # Удаляем старые бекапы # Удаляем старые бекапы
 log "Удаляем бекапы старше $RETENTION_DAYS дней..." log "Удаляем бекапы старше $RETENTION_DAYS дней..."
-find "$BACKUP_DIR" -name "pgvector_backup_*_complete.tar.gz" -mtime +$RETENTION_DAYS -delete +DELETED_COUNT=$(find "$BACKUP_DIR" -name "pgvector_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete -print | wc -l) 
-find "$BACKUP_DIR" -name "pgvector_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete +log "Удалено старых бекапов: $DELETED_COUNT
-find "$BACKUP_DIR" -name "pgvector_backup_*_database.sql" -mtime +$RETENTION_DAYS -delete + 
-find "$BACKUP_DIR-name "pgvector_backup_*_all_databases.sql" -mtime +$RETENTION_DAYS -delete +
 # Показываем статистику бекапов # Показываем статистику бекапов
-BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/pgvector_backup_*_complete.tar.gz 2>/dev/null | wc -l) +BACKUP_COUNT=$(ls -1 "${BACKUP_DIR}"/pgvector_backup_*.tar.gz 2>/dev/null | wc -l
-log "Общее количество полных бекапов: $BACKUP_COUNT" +TOTAL_SIZE=$(du -sh "${BACKUP_DIR}" 2>/dev/null | cut -f1
- +log "Общее количество бекапов: $BACKUP_COUNT" 
-# Показываем общий размер всех бекапов +log "Общий размер папки бекапов: $TOTAL_SIZE
-TOTAL_SIZE=$(du -sh "$BACKUP_DIR"cut -f1+# Получаем информацию о свободном месте на диске 
-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 "=== Резервное копирование завершено успешно ===" 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>
  
-Отправляем уведомление в Telegram (раскомментируйте и укажите свои данные) +**Обязательно измените следующие параметры:** 
-# curl -s -X POST "https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage" \ +  * ''DB_PASSWORD="ваш_пароль_здесь"''укажите реальный пароль БД 
-#      -d chat_id="YOUR_CHAT_ID"+  * ''[ВАШ_ТОКЕН]'' токен Telegram бота 
-#      -d text="✅ PGVector backup completed: $BACKUP_NAME ($FINAL_SIZE)"+  * ''[ВАШ_CHAT_ID]'' ID чата для уведомлений
  
-exit 0 +==== 3Установка прав выполнения ====
-</file> +
- +
-==== Шаг 3Установка прав на выполнение ====+
  
 <code bash> <code bash>
 sudo chmod +x /opt/scripts/pgvector-backup.sh sudo chmod +x /opt/scripts/pgvector-backup.sh
-sudo chown root:root /opt/scripts/pgvector-backup.sh 
 </code> </code>
  
-==== Шаг 4: Настройка владельца директории бекапов ====+====Настройка Telegram уведомлений ===== 
 + 
 +1. Создайте бота через **@BotFather** 
 +2. Получите **токен бота** и **chat_id** 
 +3. Замените в скрипте:
  
 <code bash> <code bash>
-sudo chown -R $USER:$USER /opt/backups/pgvector+curl -s -X POST "https://api.telegram.org/bot[ВАШ_ТОКЕН]/sendMessage"
 +     -d chat_id="[ВАШ_CHAT_ID]"
 +     -d text="$TELEGRAM_MESSAGE" > /dev/null
 </code> </code>
  
-===== Конфигурация =====+===== Автоматизация =====
  
-==== Основные параметры ====+==== Настройка Cron ====
  
-Отредактируйте переменные в начале скрипта под ваши нужды:+<code bash> 
 +# Редактируем crontab 
 +sudo crontab -e
  
-<file bash /opt/scripts/pgvector-backup.sh> +Добавляем задание - ежедневно в 3:00   
-Настройки путей +0 3 * * * /opt/scripts/pgvector-backup.sh >> /var/log/pgvector-backup.log 2>&1
-COMPOSE_FILE="/opt/pgvector/docker-compose.yml" +
-PGVECTOR_DIR="/opt/pgvector" +
-BACKUP_DIR="/opt/backups/pgvector" +
- +
-# Настройки хранения +
-RETENTION_DAYS=10  # Количество дней хранения бекапов +
- +
-# Настройки базы данных +
-DB_NAME="postgres" +
-DB_USER="postgres" +
-DB_PASSWORD="YOUR_POSTGRES_PASSWORD"  # Ваш пароль из docker-compose.yml +
-DB_CONTAINER="pgvector_postgres" +
-</file> +
- +
-<note warning> +
-Убедитесь, что пароль базы данных в скрипте соответствует паролю в docker-compose.yml +
-</note> +
- +
-==== Настройка уведомлений Telegram (опционально) ==== +
- +
-Раскомментируйте и настройте строки в конце скрипта+
- +
-<code bash> +
-curl -s -X POST "https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage"+
-     -d chat_id="YOUR_CHAT_ID"+
-     -d text="✅ PGVector backup completed: $BACKUP_NAME ($FINAL_SIZE)"+
 </code> </code>
  
Строка 299: Строка 282:
  
 <code bash> <code bash>
-# Запуск с правами root 
 sudo /opt/scripts/pgvector-backup.sh sudo /opt/scripts/pgvector-backup.sh
- 
-# Запуск с отображением вывода 
-sudo /opt/scripts/pgvector-backup.sh | tee /tmp/backup.log 
 </code> </code>
  
-==== Проверка логов ====+==== Проверка бекапов ====
  
 <code bash> <code bash>
-# Просмотр последних логов+# Список бекапов 
 +ls -la /opt/backups/pgvector/ 
 + 
 +# Просмотр лога
 tail -f /opt/backups/pgvector/backup.log tail -f /opt/backups/pgvector/backup.log
- 
-# Просмотр всех логов 
-cat /opt/backups/pgvector/backup.log 
 </code> </code>
  
-===== Автоматизация =====+===== Структура бекапов =====
  
-==== Настройка cron ==== +<code> 
- +/opt/backups/pgvector/ 
-<code bash> +├── pgvector_backup_20250830_201456.tar.gz   # Основной архив 
-sudo crontab -e+├── backup.log                               # Лог операций 
 +└── [старые бекапы...]
 </code> </code>
  
-Добавьте одну из следующих строк:+**Содержимое архива:** 
 +  * ''pgvector_backup_YYYYMMDD_HHMMSS_database.sql''дамп БД 
 +  * ''postgres_data/'' - данные PostgreSQL 
 +  * ''pgadmin_data/''данные PgAdmin 
 +  * ''docker-compose.yml'' - конфигурация
  
-<file> +===== Восстановление =====
-# Ежедневно в 2:00 ночи +
-0 2 * * * /opt/scripts/pgvector-backup.sh >/dev/null 2>&+
- +
-# Еженедельно по воскресеньям в 3:00 +
-0 3 * * 0 /opt/scripts/pgvector-backup.sh >/dev/null 2>&+
- +
-# Ежедневно в 2:00 с логированием в syslog +
-0 2 * * * /opt/scripts/pgvector-backup.sh 2>&1 | logger -t pgvector-backup +
-</file> +
- +
-==== Проверка работы cron ==== +
- +
-<code bash> +
-# Проверка статуса cron +
-sudo systemctl status cron +
- +
-# Просмотр логов cron +
-sudo grep pgvector /var/log/syslog +
-</code> +
- +
-===== Структура бекапов ===== +
- +
-После выполнения скрипта в ''/opt/backups/pgvector'' будут созданы: +
- +
-^ Файл ^ Описание ^ +
-| ''pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz'' | Итоговый архив со всеми данными | +
-| ''backup.log'' | Лог-файл операций | +
- +
-**Содержимое итогового архива:** +
-  * SQL дамп основной базы данных +
-  * Полный SQL дамп всех баз данных   +
-  * Архив папок ''postgres_data'' и ''pgadmin_data'' +
-  * Файл ''docker-compose.yml'' +
- +
-===== Восстановление из бекапа =====+
  
 ==== Полное восстановление ==== ==== Полное восстановление ====
  
 <code bash> <code bash>
-1. Остановите контейнеры+# Останавливаем сервис
 cd /opt/pgvector cd /opt/pgvector
-sudo docker-compose down+docker-compose down
  
-2. Создайте резервную копию текущих данных +# Создаем бекап текущего состояния 
-sudo mv postgres_data postgres_data.old +sudo mv postgres_data postgres_data.backup.$(date +%Y%m%d_%H%M%S)
-sudo mv pgadmin_data pgadmin_data.old+
  
-3. Извлеките бекап +# Извлекаем архив 
-cd /opt/backups/pgvector +sudo tar -xzf /opt/backups/pgvector/pgvector_backup_YYYYMMDD_HHMMSS.tar.gz
-sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz+
  
-4. Извлеките данные из архива +# Запускаем сервис 
-sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS.tar.gz -C /opt/pgvector +docker-compose up -d
- +
-# 5. Запустите контейнеры +
-cd /opt/pgvector +
-sudo docker-compose up -d+
 </code> </code>
  
-==== Восстановление только базы данных ====+==== Восстановление только БД ====
  
 <code bash> <code bash>
-1. Извлеките SQL дамп +# Извлекаем SQL дамп 
-cd /opt/backups/pgvector +tar -xzf backup.tar.gz pgvector_backup_YYYYMMDD_HHMMSS_database.sql
-tar -xzf pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz+
  
-2. Восстановите базу данных+# Восстанавливаем
 docker exec -i pgvector_postgres psql -U postgres -d postgres < pgvector_backup_YYYYMMDD_HHMMSS_database.sql docker exec -i pgvector_postgres psql -U postgres -d postgres < pgvector_backup_YYYYMMDD_HHMMSS_database.sql
- 
-# Или восстановите все базы данных 
-docker exec -i pgvector_postgres psql -U postgres < pgvector_backup_YYYYMMDD_HHMMSS_all_databases.sql 
 </code> </code>
  
-===== Мониторинг и обслуживание ===== +===== Мониторинг =====
- +
-==== Проверка размера бекапов ==== +
- +
-<code bash> +
-# Размер всех бекапов +
-du -sh /opt/backups/pgvector+
  
-# Список всех бекапов с размерами +При успешном бекапе приходит уведомление: 
-ls -lah /opt/backups/pgvector/*.tar.gz+<code> 
 +✅ PGVector backup completed 
 +📁 Backup: pgvector_backup_20250830_201456 (45M) 
 +💾 DB dump: 12M   
 +📊 Total backups: 7 
 +💿 Disk space: 2.1G свободно из 10G (79% занято)
 </code> </code>
  
-==== Ручная очистка старых бекапов ==== +Предупреждения при заполнении диска: 
- +<code> 
-<code bash> +⚠️ ATTENTION: Disk >80% full 
-# Удалить бекапы старше 30 дней +⚠️ WARNING: Disk >90% full!
-find /opt/backups/pgvector -name "pgvector_backup_*" -mtime +30 -delete +
-</code> +
- +
-==== Тестирование бекапа ==== +
- +
-<code bash> +
-# Проверка целостности архива +
-tar -tzf /opt/backups/pgvector/pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz +
- +
-# Проверка SQL дампа +
-head -20 pgvector_backup_YYYYMMDD_HHMMSS_database.sql+
 </code> </code>
  
 ===== Устранение проблем ===== ===== Устранение проблем =====
  
-==== Частые ошибки ==== +=== Контейнеры не запущены ===
- +
-**Ошибка: "Файл docker-compose.yml не найден"**+
 <code bash> <code bash>
-# Проверьте путь к файлу +docker-compose ps 
-ls -la /opt/pgvector/docker-compose.yml +docker-compose up -d
-# Отредактируйте переменную COMPOSE_FILE в скрипте+
 </code> </code>
  
-**Ошибка: "Контейнер не найден"**+=== Ошибка дампа БД ===
 <code bash> <code bash>
-# Проверьте имена контейнеров +# Проверяем доступность БД
-docker ps -a +
-# Обновите переменную DB_CONTAINER в скрипте +
-</code> +
- +
-**Ошибка подключения к базе данных** +
-<code bash> +
-# Проверьте статус контейнера+
 docker exec pgvector_postgres pg_isready -U postgres docker exec pgvector_postgres pg_isready -U postgres
  
-# Проверьте пароль +# Проверяем логи 
-docker exec -it pgvector_postgres psql -U postgres+docker logs pgvector_postgres
 </code> </code>
  
-==== Логи отладки ==== +=== Нет места на диске ===
 <code bash> <code bash>
-Запуск с подробными логами +Проверяем использование 
-sudo bash -/opt/scripts/pgvector-backup.sh+df -/opt/backups
  
-Проверка логов Docker +Удаляем старые бекапы 
-docker logs pgvector_postgres +find /opt/backups -name "*backup*.tar.gz" -mtime +5 -delete
-docker logs pgvector_pgadmin+
 </code> </code>
  
 ===== Безопасность ===== ===== Безопасность =====
- 
-<note important> 
-**Рекомендации по безопасности:** 
-  * Храните бекапы на отдельном диске или удаленном сервере 
-  * Регулярно проверяйте целостность бекапов 
-  * Ограничьте права доступа к директории с бекапами 
-  * Зашифруйте бекапы при передаче по сети 
-</note> 
- 
-==== Настройка прав доступа ==== 
  
 <code bash> <code bash>
-Ограничить доступ к директории бекапов +Устанавливаем правильные права 
-sudo chmod 750 /opt/backups/pgvector +sudo chmod 700 /opt/scripts/pgvector-backup.sh 
-sudo chown root:backup /opt/backups/pgvector+sudo chown root:root /opt/scripts/pgvector-backup.sh
  
-Ограничить доступ к скрипту +Защищаем директорию бекапов 
-sudo chmod 750 /opt/scripts/pgvector-backup.sh +sudo chmod 755 /opt/backups 
-</code> +sudo chown root:root /opt/backups
- +
-===== Дополнительные возможности ===== +
- +
-==== Отправка бекапов на удаленный сервер ==== +
- +
-Добавьте в конец скрипта+
- +
-<code bash> +
-# Отправка через rsync +
-rsync -avz "$FINAL_BACKUP" user@remote-server:/backup/pgvector+
- +
-# Отправка через scp +
-scp "$FINAL_BACKUP" user@remote-server:/backup/pgvector/ +
-</code> +
- +
-==== Интеграция с системой мониторинга ==== +
- +
-<code bash> +
-# Отправка метрик в InfluxDB +
-curl -X POST 'http://influxdb:8086/write?db=monitoring'+
---data-binary "pgvector_backup,host=$(hostname) size=${FINAL_SIZE_BYTES} $(date +%s)000000000"+
 </code> </code>
  
 ---- ----
  
-//Последнее обновление$(date)//+//Документация обновлена{{ CURRENTUSER }} {{ date:j.m.Y H:i }}/
  • vm/pgvector/03-backup.1756456752.txt.gz
  • Последнее изменение: 2025/08/29 08:39
  • admin