В современном мире, где данные являются одним из самых ценных ресурсов, резервное копирование становится неотъемлемой частью IT-стратегии любой организации. Автоматизация этого процесса значительно упрощает задачу, обеспечивая регулярность и надежность сохранения данных. В этой статье мы рассмотрим, как можно использовать Bash-скрипт для создания резервных копий баз данных PostgreSQL и их последующей отправки на FTP-сервер, а также автоматического управления хранением старых копий.
Структура скрипта
Скрипт начинается с объявления переменных, которые содержат всю необходимую информацию для выполнения операций: путь к директории для сохранения бэкапов, частичное имя контейнера Docker с базой данных, имя базы данных и пользователя, файл с паролем к базе, учетные данные FTP-сервера, куда будут отправлены бэкапы, и количество дней, в течение которых бэкапы должны храниться как локально, так и на FTP-сервере.
Поиск контейнера
Скрипт использует команду docker ps
для поиска запущенного контейнера Docker по части его имени. Это необходимо для того, чтобы точно идентифицировать, с каким именно контейнером предстоит работать. Если контейнер не найден, скрипт завершается с ошибкой, предотвращая выполнение последующих действий.
Создание резервной копии
Для создания резервной копии базы данных скрипт использует команду pg_dump
, запускаемую внутри контейнера. Для этого скрипт сначала извлекает пароль из файла внутри контейнера, а затем генерирует имя файла бэкапа с текущей датой и временем. Результатом выполнения команды является SQL-файл, содержащий все данные базы.
Отправка файла на FTP
После создания бэкапа скрипт использует curl
для его отправки на FTP-сервер. Это делается с использованием учетных данных FTP, указанных в переменных. После успешной отправки скрипт сообщает об этом.
Управление старыми бэкапами
Для освобождения места как на локальной машине, так и на FTP-сервере, скрипт удаляет старые файлы бэкапов, которые старше указанного количества дней. Локально это делается с помощью команды find
, на FTP-сервере — с помощью утилиты lftp. Это обеспечивает освобождение места для новых бэкапов и предотвращает его неэффективное использование.
Сам скрипт
#!/bin/bash # Переменные BACKUP_DIR="/www/backup/database/" CONTAINER_NAME_PART="pgsql-db" POSTGRES_DB="name-db" POSTGRES_USER="postgres" POSTGRES_PASS_FILE="/run/secrets/db_passwd" FTP_USER="backup" FTP_PASSWORD="backup123" FTP_HOST="192.168.0.200" FTP_DIR="/backup" DAYS_OLD=4 cd $BACKUP_DIR # Находим ID контейнера CONTAINER_ID=$(docker ps | grep $CONTAINER_NAME_PART | awk '{print $1}') if [ -z "$CONTAINER_ID" ]; then echo "Контейнер не найден." exit 1 fi # Чтение пароля POSTGRES_PASSWORD=$(docker exec $CONTAINER_ID cat $POSTGRES_PASS_FILE) # Формирование имени файла бэкапа BACKUP_FILE_NAME="backup_$(date +%Y%m%d_%H%M%S).sql" # Создание бэкапа docker exec -e PGPASSWORD=$POSTGRES_PASSWORD $CONTAINER_ID pg_dump -U $POSTGRES_USER $POSTGRES_DB > $BACKUP_FILE_NAME echo "Бэкап $POSTGRES_DB сохранен в файл $BACKUP_FILE_NAME" # Отправка файла на FTP curl -T ${BACKUP_FILE_NAME} --user ${FTP_USER}:${FTP_PASSWORD} ftp://${FTP_HOST}${FTP_DIR}/ echo "Файл ${BACKUP_FILE_NAME} успешно отправлен на FTP сервер." # Удаление старых файлов локально find $BACKUP_DIR -type f -name "*.sql" -mtime +$DAYS_OLD -exec echo "Удаляется локальный файл: {}" \; -exec rm {} \; lftp -u ${FTP_USER},${FTP_PASSWORD} ${FTP_HOST} <<EOF set ssl:verify-certificate no cd ${FTP_DIR} cls -1 --sort=date | awk 'NR>$DAYS_OLD' | xargs -r -d '\n' rm bye EOF echo "Старые файлы на FTP сервере удалены."
Заключение
Приведенный скрипт является отличным примером того, как можно автоматизировать процесс резервного копирования баз данных и управления этими копиями. Bash-скрипты предлагают гибкость и мощь командной строки Linux для решения подобных задач, делая процесс более надежным и менее затратным по времени. Использование контейнеров Docker в комбинации с FTP для хранения бэкапов обеспечивает удобство и доступность данных при необходимости восстановления.