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