Наш дерзкий план такой:
1. монтирование YandexDisk.
2. сохранение папок.
3. сохранение баз MySQL.
4. сохранение баз PostgreSQL
5. размонтирование YandexDisk.
#!/bin/bash # --- --- --- --- --- # --- НАСТРОЙКА --- # --- --- --- --- --- # --- --- --- --- --- TAG=ihor TS=$(date +"%Y-%m-%d_%H-%M") TOUCH_FILES=/root/.scripts/touch_files mkdir -p $TOUCH_FILES/folders mkdir -p $TOUCH_FILES/mysql mkdir -p $TOUCH_FILES/pgsql TMP=/var/tmp/_backup_ mkdir -p $TMP/folders mkdir -p $TMP/mysql mkdir -p $TMP/pgsql # --- определить папки для архивиролвания # --- пример как добавить в конец массива FOLDERS+=(<путь_к_папке>) FOLDERS=( $(find /var/www/* -maxdepth 0) ) #FOLDERS+=(/home/ura) #echo ${FOLDERS[@]} # --- определить базы PostgreSQL для архивиролвания PGUSER=admin PGPASSWORD=italy2000 PGSQL=( 'demo_cmatrix_ru' 'dev_cmatrix_ru' ) # --- определить базы MySQL для архивиролвания MYUSER=admin MYPASSWORD=italy2000 MYSQL=( 'albums_detrostov_ru' 'cmatrix_ru' 'custom_urx_su_rulreika' 'custom_urx_su_rulreika1' 'detrostov_ru' 'forum_detrostov_ru' 'forum_urx_su' 'itx_ru_wiki' 'sites_urx_su_gidro' 'sites_urx_su_kik' 'sites_urx_su_rulreika' 'sites_urx_su_vardane' 'ulybka_detrostov_ru' 'wiki2_urx_su' 'wiki_urx_su' ) # --- --- --- --- --- # --- ПАПКИ --- --- # --- --- --- --- --- function folder_backup(){ while(true) do read path || break echo $path touch_file=`echo $path | sed 's/\///'| sed 's/\//_/g'` mkdir -p $TMP/folders/$touch_file tar cvjf $TMP/folders/$touch_file/$TS'_'`basename $path`.tar.bz2 $path done } function folder_check(){ while(true) do read path || break #echo $path #basename $path # --- отбросить первый слэш и заменить остальные на подчёркивание touch_file=`echo $path | sed 's/\///'| sed 's/\//_/g'` #echo $touch_file # проверяем наличие touch файла # - если есть touch файл, то сверим с ним время последнего # доступа, если есть в папке изменения, то архивируем её, иначе нет # - если нет touch файла, то создаём его и архивируем папку if [ -f $TOUCH_FILES/folders/$touch_file.touch ]; then # найти изменённый файлы, исключая cache f=`find $path -newer $TOUCH_FILES/folders/$touch_file.touch | grep -v cache | grep -v .xml` #f=`find $path -newer $TOUCH_FILES/folders/$touch_file.touch` if [ "$f" != "" ]; then touch $TOUCH_FILES/folders/$touch_file.touch echo $path fi else touch $TOUCH_FILES/folders/$touch_file.touch echo $path fi done }; # --- --- --- --- --- # --- PGSQL --- --- # --- --- --- --- --- function pgsql_check(){ while(true) do read db || break echo $db done }; function pgsql_backup(){ while(true) do read db || break mkdir -p $TMP/pgsql/$db PGPASSWORD=$PGPASSWORD `which pg_dump` -v -h 127.0.0.1 -F p -U $PGUSER -w -f $TMP/pgsql/$db/$TS'_'$db.backup $db bzip2 -9 $TMP/pgsql/$db/$TS'_'$db.backup done }; # --- --- --- --- --- # --- MYSQL --- --- # --- --- --- --- --- function mysql_check(){ while(true) do read db || break echo $db done }; function mysql_backup(){ while(true) do read db || break #echo $db mkdir -p $TMP/mysql/$db `which mysqldump` -u $MYUSER -p$MYPASSWORD $db | bzip2 -9 > $TMP/mysql/$db/$TS'_'$db.backup.bz2 break done }; # --- --- --- --- --- # --- YANDEX --- --- # --- --- --- --- --- function remove(){ while(true) do read path || break #echo $path rm -f "$path" done } function purge(){ while(true) do read path || break find $path/* -maxdepth 0 | sort -r | tail -n +21 | remove done }; # --- --- --- --- --- # --- НАЧАЛО --- --- # --- --- --- --- --- # --- перебрать папки for i in "${FOLDERS[@]}"; do echo $i | folder_check | folder_backup; done # --- перебрать базы PostgreSQL for i in "${PGSQL[@]}"; do echo $i | pgsql_check | pgsql_backup; done # --- перебрать базы MySQL for i in "${MYSQL[@]}"; do echo $i | mysql_check | mysql_backup; done # --- перенсти архив mount -t davfs https://webdav.yandex.ru /mnt/yandex TO_FOLDER=/mnt/yandex/__BACKUP__/$TAG mkdir -p $TO_FOLDER cp -r $TMP/* $TO_FOLDER rm -fr $TMP find $TO_FOLDER/folders/* -maxdepth 0 | purge find $TO_FOLDER/pgsql/* -maxdepth 0 | purge find $TO_FOLDER/mysql/* -maxdepth 0 | purge umount /mnt/yandex