#!/bin/bash # Переменные настройки (измените по необходимости) YANDEX_USER="adremsru@yandex.ru" # Логин Яндекс.Диска YANDEX_APP_PASSWORD="Fg70K5KeYv5O" # Ваш пароль; если не сработает, сгенерируйте пароль приложения на https://id.yandex.ru/security/app-passwords # Ручная настройка базы данных (раскомментируйте и задайте, если парсинг не работает) # DB_NAME="oppakor_wp1" # DB_USER="oppakor_oppakor" # DB_PASSWORD="tH9kM9xZ0b" # DB_HOST="localhost" # Настройка даты и директорий DATE=$(date +%Y-%m-%d_%H-%M-%S) # Формат: ГГГГ-ММ-ДД_ЧЧ-ММ-СС BACKUP_DIR="backup_${DATE}" # Папка бэкапа с датой LOG_FILE="${BACKUP_DIR}/backup.log" # Файл лога DUMP_FILE="${BACKUP_DIR}/db_${DATE}.sql" # Файл дампа базы данных ARCHIVE_PREFIX="${BACKUP_DIR}/site_${DATE}.tar.gz" # Префикс для архива сайта # Проверка наличия mysqldump if ! command -v mysqldump >/dev/null 2>&1; then echo "$(date): mysqldump не найден! Установите: sudo apt install mariadb-client. Выход." >> "${LOG_FILE}" exit 1 fi # Создание папки бэкапа mkdir -p "${BACKUP_DIR}" echo "$(date): Создана папка бэкапа ${BACKUP_DIR}" > "${LOG_FILE}" # Проверка наличия и прав доступа к wp-config.php if [ ! -f "wp-config.php" ]; then echo "$(date): Файл wp-config.php не найден! Проверьте, что скрипт запущен из корня WordPress. Выход." >> "${LOG_FILE}" exit 1 fi if [ ! -r "wp-config.php" ]; then echo "$(date): Файл wp-config.php недоступен для чтения! Исправьте права: chmod 644 wp-config.php. Выход." >> "${LOG_FILE}" exit 1 fi # Проверка на BOM или нестандартные символы file wp-config.php | grep -q "BOM" if [ $? -eq 0 ]; then echo "$(date): Обнаружен BOM в wp-config.php. Удаляю его." >> "${LOG_FILE}" sed -i '1s/^\xEF\xBB\xBF//' wp-config.php fi # Парсинг wp-config.php для получения учетных данных базы # Улучшенное регулярное выражение для обработки кавычек и пробелов if [ -z "$DB_NAME" ]; then DB_NAME=$(grep -oP "define\s*\(\s*['\"]DB_NAME['\"]\s*,\s*['\"]\K[^'\"]+(?=['\"]\s*\)\s*;)" wp-config.php | head -n 1) echo "$(date): Парсинг DB_NAME: '$DB_NAME'" >> "${LOG_FILE}" fi if [ -z "$DB_USER" ]; then DB_USER=$(grep -oP "define\s*\(\s*['\"]DB_USER['\"]\s*,\s*['\"]\K[^'\"]+(?=['\"]\s*\)\s*;)" wp-config.php | head -n 1) echo "$(date): Парсинг DB_USER: '$DB_USER'" >> "${LOG_FILE}" fi if [ -z "$DB_PASSWORD" ]; then DB_PASSWORD=$(grep -oP "define\s*\(\s*['\"]DB_PASSWORD['\"]\s*,\s*['\"]\K[^'\"]+(?=['\"]\s*\)\s*;)" wp-config.php | head -n 1) echo "$(date): Парсинг DB_PASSWORD: '$DB_PASSWORD'" >> "${LOG_FILE}" fi if [ -z "$DB_HOST" ]; then DB_HOST=$(grep -oP "define\s*\(\s*['\"]DB_HOST['\"]\s*,\s*['\"]\K[^'\"]+(?=['\"]\s*\)\s*;)" wp-config.php | head -n 1) echo "$(date): Парсинг DB_HOST: '$DB_HOST'" >> "${LOG_FILE}" fi # Проверка успешности парсинга if [ -z "$DB_NAME" ] || [ -z "$DB_USER" ] || [ -z "$DB_PASSWORD" ] || [ -z "$DB_HOST" ]; then echo "$(date): Ошибка парсинга учетных данных из wp-config.php. Проверьте формат файла или задайте DB_NAME, DB_USER, DB_PASSWORD, DB_HOST вручную в скрипте. Выход." >> "${LOG_FILE}" exit 1 fi # Создание дампа базы данных mysqldump -h "${DB_HOST}" -u "${DB_USER}" -p"${DB_PASSWORD}" "${DB_NAME}" > "${DUMP_FILE}" echo "$(date): Выполнен дамп базы данных." >> "${LOG_FILE}" # Проверка дампа базы данных if [ $? -eq 0 ] && [ -s "${DUMP_FILE}" ]; then echo "$(date): Дамп базы данных успешно создан и проверен (не пустой)." >> "${LOG_FILE}" else echo "$(date): Ошибка проверки дампа базы данных. Проверьте учетные данные базы: mysql -h $DB_HOST -u $DB_USER -p'$DB_PASSWORD' $DB_NAME. Выход." >> "${LOG_FILE}" exit 1 fi # Создание архива файлов сайта (исключая папку бэкапа) tar czf - . --exclude="./${BACKUP_DIR}" | split -b 2G - "${ARCHIVE_PREFIX}." echo "$(date): Создан архив файлов сайта с разбивкой." >> "${LOG_FILE}" # Проверка архива cat "${ARCHIVE_PREFIX}."* | tar tz > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "$(date): Архив успешно проверен." >> "${LOG_FILE}" else echo "$(date): Ошибка проверки архива. Выход." >> "${LOG_FILE}" exit 1 fi # Загрузка на Яндекс.Диск REMOTE_DIR="${BACKUP_DIR}" curl -u "${YANDEX_USER}:${YANDEX_APP_PASSWORD}" -X MKCOL "https://webdav.yandex.ru/${REMOTE_DIR}/" > /dev/null 2>&1 echo "$(date): Создана удаленная папка на Яндекс.Диске." >> "${LOG_FILE}" # Загрузка дампа базы данных curl -u "${YANDEX_USER}:${YANDEX_APP_PASSWORD}" -T "${DUMP_FILE}" "https://webdav.yandex.ru/${REMOTE_DIR}/$(basename ${DUMP_FILE})" > /dev/null 2>&1 # Загрузка частей архива for part in "${ARCHIVE_PREFIX}."*; do curl -u "${YANDEX_USER}:${YANDEX_APP_PASSWORD}" -T "${part}" "https://webdav.yandex.ru/${REMOTE_DIR}/$(basename ${part})" > /dev/null 2>&1 done echo "$(date): Файлы загружены на Яндекс.Диск." >> "${LOG_FILE}" # Проверка загрузки (сравнение размеров файлов) LOCAL_DB_SIZE=$(stat -c%s "${DUMP_FILE}") REMOTE_DB_SIZE=$(curl -sI -u "${YANDEX_USER}:${YANDEX_APP_PASSWORD}" "https://webdav.yandex.ru/${REMOTE_DIR}/$(basename ${DUMP_FILE})" | grep -i Content-Length | awk '{print $2}' | tr -d '\r') if [ "${LOCAL_DB_SIZE}" -eq "${REMOTE_DB_SIZE}" ]; then echo "$(date): Размер дампа базы данных совпадает (локальный: ${LOCAL_DB_SIZE}, удаленный: ${REMOTE_DB_SIZE})." >> "${LOG_FILE}" else echo "$(date): Несовпадение размера дампа базы данных! (локальный: ${LOCAL_DB_SIZE}, удаленный: ${REMOTE_DB_SIZE}). Проверьте пароль Яндекс.Диска." >> "${LOG_FILE}" fi for part in "${ARCHIVE_PREFIX}."*; do LOCAL_SIZE=$(stat -c%s "${part}") REMOTE_SIZE=$(curl -sI -u "${YANDEX_USER}:${YANDEX_APP_PASSWORD}" "https://webdav.yandex.ru/${REMOTE_DIR}/$(basename ${part})" | grep -i Content-Length | awk '{print $2}' | tr -d '\r') if [ "${LOCAL_SIZE}" -eq "${REMOTE_SIZE}" ]; then echo "$(date): $(basename ${part}) размер совпадает (локальный: ${LOCAL_SIZE}, удаленный: ${REMOTE_SIZE})." >> "${LOG_FILE}" else echo "$(date): $(basename ${part}) несовпадение размера! (локальный: ${LOCAL_SIZE}, удаленный: ${REMOTE_SIZE}). Проверьте пароль Яндекс.Диска." >> "${LOG_FILE}" fi done echo "$(date): Процесс резервного копирования завершен." >> "${LOG_FILE}"