Скрипт для создания резервных копий postgreSQL и загрузки на ftp

В современном мире, где данные являются одним из самых ценных ресурсов, резервное копирование становится неотъемлемой частью 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 для хранения бэкапов обеспечивает удобство и доступность данных при необходимости восстановления.