Наш дерзкий план такой:
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