elibria/backup.sh

119 lines
4.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Описание:
# Этот скрипт предназначен для резервного копирования файлов и баз данных WordPress.
# Он может выполнять полный бэкап (файлы и база данных) или только бэкап базы данных.
# Результаты сохраняются в указанные директории и сжимаются в tar.gz формат.
# Логи работы скрипта сохраняются в отдельный файл в директории бэкапов.
# Использование:
# backup.sh full - выполнить полный бэкап (файлы + БД).
# backup.sh db - выполнить бэкап только базы данных.
# backup.sh install - добавить задачи в cron (только при первом запуске).
# Пути и переменные
WP_PATH="/var/www/society" # Путь к директории WordPress
BACKUP_PATH="/var/www/backups" # Путь к директории бэкапов
DB_DUMP_PATH="${BACKUP_PATH}/db_dumps" # Путь к директории с дампами баз данных
LOG_FILE="${BACKUP_PATH}/backup_log_$(date +%F).log" # Путь к лог-файлу
# Функция для логирования
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Создание директорий для бэкапов
mkdir -p "${BACKUP_PATH}"
mkdir -p "${DB_DUMP_PATH}"
# Проверка и установка необходимых пакетов
REQUIRED_PKG=("tar" "mysqldump" "mysql")
for PKG in "${REQUIRED_PKG[@]}"; do
if ! command -v $PKG &> /dev/null; then
log "$PKG could not be found and is required for the script to run."
exit 1
fi
done
# Функция для бэкапа файлов WordPress
backup_files() {
log "Starting WordPress files backup."
tar -czf "${BACKUP_PATH}/wp-files-$(date +%F).tar.gz" -C "${WP_PATH}" .
log "WordPress files backup completed."
}
# Функция для дампа базы данных
backup_db() {
log "Starting database backup."
local DB_NAME=$(cat "${WP_PATH}/wp-config.php" | grep DB_NAME | cut -d "'" -f 4)
local DB_USER=$(cat "${WP_PATH}/wp-config.php" | grep DB_USER | cut -d "'" -f 4)
local DB_PASSWORD=$(cat "${WP_PATH}/wp-config.php" | grep DB_PASSWORD | cut -d "'" -f 4)
mysqldump -u "${DB_USER}" -p"${DB_PASSWORD}" "${DB_NAME}" > "${DB_DUMP_PATH}/db-$(date +%F-%H%M).sql"
log "Database backup completed."
}
# Сжатие дампов БД и файлов в конце дня
compress_backups() {
log "Starting compression of all backups."
tar -czf "${BACKUP_PATH}/wp-backup-$(date +%F).tar.gz" -C "${BACKUP_PATH}" "wp-files-$(date +%F).tar.gz" -C "${DB_DUMP_PATH}" .
log "Compression of all backups completed."
}
# Проверка и добавление задач в cron
add_cron_jobs() {
log "Adding cron jobs for backups."
local FILES_BACKUP_JOB="0 0 * * * /bin/bash ${PWD}/backup.sh full"
local DB_BACKUP_JOB="0 * * * * /bin/bash ${PWD}/backup.sh db"
# Проверка и добавление задачи для бэкапа файлов, если ее нет
if ! crontab -l | grep -q "${FILES_BACKUP_JOB}"; then
(crontab -l 2>/dev/null; echo "${FILES_BACKUP_JOB}") | crontab -
fi
# Проверка и добавление задачи для бэкапа базы данных, если ее нет
if ! crontab -l | grep -q "${DB_BACKUP_JOB}"; then
(crontab -l 2>/dev/null; echo "${DB_BACKUP_JOB}") | crontab -
fi
log "Cron jobs added."
}
# Функция для удаления всех суточных дампов БД
clean_db_dumps() {
log "Cleaning up all daily database dumps."
rm -f "${DB_DUMP_PATH}"/*
}
# Функция для оставления только последних 10 полных бэкапов
cleanup_old_full_dumps() {
log "Cleaning up old full backups, keeping only the last 10."
local files=(${BACKUP_PATH}/wp-backup-*.tar.gz)
if [ ${#files[@]} -gt 10 ]; then
# Отсортировать файлы по дате модификации, удалить самые старые
ls -t ${BACKUP_PATH}/wp-backup-*.tar.gz | tail -n +11 | xargs rm
fi
}
#Основной логика скрипта
case $1 in
full)
log "Initiating full backup."
backup_files
backup_db
compress_backups
clean_db_dumps
cleanup_old_full_dumps
log "Full backup completed."
;;
db)
log "Initiating database only backup."
backup_db
log "Database only backup completed."
;;
install)
add_cron_jobs
;;
*)
echo "Invalid argument. Use 'full' for full backup, 'db' for database backup only, or 'install' to set up cron jobs."
exit 1
;;
esac