From 1e641c0c595325038391cfdabec9b817412e64ef Mon Sep 17 00:00:00 2001 From: NW Date: Mon, 25 Dec 2023 21:23:11 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB(=D0=B0)=20?= =?UTF-8?q?'backup.sh'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backup.sh | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 backup.sh diff --git a/backup.sh b/backup.sh new file mode 100644 index 0000000..61a49ea --- /dev/null +++ b/backup.sh @@ -0,0 +1,119 @@ +#!/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 \ No newline at end of file