Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия | |||
| vm:pgvector:03-backup [2025/08/30 17:38] – admin | vm:pgvector:03-backup [2025/08/30 17:39] (текущий) – admin | ||
|---|---|---|---|
| Строка 37: | Строка 37: | ||
| </ | </ | ||
| - | Скопируйте содержимое | + | Скопируйте |
| <code bash> | <code bash> | ||
| - | # Пути | + | #!/ |
| + | |||
| + | # Скрипт резервного копирования PGVector | ||
| + | # Запуск: / | ||
| + | |||
| + | # Настройки | ||
| COMPOSE_FILE="/ | COMPOSE_FILE="/ | ||
| PGVECTOR_DIR="/ | PGVECTOR_DIR="/ | ||
| BACKUP_DIR="/ | BACKUP_DIR="/ | ||
| - | + | DATE=$(date +" | |
| - | # База данных | + | BACKUP_NAME=" |
| + | RETENTION_DAYS=10 | ||
| + | |||
| + | # Настройки базы | ||
| DB_CONTAINER=" | DB_CONTAINER=" | ||
| DB_USER=" | DB_USER=" | ||
| DB_PASSWORD=" | DB_PASSWORD=" | ||
| DB_NAME=" | DB_NAME=" | ||
| + | |||
| + | # Логирование | ||
| + | LOG_FILE=" | ||
| + | |||
| + | # Функция логирования | ||
| + | log() { | ||
| + | echo " | ||
| + | } | ||
| + | |||
| + | # Создаем директорию для бекапов если не существует | ||
| + | mkdir -p " | ||
| + | |||
| + | log "=== Начало резервного копирования PGVector ===" | ||
| + | |||
| + | # Проверяем что compose файл существует | ||
| + | if [ ! -f " | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Переходим в директорию с PGVector | ||
| + | cd " | ||
| + | log " | ||
| + | exit 1 | ||
| + | } | ||
| + | # Проверяем что контейнеры запущены | ||
| + | log " | ||
| + | if ! docker-compose -f " | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | # Создаем дамп базы данных (пока контейнеры работают) | ||
| + | log " | ||
| + | DB_DUMP_PATH=" | ||
| + | # Экспортируем пароль для pg_dump | ||
| + | export PGPASSWORD=" | ||
| + | docker exec " | ||
| + | if [ $? -eq 0 ] && [ -s " | ||
| + | log " | ||
| + | | ||
| + | # Получаем размер дампа | ||
| + | DB_DUMP_SIZE=$(du -h " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | rm -f " | ||
| + | exit 1 | ||
| + | fi | ||
| + | # Очищаем переменную окружения | ||
| + | unset PGPASSWORD | ||
| + | # Останавливаем контейнеры | ||
| + | log " | ||
| + | docker-compose -f " | ||
| + | |||
| + | if [ $? -eq 0 ]; then | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Ждем пару секунд для полной остановки | ||
| + | sleep 5 | ||
| + | |||
| + | # Создаем архив с данными (включая дамп БД) | ||
| + | log " | ||
| + | BACKUP_PATH=" | ||
| + | |||
| + | tar -czf " | ||
| + | --exclude=' | ||
| + | --exclude=' | ||
| + | -C " | ||
| + | -C " | ||
| + | postgres_data/ | ||
| + | pgadmin_data/ | ||
| + | docker-compose.yml | ||
| + | |||
| + | if [ $? -eq 0 ]; then | ||
| + | log " | ||
| + | |||
| + | # Получаем размер архива | ||
| + | BACKUP_SIZE=$(du -h " | ||
| + | log " | ||
| + | | ||
| + | # Удаляем отдельный файл дампа, так как он теперь в архиве | ||
| + | rm -f " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | |||
| + | # Пытаемся запустить контейнеры даже при ошибке | ||
| + | log " | ||
| + | docker-compose -f " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Запускаем контейнеры обратно | ||
| + | log " | ||
| + | docker-compose -f " | ||
| + | |||
| + | if [ $? -eq 0 ]; then | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | # Ждем запуска сервисов | ||
| + | sleep 15 | ||
| + | |||
| + | # Проверяем что все контейнеры работают | ||
| + | log " | ||
| + | RUNNING_CONTAINERS=$(docker-compose -f " | ||
| + | TOTAL_CONTAINERS=$(docker-compose -f " | ||
| + | if [ " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | # Проверяем доступность базы данных | ||
| + | log " | ||
| + | export PGPASSWORD=" | ||
| + | if docker exec " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| - | # Retention | + | # Проверяем что расширение pgvector доступно |
| - | RETENTION_DAYS=10 | + | log " |
| + | if docker exec " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | unset PGPASSWORD | ||
| + | |||
| + | # Удаляем старые бекапы | ||
| + | log " | ||
| + | DELETED_COUNT=$(find " | ||
| + | log " | ||
| + | |||
| + | # Показываем статистику бекапов | ||
| + | BACKUP_COUNT=$(ls -1 " | ||
| + | TOTAL_SIZE=$(du -sh " | ||
| + | log " | ||
| + | log " | ||
| + | # Получаем информацию о свободном месте на диске | ||
| + | BACKUP_DISK_USAGE=$(df -h " | ||
| + | ROOT_DISK_USAGE=$(df -h / | awk 'NR==2 {print $4 " свободно из " $2 " (" $5 " занято)" | ||
| + | log " | ||
| + | if [ " | ||
| + | log " | ||
| + | fi | ||
| + | # Получаем процент заполнения диска с бекапами для предупреждений | ||
| + | BACKUP_DISK_PERCENT=$(df " | ||
| + | if [ " | ||
| + | log " | ||
| + | elif [ " | ||
| + | log " | ||
| + | fi | ||
| + | |||
| + | log "=== Резервное копирование завершено успешно ===" | ||
| + | # Формируем сообщение для Telegram | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | 📁 Backup: $BACKUP_NAME ($BACKUP_SIZE) | ||
| + | 💾 DB dump: $DB_DUMP_SIZE | ||
| + | 📊 Total backups: $BACKUP_COUNT | ||
| + | 💿 Disk space: $BACKUP_DISK_USAGE" | ||
| + | # Добавляем предупреждение о месте, если нужно | ||
| + | if [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ WARNING: Disk >90% full!" | ||
| + | elif [ " | ||
| + | TELEGRAM_MESSAGE=" | ||
| + | ⚠️ ATTENTION: Disk >80% full" | ||
| + | fi | ||
| + | # Отправляем уведомление в Telegram (опционально) | ||
| + | curl -s -X POST " | ||
| + | -d chat_id=" | ||
| + | -d text=" | ||
| + | exit 0 | ||
| </ | </ | ||
| + | |||
| + | **Обязательно измените следующие параметры: | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| ==== 3. Установка прав выполнения ==== | ==== 3. Установка прав выполнения ==== | ||