vm:pgvector:03-backup

Это старая версия документа!


Скрипт резервного копирования PGVector

Скрипт автоматизированного резервного копирования для контейнеров PGVector (PostgreSQL с расширением vector) и pgAdmin. Создает полные бекапы включающие SQL дампы и архивы данных.

Возможности:

  • Создание SQL дампов базы данных
  • Архивирование папок с данными PostgreSQL и pgAdmin
  • Автоматическая очистка старых бекапов
  • Подробное логирование операций
  • Проверка работоспособности сервисов
  • Уведомления в Telegram (опционально)

<note tip> Скрипт безопасно останавливает контейнеры для создания консистентного бекапа и автоматически запускает их обратно. </note>

  • Docker и Docker Compose установлены
  • Контейнеры PGVector запущены из директории /opt/pgvector
  • Права root или sudo для выполнения операций
sudo mkdir -p /opt/scripts
sudo mkdir -p /opt/backups/pgvector
sudo nano /opt/scripts/pgvector-backup.sh

Скопируйте содержимое скрипта в файл и сохраните.

sudo chmod +x /opt/scripts/pgvector-backup.sh
sudo chown root:root /opt/scripts/pgvector-backup.sh
sudo chown -R $USER:$USER /opt/backups/pgvector

Отредактируйте переменные в начале скрипта под ваши нужды:

/opt/scripts/pgvector-backup.sh
# Настройки путей
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="FDg44ThJHFjwO"  # Ваш пароль
DB_CONTAINER="pgvector_postgres"

<note warning> Убедитесь, что пароль базы данных в скрипте соответствует паролю в docker-compose.yml </note>

Раскомментируйте и настройте строки в конце скрипта:

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)"
# Запуск с правами root
sudo /opt/scripts/pgvector-backup.sh
 
# Запуск с отображением вывода
sudo /opt/scripts/pgvector-backup.sh | tee /tmp/backup.log
# Просмотр последних логов
tail -f /opt/backups/pgvector/backup.log
 
# Просмотр всех логов
cat /opt/backups/pgvector/backup.log
sudo crontab -e

Добавьте одну из следующих строк:

# Ежедневно в 2:00 ночи
0 2 * * * /opt/scripts/pgvector-backup.sh >/dev/null 2>&1

# Еженедельно по воскресеньям в 3:00
0 3 * * 0 /opt/scripts/pgvector-backup.sh >/dev/null 2>&1

# Ежедневно в 2:00 с логированием в syslog
0 2 * * * /opt/scripts/pgvector-backup.sh 2>&1 | logger -t pgvector-backup
# Проверка статуса cron
sudo systemctl status cron
 
# Просмотр логов cron
sudo grep pgvector /var/log/syslog

После выполнения скрипта в /opt/backups/pgvector будут созданы:

Файл Описание
pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz Итоговый архив со всеми данными
backup.log Лог-файл операций

Содержимое итогового архива:

  • SQL дамп основной базы данных
  • Полный SQL дамп всех баз данных
  • Архив папок postgres_data и pgadmin_data
  • Файл docker-compose.yml
# 1. Остановите контейнеры
cd /opt/pgvector
sudo docker-compose down
 
# 2. Создайте резервную копию текущих данных
sudo mv postgres_data postgres_data.old
sudo mv pgadmin_data pgadmin_data.old
 
# 3. Извлеките бекап
cd /opt/backups/pgvector
sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz
 
# 4. Извлеките данные из архива
sudo tar -xzf pgvector_backup_YYYYMMDD_HHMMSS.tar.gz -C /opt/pgvector
 
# 5. Запустите контейнеры
cd /opt/pgvector
sudo docker-compose up -d
# 1. Извлеките SQL дамп
cd /opt/backups/pgvector
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 < pgvector_backup_YYYYMMDD_HHMMSS_all_databases.sql
# Размер всех бекапов
du -sh /opt/backups/pgvector
 
# Список всех бекапов с размерами
ls -lah /opt/backups/pgvector/*.tar.gz
# Удалить бекапы старше 30 дней
find /opt/backups/pgvector -name "pgvector_backup_*" -mtime +30 -delete
# Проверка целостности архива
tar -tzf /opt/backups/pgvector/pgvector_backup_YYYYMMDD_HHMMSS_complete.tar.gz
 
# Проверка SQL дампа
head -20 pgvector_backup_YYYYMMDD_HHMMSS_database.sql

Ошибка: «Файл docker-compose.yml не найден»

# Проверьте путь к файлу
ls -la /opt/pgvector/docker-compose.yml
# Отредактируйте переменную COMPOSE_FILE в скрипте

Ошибка: «Контейнер не найден»

# Проверьте имена контейнеров
docker ps -a
# Обновите переменную DB_CONTAINER в скрипте

Ошибка подключения к базе данных

# Проверьте статус контейнера
docker exec pgvector_postgres pg_isready -U postgres
 
# Проверьте пароль
docker exec -it pgvector_postgres psql -U postgres
# Запуск с подробными логами
sudo bash -x /opt/scripts/pgvector-backup.sh
 
# Проверка логов Docker
docker logs pgvector_postgres
docker logs pgvector_pgadmin

<note important> Рекомендации по безопасности:

  • Храните бекапы на отдельном диске или удаленном сервере
  • Регулярно проверяйте целостность бекапов
  • Ограничьте права доступа к директории с бекапами
  • Зашифруйте бекапы при передаче по сети

</note>

# Ограничить доступ к директории бекапов
sudo chmod 750 /opt/backups/pgvector
sudo chown root:backup /opt/backups/pgvector
 
# Ограничить доступ к скрипту
sudo chmod 750 /opt/scripts/pgvector-backup.sh

Добавьте в конец скрипта:

# Отправка через rsync
rsync -avz "$FINAL_BACKUP" user@remote-server:/backup/pgvector/
 
# Отправка через scp
scp "$FINAL_BACKUP" user@remote-server:/backup/pgvector/
# Отправка метрик в InfluxDB
curl -X POST 'http://influxdb:8086/write?db=monitoring' \
--data-binary "pgvector_backup,host=$(hostname) size=${FINAL_SIZE_BYTES} $(date +%s)000000000"

Последнее обновление: $(date)

  • vm/pgvector/03-backup.1756456497.txt.gz
  • Последнее изменение: 2025/08/29 08:34
  • admin