Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| vm:pgvector:03-backup [2025/08/29 08:34] – создано admin | vm:pgvector:03-backup [2025/08/30 17:39] (текущий) – admin | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== | + | ====== |
| ===== Описание ===== | ===== Описание ===== | ||
| - | Скрипт автоматизированного резервного копирования | + | Автоматизированный скрипт для создания |
| + | * Дампов базы данных PostgreSQL | ||
| + | * Архивирования | ||
| + | * Автоматической очистки старых бекапов | ||
| + | * Мониторинга дискового пространства | ||
| + | * Уведомлений в Telegram | ||
| - | **Возможности: | + | ===== Требования |
| - | * Создание SQL дампов базы данных | + | |
| - | * Архивирование папок с данными PostgreSQL и pgAdmin | + | |
| - | * Автоматическая очистка старых | + | |
| - | * Подробное логирование операций | + | |
| - | * Проверка работоспособности сервисов | + | |
| - | * Уведомления | + | |
| - | <note tip> | + | |
| - | Скрипт безопасно останавливает контейнеры для создания консистентного бекапа и автоматически запускает их обратно. | + | * Bash 4.0+ |
| - | </ | + | * Утилиты: '' |
| - | + | * Права root или sudo | |
| - | ===== Предварительные требования ===== | + | |
| - | + | ||
| - | | + | |
| - | * Контейнеры PGVector запущены | + | |
| - | * Права root или sudo для выполнения операций | + | |
| ===== Установка ===== | ===== Установка ===== | ||
| - | ==== Шаг | + | ==== 1. Создание директорий ==== |
| <code bash> | <code bash> | ||
| + | # Создаем необходимые директории | ||
| sudo mkdir -p / | sudo mkdir -p / | ||
| sudo mkdir -p / | sudo mkdir -p / | ||
| + | |||
| + | # Устанавливаем права доступа | ||
| + | sudo chmod 755 / | ||
| + | sudo chmod 755 / | ||
| </ | </ | ||
| - | ==== Шаг | + | ==== 2. Создание скрипта ==== |
| <code bash> | <code bash> | ||
| Строка 38: | Строка 37: | ||
| </ | </ | ||
| - | Скопируйте | + | Скопируйте в файл |
| - | + | ||
| - | ==== Шаг 3: Установка прав на выполнение ==== | + | |
| <code bash> | <code bash> | ||
| - | sudo chmod +x /opt/scripts/ | + | #!/bin/bash |
| - | sudo chown root:root / | + | |
| - | </ | + | # Скрипт резервного |
| - | + | # Запуск: / | |
| - | ==== Шаг 4: Настройка владельца директории бекапов ==== | + | |
| - | + | # Настройки | |
| - | <code bash> | + | |
| - | sudo chown -R $USER:$USER / | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Конфигурация ===== | + | |
| - | + | ||
| - | ==== Основные | + | |
| - | + | ||
| - | Отредактируйте переменные | + | |
| - | + | ||
| - | <file bash / | + | |
| - | # Настройки | + | |
| COMPOSE_FILE="/ | COMPOSE_FILE="/ | ||
| PGVECTOR_DIR="/ | PGVECTOR_DIR="/ | ||
| BACKUP_DIR="/ | BACKUP_DIR="/ | ||
| - | + | DATE=$(date +" | |
| - | # Настройки хранения | + | BACKUP_NAME=" |
| - | RETENTION_DAYS=10 | + | RETENTION_DAYS=10 |
| + | |||
| # Настройки базы данных | # Настройки базы данных | ||
| + | DB_CONTAINER=" | ||
| + | DB_USER=" | ||
| + | DB_PASSWORD=" | ||
| DB_NAME=" | DB_NAME=" | ||
| - | DB_USER="postgres" | + | |
| - | DB_PASSWORD=" | + | # Логирование |
| - | DB_CONTAINER="pgvector_postgres" | + | LOG_FILE="${BACKUP_DIR}/ |
| - | </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 "$DB_DUMP_PATH" | ||
| + | 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 "$COMPOSE_FILE" | ||
| + | TOTAL_CONTAINERS=$(docker-compose -f " | ||
| + | if [ " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | # Проверяем доступность базы данных | ||
| + | log " | ||
| + | export PGPASSWORD=" | ||
| + | if docker exec " | ||
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| - | <note warning> | + | # Проверяем что расширение pgvector доступно |
| - | Убедитесь, что пароль базы данных в скрипте соответствует паролю в docker-compose.yml | + | log " |
| - | </note> | + | if docker exec " |
| + | log " | ||
| + | else | ||
| + | log " | ||
| + | fi | ||
| + | unset PGPASSWORD | ||
| + | |||
| + | # Удаляем старые бекапы | ||
| + | log " | ||
| + | DELETED_COUNT=$(find " | ||
| + | log "Удалено старых бекапов: $DELETED_COUNT" | ||
| + | |||
| + | # Показываем | ||
| + | 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 | ||
| + | </code> | ||
| - | ==== Настройка уведомлений | + | **Обязательно измените |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| - | Раскомментируйте и настройте строки | + | ==== 3. Установка прав выполнения ==== |
| <code bash> | <code bash> | ||
| - | curl -s -X POST " | + | sudo chmod +x /opt/scripts/pgvector-backup.sh |
| - | -d chat_id=" | + | |
| - | -d text=" | + | |
| </ | </ | ||
| - | ===== Использование ===== | + | ===== Настройка Telegram уведомлений ===== |
| - | ==== Ручной запуск ==== | + | 1. Создайте бота через **@BotFather** |
| + | 2. Получите **токен бота** и **chat_id** | ||
| + | 3. Замените в скрипте: | ||
| <code bash> | <code bash> | ||
| - | # Запуск с правами root | + | curl -s -X POST " |
| - | sudo /opt/scripts/pgvector-backup.sh | + | -d chat_id=" |
| + | -d text=" | ||
| + | </ | ||
| - | # Запуск с отображением вывода | + | ===== Автоматизация ===== |
| - | sudo / | + | |
| - | </ | + | |
| - | ==== Проверка логов | + | ==== Настройка Cron ==== |
| <code bash> | <code bash> | ||
| - | # Просмотр последних логов | + | # Редактируем crontab |
| - | tail -f / | + | sudo crontab |
| - | # Просмотр | + | # Добавляем задание - ежедневно в 3: |
| - | cat /opt/backups/ | + | 0 3 * * * /opt/scripts/pgvector-backup.sh >> |
| </ | </ | ||
| - | ===== Автоматизация ===== | + | ===== Использование ===== |
| - | ==== Настройка cron ==== | + | ==== Ручной запуск ==== |
| <code bash> | <code bash> | ||
| - | sudo crontab | + | sudo / |
| </ | </ | ||
| - | Добавьте одну из следующих строк: | + | ==== Проверка |
| - | + | ||
| - | < | + | |
| - | # Ежедневно в 2:00 ночи | + | |
| - | 0 2 * * * / | + | |
| - | + | ||
| - | # Еженедельно по воскресеньям в 3:00 | + | |
| - | 0 3 * * 0 / | + | |
| - | + | ||
| - | # Ежедневно в 2:00 с логированием в syslog | + | |
| - | 0 2 * * * / | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Проверка | + | |
| <code bash> | <code bash> | ||
| - | # Проверка статуса cron | + | # Список бекапов |
| - | sudo systemctl status cron | + | ls -la / |
| - | # Просмотр логов cron | + | # Просмотр лога |
| - | sudo grep pgvector | + | tail -f /opt/backups/pgvector/ |
| </ | </ | ||
| ===== Структура бекапов ===== | ===== Структура бекапов ===== | ||
| - | После выполнения скрипта в '' | + | < |
| - | + | / | |
| - | ^ Файл ^ Описание ^ | + | ├── pgvector_backup_20250830_201456.tar.gz |
| - | | '' | + | ├── |
| - | | '' | + | └── [старые бекапы...] |
| + | </ | ||
| - | **Содержимое | + | **Содержимое архива: |
| - | * SQL дамп | + | * '' |
| - | * Полный SQL дамп всех баз | + | * '' |
| - | * Архив папок '' | + | * '' |
| - | * Файл | + | * '' |
| - | ===== Восстановление | + | ===== Восстановление ===== |
| ==== Полное восстановление ==== | ==== Полное восстановление ==== | ||
| <code bash> | <code bash> | ||
| - | # 1. Остановите контейнеры | + | # Останавливаем сервис |
| cd / | cd / | ||
| - | 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 / | + | sudo tar -xzf / |
| - | sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz | + | |
| - | # 4. Извлеките данные из архива | + | # Запускаем сервис |
| - | sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS.tar.gz -C / | + | docker-compose up -d |
| - | + | ||
| - | # 5. Запустите | + | |
| - | cd / | + | |
| - | sudo docker-compose up -d | + | |
| </ | </ | ||
| - | ==== Восстановление только | + | ==== Восстановление только |
| <code bash> | <code bash> | ||
| - | # 1. Извлеките SQL дамп | + | # Извлекаем SQL дамп |
| - | cd / | + | tar -xzf backup.tar.gz |
| - | 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 | ||
| </ | </ | ||
| - | ===== Мониторинг | + | ===== Мониторинг ===== |
| - | ==== Проверка размера | + | При успешном бекапе приходит уведомление: |
| - | + | < | |
| - | < | + | ✅ PGVector backup completed |
| - | # Размер всех бекапов | + | 📁 Backup: pgvector_backup_20250830_201456 (45M) |
| - | du -sh /opt/backups/pgvector | + | 💾 DB dump: 12M |
| - | + | 📊 Total backups: 7 | |
| - | # Список всех | + | 💿 Disk space: 2.1G свободно из 10G (79% занято) |
| - | ls -lah / | + | |
| </ | </ | ||
| - | ==== Ручная очистка старых бекапов ==== | + | Предупреждения при заполнении диска: |
| - | + | < | |
| - | <code bash> | + | ⚠️ ATTENTION: Disk >80% full |
| - | # Удалить бекапы старше 30 дней | + | ⚠️ WARNING: Disk >90% full! |
| - | find / | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Тестирование бекапа ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Проверка целостности архива | + | |
| - | tar -tzf / | + | |
| - | + | ||
| - | # Проверка SQL дампа | + | |
| - | head -20 pgvector_backup_YYYYMMDD_HHMMSS_database.sql | + | |
| </ | </ | ||
| ===== Устранение проблем ===== | ===== Устранение проблем ===== | ||
| - | ==== Частые ошибки ==== | + | === Контейнеры не запущены === |
| - | + | ||
| - | **Ошибка: | + | |
| - | <code bash> | + | |
| - | # Проверьте путь к файлу | + | |
| - | ls -la / | + | |
| - | # Отредактируйте переменную COMPOSE_FILE в скрипте | + | |
| - | </ | + | |
| - | + | ||
| - | **Ошибка: | + | |
| <code bash> | <code bash> | ||
| - | # Проверьте имена контейнеров | + | docker-compose ps |
| - | docker | + | docker-compose up -d |
| - | # Обновите переменную DB_CONTAINER в скрипте | + | |
| </ | </ | ||
| - | **Ошибка | + | === Ошибка дампа БД === |
| <code bash> | <code bash> | ||
| - | # Проверьте статус | + | # Проверяем доступность БД |
| docker exec pgvector_postgres pg_isready -U postgres | docker exec pgvector_postgres pg_isready -U postgres | ||
| - | # Проверьте пароль | + | # Проверяем логи |
| - | docker | + | docker |
| </ | </ | ||
| - | ==== Логи отладки ==== | + | === Нет места на диске === |
| <code bash> | <code bash> | ||
| - | # Запуск с подробными логами | + | # Проверяем использование |
| - | sudo bash -x /opt/scripts/ | + | df -h /opt/backups |
| - | # Проверка | + | # Удаляем старые бекапы |
| - | docker logs pgvector_postgres | + | find / |
| - | docker logs pgvector_pgadmin | + | |
| </ | </ | ||
| ===== Безопасность ===== | ===== Безопасность ===== | ||
| - | |||
| - | <note important> | ||
| - | **Рекомендации по безопасности: | ||
| - | * Храните бекапы на отдельном диске или удаленном сервере | ||
| - | * Регулярно проверяйте целостность бекапов | ||
| - | * Ограничьте права доступа к директории с бекапами | ||
| - | * Зашифруйте бекапы при передаче по сети | ||
| - | </ | ||
| - | |||
| - | ==== Настройка прав доступа ==== | ||
| <code bash> | <code bash> | ||
| - | # Ограничить доступ к директории бекапов | + | # Устанавливаем |
| - | sudo chmod 750 /opt/backups/pgvector | + | sudo chmod 700 /opt/scripts/pgvector-backup.sh |
| - | sudo chown root:backup | + | sudo chown root:root /opt/scripts/pgvector-backup.sh |
| - | # Ограничить доступ к скрипту | + | # Защищаем директорию бекапов |
| - | sudo chmod 750 / | + | sudo chmod 755 /opt/backups |
| - | </ | + | sudo chown root:root /opt/backups |
| - | + | ||
| - | ===== Дополнительные возможности ===== | + | |
| - | + | ||
| - | ==== Отправка бекапов на удаленный сервер ==== | + | |
| - | + | ||
| - | Добавьте в конец скрипта: | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Отправка через rsync | + | |
| - | rsync -avz " | + | |
| - | + | ||
| - | # Отправка через scp | + | |
| - | scp " | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Интеграция с системой мониторинга ==== | + | |
| - | + | ||
| - | <code bash> | + | |
| - | # Отправка метрик в InfluxDB | + | |
| - | curl -X POST ' | + | |
| - | --data-binary " | + | |
| </ | </ | ||
| ---- | ---- | ||
| - | //Последнее обновление: $(date)// | + | //Документация |