#!/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