Искал я значит удобное и простое средство резервного копирования сайта с WordPress и не находил. Те плагины, что вылезают в поиске как «топ 10» — не знаю, сомнительны они мне по описанию, да и в чем суть из бекапа? Кого — то надо руками запускать, кто-то на облако только выкладывает…
Короче решился я написать себе свой скрипт, который аккуратно все будет делать, проверять результаты работы, логировать сои действия да еще и по SCP архив с бекапом убирать куда-нибудь по дальше.
Скрипт получился довольно объемным, хотя его базовый функционал можно уместить в пару строк. Однако обработка ошибок, различные проверки, логирование — несколько раздули его структуру, после чего мне пришлось аккуратно переупаковать его, разбив по функциям.
Собственно сам скрипт ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
#!/bin/bash source ./config.cfg # # печатаем статус завершения команды - ok или fail и раскрашиваем # $1 - первый аргумент функции print_status() { if [ $1 -eq 0 ]; then echo -n "${green}${toend}[OK]" else echo -n "${red}${toend}[fail]" fi echo -n "${reset}" echo } # # проверяем зависимости (наличие необходимых утилит) # mysqldump, sshpass, tar, gzip, scp, tee check_dependencies() { echo -n "Check dependencies..." | tee -a $BP_LOG DEP=$(which mysqldump sshpass tar gzip scp tee| wc -l) if [$DEP -ne 5]; then print_status 1 echo " * there is NOT all dependencies!" | tee -a $BP_LOG return 1 fi print_status 0 echo -e " * all dependencies ready!" | tee -a $BP_LOG return 0 } # # проверяем что хватает места yf lbcrt check_free_disk_space() { echo -n "Check free disk space..." | tee -a $BP_LOG FREE_SPACE=$(df -m $BP_DUMP_PUTH 2>>$BP_LOG |awk '{print $4}' | tail -n 1 ) if [ $FREE_SPACE= -lt $MIN_SPACE ]; then print_status 1 echo " * there is NO enought free disk space!" | tee -a $BP_LOG return 1 fi print_status 0 echo -e " * Free disk space - ok!" | tee -a $BP_LOG return 0 } # # проверяем, что сервис Mysql запущен иначе нет смысла к нему коннектится check_run_sql() { echo "Check mysql service is running..." | tee -a $BP_LOG # есть два варианта проверки.. в зависимости от того, установлен ли в системе systemd или нет. which systemd > /dev/null RET=$? if [ $RET -eq 0 ]; then echo -n " * there is SystemD service, checking.." | tee -a $BP_LOG systemctl is-active mysql.service RET=$? else echo -n " * there is NO SystemD, checking.." | tee -a $BP_LOG service mysql status | grep "start/running" RET=$? fi if [ $RET -eq 0 ]; then print_status 0 echo " * service is runnig!" | tee -a $BP_LOG return 0 else print_status 1 # иначе завершаем работу т.к. нет смысла бекапить дальше, у нас уже проблемы echo " * no service is running" | tee -a $BP_LOG return 1 fi } # # проверяем, сто существует директория с файлами WP check_wp_dir_exist() { echo -n "Check wp catalog exist..." | tee -a $BP_LOG if [ ! -d $WP_FILE_DIR ] then print_status 1 echo " * No directory $WP_FILE_DIR !" | tee -a $BP_LOG return 1 else print_status 0 return 0 fi } # # обработчик ошибок для вызываемых функций operation_result() { # $1 - код возврата # $2 - название действия if [ ! $1 -eq 0 ]; then print_status 1 echo " * $2 problem, finishing... See $BP_LOG for more information!" | tee -a $BP_LOG exit 1 fi print_status 0 echo " * $2 ready!" | tee -a $BP_LOG echo " " | tee -a $BP_LOG } main() { if [ ! check_dependencies ] || [ ! check_free_disk_space ] || [ ! check_run_sql ]; then exit 1; fi # устанавливаем текущую дату BP_DATE=$(date +"%m-%d-%y") # делаем запись в логе echo "|=======================================================================================|" >> $BP_LOG echo "| $BP_DATE Starting backup job [$BP_TASK_NAME] at [$(date +%H:%M:%S)] |" >> $BP_LOG echo "|=======================================================================================|" >> $BP_LOG # создаем каталог где временно будут храниться копии до формирования полного тарбола echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo -n "Create temp directory $BP_DUMP_PUTH/$BP_TEMP_DIR..." | tee -a $BP_LOG mkdir -p $BP_DUMP_PUTH/$BP_TEMP_DIR operation_result $? "create temp directory" # делаем дамп базы echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo -n "Dumping database $DB_NAME..." | tee -a $BP_LOG mysqldump -u $DB_USER -p$DB_PASSWD $DB_NAME 2>>$BP_LOG | gzip > $DB_DUMP_PUTH/$DB_DUMP_NAME.sql.gz 2>>$BP_LOG operation_result $? "mysqldump" # архивируем каталог wordrpess echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo -n "archiving $WP_FILE_DIR catalog..." | tee -a $BP_LOG tar -czpf "$WP_BCKP_PUTH/$WP_BCKP_NAME.tar.gz" $WP_FILE_DIR 2>>$BP_LOG operation_result $? "archiving" # собираем все это в один тарбол echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo -n "Prepearing full tarboll..." | tee -a $BP_LOG cd $BP_DUMP_PUTH tar -cf $BP_DUMP_PUTH/$BP_TASK_NAME.$BP_DATE.tar $BP_TEMP_DIR 2>>$BP_LOG echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo -n "Removing temp dir $BP_TEMP_DIR..." | tee -a $BP_LOG rm -rf $BP_TEMP_DIR 2>>$BP_LOG operation_result $? "removing temp dir" # TODO - заменить потом sshpass на работу по ключу # переносим архив на удаленный сервер по scp echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo "Removing tarboll by scp to remote server..." sshpass -p $SCP_PSWD scp -P $SCP_PORT -o StrictHostKeyChecking=no $BP_DUMP_PUTH/$BP_TASK_NAME.$BP_DATE.tar $SCP_LOGIN@$SCP_IP:$SCP_PATH 2>>$BP_LOG operation_result $? "remove by scp" echo -n "[$(date +%H:%M:%S)] " >>$BP_LOG echo "Backup job [$BP_TASK_NAME] successfully completed! " >> $BP_LOG } main "$@" |
А вот пример файла-конфига к нему ( указывается-подключается в самом начале скрипта). Учетные данные для доступа к БД WordPress указаны тестовые.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# минимальный размер дискового пространства, необходимый для работы бекапа (в мб) MIN_SPACE=1000 # имя задания резервного копирования BP_TASK_NAME="wordpress_backup" # директории в которых идет работа BP_DUMP_PUTH="/home/akella/test_backup" BP_TEMP_DIR="backup" # лог бекапа BP_LOG=$BP_DUMP_PUTH/"wp_backup.log" # параметры, касающиеся дампа базы данных, логин пароль тут тестовые DB_USER="wordpress" DB_PASSWD="wordpress" DB_NAME="wordpress" DB_DUMP_PUTH=$BP_DUMP_PUTH/$BP_TEMP_DIR DB_DUMP_NAME="wordpress" # параметры, касающиеся архивации каталога WP WP_FILE_DIR="/var/www/wordpress" WP_BCKP_PUTH=$BP_DUMP_PUTH/$BP_TEMP_DIR WP_BCKP_NAME="wp-file_arc" # параметры для слива бекапа по scp на удаленную машину SCP_PATH="путь - куда положить" SCP_IP="IP удаленного пк" SCP_PORT="порт" SCP_LOGIN="логин" SCP_PSWD="пароль" # установка для раскраски вывода скрипта red=$(tput setf 4) green=$(tput setf 2) reset=$(tput sgr0) toend=$(tput hpa $(tput cols))$(tput cub 6) |
В дальнейшем, планируется доработать скрип, добавив возможность не только выкладывать архив куда-то по SCP, но и загружать архив на Яндекс диск, используя его REST API.