Backup базы mysql, файлов и каталогов на локальный диск и облачное хранилище

Вернуться на уровень выше

Скрипт делает резервные копии базы mysql

Резервные копии файлов и директорий из списка с возможностью исключений.

Ведет слежение за изменениями конфигов в системе.

Работает с облачными хранилищами с поддержкой davfs2 (проверено на yandex.disk, cubby, pcloud), а также поддерживает работу с облачным хранилищем MEGA, поддержка консольного клиента Яндекс.диска, клиента owncloud, клиента DropBox.

При надобности шифрует файлы по ключу перед отправкой в облако.

Ведет лог и шлет на почту.

Скрипт создать в любой удобной директории, но желательно создать отдельную директорию, например /home/backup

mkdir /home/backup
cd /home/backup

Можно скачать с git последнюю версию:

wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh
wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf

Или создать вручную:

nano SYS_backup.sh
#!/bin/bash
# Version 14
HOME_DIR=$(cd $(dirname $0)&& pwd)
source $HOME_DIR/SYS_backup.conf

echo "----------------$DATE $SERVER_NAME-----------------" >>$LOG
set $(wc -l $LOG);LOGSTART=$1
echo -e "Свободное место на диске \n" "$(df -h $HOME_DIR)" >>$LOG
#Создаем ссылку на лог в рабочем каталоге
if ! ([ -e $LOG_LINK ])then
{
ln -s $LOG $LOG_LINK
}
fi

if !([ -d "$PACH_FOR_BACKUP_TO_DISK" ])then
{
mkdir $PACH_FOR_BACKUP_TO_DISK
}
fi

if [ "$SEND_EMAIL" -ne 0 -o "$SEND_EMAIL_2" -ne 0 ];then
{
service $EMAIL_SERVICE start
}
fi
#----------------------------------------------
FUNC_EMAIL()
{
set $(wc -l $LOG);LOGEND=$1"p"
(echo "Subject:$SERVER_NAME"; sed -n  $LOGSTART,$LOGEND $LOG;) | sendmail -F "BACKUP" $EMAIL_TMP
echo "отправка письма на почту $EMAIL_TMP" >>$LOG
}

FUNC_RM_OLDFILES_WEBDISK()
{
find $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK -mtime +$LIFE_TIME_FILE_ON_WEBDISK |sort|xargs rm -f
STATUS=$?
if [ $STATUS -ne 0 ]
then
sleep 10
FUNC_RM_OLDFILES_WEBDISK
fi
}

FUNC_RM_FILE_WEBDISK()
{
rm -f $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME
STATUS=$?
if [ $STATUS -ne 0 ]
then
sleep 10
FUNC_RM_FILE_WEBDISK
fi
}

FUNC_COPY_TO_WEBDISK()
{
if [ "$BACKUP_TO_WEBDISK" -ne 0 ];then
{
if !([ -e "$PACH_FOR_WEBDISK" ])then
{
echo "$PACH_FOR_WEBDISK каталог не найден, создание каталога" >>$LOG
mkdir $PACH_FOR_WEBDISK
}
fi

if ! ( mount -v | grep -q $PACH_FOR_WEBDISK ) then
if [ "$MOUNT_POINT" = "mega" ];then
megafs --disable-previews --config $MEGA_CONF $PACH_FOR_WEBDISK
else
mount -t davfs $MOUNT_POINT $PACH_FOR_WEBDISK
fi
fi

if ! ( mount -v | grep -q $PACH_FOR_WEBDISK ) then
{
echo "! Ошибка Монтирование диска $MOUNT_POINT в $PACH_FOR_WEBDISK !" >>$LOG
}
else
{
if !([ -d "$PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK" ])then
{
echo "Каталог $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK не существует или был удален. Создание каталога" >>$LOG
mkdir -p $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK
}
fi

#Удаляем самые старые файлы пока не хватит места для нового бэкапа
if [ $FREESPACE_WEBDISK -ne 0 ];then
{
SIZEFILE=`du -sm $PACH_FOR_BACKUP_TO_DISK/$FILENAME | awk '{print$1}'`
let FREESPACE=`df -m | grep "$PACH_FOR_WEBDISK" | awk '{print $3}'`-$SIZEFILE
while [$FREESPACE<0]
do
find $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK -name "*.tar.gz" -and -type f | sort -r | tail -n1 | xargs -i rm '{}'
let FREESPACE=`df -m | grep "$PACH_FOR_WEBDISK" | awk '{print $3}'`-$SIZEFILE
done
}
fi

if [ "$MOUNT_POINT" = "mega" ];then
megaput --config=$MEGA_CONF --path /$DIR_BACKUP_FOR_WEBDISK/ $PACH_FOR_BACKUP_TO_DISK/$FILENAME
else

if [ "$ENCRYPTION" -ne 0 ]
then
gpg -o $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME.gpg --yes -e -r $ENCRYPTION_ID_USER $PACH_FOR_BACKUP_TO_DISK/$FILENAME
else
cp $PACH_FOR_BACKUP_TO_DISK/$FILENAME $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME 2>>$LOG
fi
STATUS=$?

fi

if [ $STATUS -ne 0 -a ! -e "$PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME" ];then
echo "! Ошибка $STATUS создания файла $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME !" >>$LOG
else
echo "Файл $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME создан успешно" >>$LOG
fi
}
fi
}
fi
}
#----------------------------------------------
FILENAME="log*tar.gz*"
rm -f $PACH_FOR_BACKUP_TO_DISK/$FILENAME
if [ "$BACKUP_TO_WEBDISK" -ne 0 ]
then
FUNC_RM_FILE_WEBDISK

FUNC_RM_OLDFILES_WEBDISK
fi
#----------------------------------------------
if [ "$BACKUP_MYSQL" -ne 0 ]; then
{
if [ "$DB_USER" = "" ]
then
DB_USER=$(cat $PATH_MIKBILL'app/etc/config.xml'| grep  username | awk '{ gsub("<username>"," "); print }' | awk '{ gsub("</username>"," "); print }' | awk '{print $1}')
fi
if [ "$DB_PASSWORD" = "" ]
then
DB_PASSWORD=$(cat $PATH_MIKBILL'app/etc/config.xml'| grep  password | awk '{ gsub("<password>"," "); print }' | awk '{ gsub("</password>"," "); print }' | awk '{print $1}')
fi

FILENAME=sql-"$SERVER_NAME"-"$DATE".sql.gz
mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME 2>/dev/null | gzip > $PACH_FOR_BACKUP_TO_DISK/$FILENAME

find $PACH_FOR_BACKUP_TO_DISK -mtime +$LIFE_TIME_FILE_ON_DISk |sort|xargs rm -f

echo "Бекап $PACH_FOR_BACKUP_TO_DISK/$FILENAME создан успешно" >>$LOG
FUNC_COPY_TO_WEBDISK
}
fi
#----------------------------------------------
if [ "$BACKUP_FILES" -ne 0 ];then
{

if !([ -e "$TAR_EXCLUDE_LIST" ])then
{
echo "Создание файла исключений $TAR_EXCLUDE_LIST для бекапа файлов"
touch $TAR_EXCLUDE_LIST
}
fi

if !([ -e "$TAR_INCLUDE_LIST" ])then
{
echo "! Бекап файлов включен, но конфигурационный файл $TAR_INCLUDE_LIST не найден. Создание файла. Заполните его !" >>$LOG
touch $TAR_INCLUDE_LIST
}
else
{
FILENAME=files-"$SERVER_NAME"-"$DATE".tar.gz

tar -X $TAR_EXCLUDE_LIST -T $TAR_INCLUDE_LIST -czf $PACH_FOR_BACKUP_TO_DISK/$FILENAME 2>>$LOG
STATUS=$?

if [ $STATUS -ne 0 ];then
echo "! Ошибка создания архива $STATUS $PACH_FOR_BACKUP_TO_DISK/$FILENAME !" >>$LOG
else
echo "Архив $PACH_FOR_BACKUP_TO_DISK/$FILENAME создан успешно" >>$LOG
fi
FUNC_COPY_TO_WEBDISK
}
fi
}
fi
#----------------------------------------------
FUNC_TAR_DIFF()
{
#Бекап предыдущей проверки
rm -f $DIFF_BACKUP
tar -czf $DIFF_BACKUP $FILENAME 2>>$LOG
if [ $? -ne 0 ];then
{
echo "Ошибка создания резервной копии каталога $DIFF_DIR_NEW" >>$LOG
}
fi
}

if [ "$DIFF_FILES" -ne 0 ];then
{
echo "----------Проверка DIFF...----------" >>$LOG
if !([ -e "$DIFF_INCLUDE_LIST" ])then
{
echo "! Проверка DIFF включена, но файл $DIFF_INCLUDE_LIST не найден !" >>$LOG
}
else
{
if [ `ls $DIFF_DIR_NEW | wc -l` -eq 0 ];then
{
echo "Каталог $DIFF_DIR_NEW пустой или не существует (копируются файлы для последующей проверки)" >>$LOG
rsync -rptgoq --exclude-from=$DIFF_EXCLUDE_LIST --files-from=$DIFF_INCLUDE_LIST / $DIFF_DIR_NEW
#Делаем резервную копию
FILENAME=$DIFF_DIR_NEW
FUNC_TAR_DIFF
}
else
{
rsync -rptgo $DIFF_DIR_NEW/* $DIFF_DIR_OLD
#Снапшот системы
rsync -rptgoq --delete --delete-excluded --exclude-from=$DIFF_EXCLUDE_LIST --files-from=$DIFF_INCLUDE_LIST / $DIFF_DIR_NEW
#Сравниваем
if diff -r $DIFF_DIR_OLD $DIFF_DIR_NEW >>$LOG;then
{
echo "Отличий нет" >>$LOG
#Если нет резервной копии, делаем
if !([ -e "$DIFF_BACKUP" ])then
FILENAME=$DIFF_DIR_NEW
FUNC_TAR_DIFF
fi
}
else
{
#Делаем резервную копию
FILENAME=$DIFF_DIR_NEW
FUNC_TAR_DIFF
#Делаем инкрементную копию файлов
rsync -rptgo --delete -b --backup-dir=$DIFF_DIR_TEMP $DIFF_DIR_NEW/* $DIFF_DIR_OLD
#Если есть измененные файлы делаем архив предыдущей версии
if ([ -d "$DIFF_DIR_TEMP" ])then
{
FILENAME=configs-"$SERVER_NAME"-"$DATE".tar.gz
tar -czf $PACH_FOR_BACKUP_TO_DISK/$FILENAME $DIFF_DIR_TEMP 2>>$LOG
STATUS=$?
if [ $STATUS -ne 0 ];then
echo "! Ошибка создания архива ($STATUS) $PACH_FOR_BACKUP_TO_DISK/$FILENAME из каталога $DIFF_DIR_OLD !" >>$LOG
else
echo "Архив $PACH_FOR_BACKUP_TO_DISK/$FILENAME каталога $DIFF_DIR_OLD создан успешно" >>$LOG
rm -rf $DIFF_DIR_TEMP
fi
FUNC_COPY_TO_WEBDISK
}
else
{
echo "Изменения есть, но старые файлы изменены не были, архив создан не будет" >>$LOG
}
fi
#Отправляем на почту лог изменений
if [ "$SEND_EMAIL_2" -ne 0 ];then
{
EMAIL_TMP=$EMAIL_2
FUNC_EMAIL
}
fi

}
fi
}
fi
}
fi
#Удаляем временный каталог
rm -rf $DIFF_DIR_OLD
}
fi
#----------------------------------------------
if [ "$SEND_EMAIL" -ne 0 ];then
{
EMAIL_TMP=$EMAIL
FUNC_EMAIL
}
fi

if [ "$SEND_EMAIL" -ne 0 -o "$SEND_EMAIL_2" -ne 0 ];then
{
sleep 20
service $EMAIL_SERVICE stop
}
fi
#-----------------------------------------------
if [ "$BACKUP_TO_WEBDISK" -ne 0 ];then
{
echo -e "Свободное место на диске \n" "$(df -h $PACH_FOR_WEBDISK)" >>$LOG

FILENAME="log-"$DATE".tar.gz"
tar -czf $PACH_FOR_BACKUP_TO_DISK/$FILENAME $LOG

FUNC_COPY_TO_WEBDISK

if [ "$UMOUNT_WEBDISK" -ne 0 ];then
{
umount -l $PACH_FOR_WEBDISK
}
fi
}
fi
#-----------------------------------------------
if [ "$LOG_IN_TERMINAL" -ne 0 ];then
{
set $(wc -l $LOG);LOGEND=$1"p"
sed -n  $LOGSTART,$LOGEND $LOG
}
fi

#END SCRIPT

Даем права на запуск

chmod +x /home/backup/SYS_backup.sh

Создаем конфиг

nano SYS_backup.conf
# version 14
# wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf
SERVER_NAME="ServerName"
LOG=/var/log/backup.log
HOME_DIR=$(cd $(dirname $0)&& pwd)
#HOME_DIR=/home/backup
#----------------------------------------------
BACKUP_MYSQL=1
BACKUP_FILES=0
BACKUP_TO_WEBDISK=1
DIFF_FILES=0
LOG_IN_TERMINAL=0
#-BACKUP TO DISK-------------------------------------
#Путь для бекапа на диске
PACH_FOR_BACKUP_TO_DISK=$HOME_DIR/files
#Количество дней для ротации файлов
LIFE_TIME_FILE_ON_DISk=20
# MySQL (На сервере с биллингом логин/пароль можно не указывать тут)-------
PATH_MIKBILL=/var/www/mikbill/admin/
DB_USER=""
DB_PASSWORD=""
DB_NAME="mikbill"
# Шифрование------------------------------------------
ENCRYPTION=0
ENCRYPTION_ID_USER="admin"
#-WEBDISK---------------------------------------------
#Точка монтирования 
#Yandex
MOUNT_POINT=https://webdav.yandex.ru
#Cubby
#MOUNT_POINT=https://webdav.cubby.com
#Mega
#MOUNT_POINT=mega
#MEGA_CONF=$HOME_DIR/megafs.ini

#Путь для WEBDISK
PACH_FOR_WEBDISK=$HOME_DIR/webdisk
DIR_BACKUP_FOR_WEBDISK=backups
#Время ротации файлов
LIFE_TIME_FILE_ON_WEBDISK=20
#Удаление старых файлов при нехватке места для новых файлов
FREESPACE_WEBDISK=0
#Размонтирование диска после выполнения действий (UMOUNT_WEBDISK=0 не размонтировать)
UMOUNT_WEBDISK=0
#-FILES---------------------------------------------
TAR_INCLUDE_LIST=$HOME_DIR/tar.include.list
TAR_EXCLUDE_LIST=$HOME_DIR/tar.exclude.list
#-DIFF---------------------------------------------
DIFF_BACKUP=$HOME_DIR/diff-$SERVER_NAME.tar.gz
DIFF_INCLUDE_LIST=$HOME_DIR/diff.include.list
DIFF_EXCLUDE_LIST=$HOME_DIR/diff.exclude.list
DIFF_DIR_NEW=$HOME_DIR/diff.new
DIFF_DIR_OLD=$HOME_DIR/diff.old
DIFF_DIR_TEMP=$HOME_DIR/diff.temp
#-EMAIL---------------------------------------------
SEND_EMAIL=0
EMAIL=mail@mail.com
EMAIL_SERVICE=postfix

SEND_EMAIL_2=0
EMAIL_2=mail@mail.com
#----------------------------------------------------
DATE=`date +%Y-%m-%d_%Hh%Mm`
LOG_LINK=$HOME_DIR/backup.log

Настраиваем время запуска в кроне

mcedit /etc/crontab
#mikbill backup
00 06 * * * root /home/backup/SYS_backup.sh

Регистрируем почту на яндексе

Устанавливаем нужные пакеты

yum install neon

добавляем epel репозиторий для davfs2 (для центос)

rpm -Uvh http://mirror.omnilance.com/epel//6/x86_64/epel-release-6-8.noarch.rpm

или

rpm -ivh http://download.fedoraproject.org/pub/epel/6/$(arch)/epel-release-6-8.noarch.rpm

или

yum install epel-release

и устанавливаем yum install davfs2

Настраиваем учетную запись на сервере

nano /etc/davfs2/secrets

Вводим наш логин пароль (логин без @yandex)

https://webdav.yandex.ru login password

Настраиваем davfs2

mcedit /etc/davfs2/davfs2.conf
use_locks 0 # Увеличит скорость работы
delay_upload 0 # Уменьшит задержку перед загрузкой файла
cache_size 5000 # Размер кеша
cache_dir /var/cache/davfs2 # Каталог для кеша

Проверяем каталог /var/cache/davfs2 чтобы хватало места для кеша

Создаем каталог куда будет монтироваться облачное хранилище

mkdir /home/backup/webdisk

Проверяем. Примонтировать без перезагрузки (должно без запроса логина пароля, если спрашивает, значит что-то не так с davfs)

mount -t davfs https://webdav.yandex.ru /home/backup/webdisk

Проверить

df -h /home/backup/webdisk

Включить в скрипте

BACKUP_TO_WEBDISK=1

Размонтирование яндекс диска после выполнения скрипта (монтирование происходит автоматически)

UMOUNT_DISK=1

Прописать в /etc/davfs2/secrets ссылку на webdav и логин пароль по примеру яндекс диска настроить точку монтирования в скрипте MOUNT_POINT=

В скрипте уже добавлена возможность подключения к cubby Регистрация https://www.cubby.com

mcedit /etc/davfs2/secrets
https://webdav.cubby.com LOGIN PASSWORD

в скрипте закомментировать

#MOUNT_POINT=https://webdav.yandex.ru

и раскомментировать

MOUNT_POINT=https://webdav.cubby.com

(Подразумевается синхронизация каталога files с Я.диском)

Установка

https://yandex.ru/support/disk/cli-clients.html

nano /etc/yum.repos.d/yandex.repo
[yandex]
name=Yandex
failovermethod=priority
baseurl=http://repo.yandex.ru/yandex-disk/rpm/stable/$basearch/
enabled=1
metadata_expire=1d
gpgcheck=1
gpgkey=http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
rpm --import http://repo.yandex.ru/yandex-disk/YANDEX-DISK-KEY.GPG
yum install yandex-disk

Запускаем настройку

yandex-disk setup

Отвечаем на вопросы

Would you like to use a proxy server?: n
Enter username:Ваш логин
Enter password:Ваш пароль
Enter path to Yandex.Disk folder: /home/backup/files
Would you like Yandex.Disk to launch on startup?: y (скрипт включает если выключен демон)

В конфиге включить

BACKUP_TO_YANDEX_CLIENT=1

Для проверки работы

yandex-disk status

отобразит статус работы демона (состояние синхронизации, ошибки синхронизации, список синхронизированных файлов, общее и свободное пространство на Диске).

Два варианта:

- резервирование каталога files (самый простой, без лишних настроек).

Для включения этого режима включаем:

BACKUP_TO_DROPBOX_CLIENT=1

- резерверование в каталог webdisk (плюс в поддержке шифрования, бекап в 1 файл, что актуально для dropbox,- бекапится в один файл, а старые копии можно забирать на dropbox с истории версий).

Для включения этого режима включаем:

BACKUP_TO_DROPBOX_CLIENT=1
BACKUP_TO_WEBDISK=1

Ставим клиент dropbox: https://www.dropbox.com/ru/install-linux

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
~/.dropbox-dist/dropboxd

Переходим по ссылке которую кинуло в консоль, подтверждаем. Прерываем работу скрипта. Ставим Dropbox CLI

cd ~
curl -LO https://www.dropbox.com/download?dl=packages/dropbox.py
chmod +x ~/dropbox.py

Делаем ссылку на каталог dropbox

Тут в зависимости от того какой вариант выбрали

rm -Rf ~/Dropbox && ln -s /home/backup/files ~/Dropbox

или

rm -Rf ~/Dropbox && ln -s /home/backup/webdisk ~/Dropbox

Все, демон или автозапуск не нужен, будет запускаться синхронизация каталога из скрипта

Установка на Centos

последнюю версию берем тут https://megatools.megous.com/

yum -y install glib2-devel openssl-devel libcurl fuse-devel libcurl-devel wget
cd /root 
wget http://megatools.megous.com/builds/megatools-1.9.94.tar.gz 
tar -zxf megatools-1.9.94.tar.gz 
cd megatools-1.9.94
make 
make install

Настраиваем учетку

nano /home/backup/megafs.ini
[Login]
Username = LOGIN
Password = PASSWORD
chmod 600 /home/backup/megafs.ini

В файле SYS_backup.conf раскомментировать строчки

MOUNT_POINT=mega
MEGA_CONF=$HOME_DIR/megafs.ini
DIR_BACKUP_FOR_WEBDISK=backups

поменять на

DIR_BACKUP_FOR_WEBDISK=Root/backups

(Подразумевается синхронизация каталога files с Owncloud)

Установка клиента https://software.opensuse.org/download/package?project=isv:ownCloud:desktop&package=owncloud-client

cd /etc/yum.repos.d/ 
wget http://download.opensuse.org/repositories/isv:ownCloud:desktop/CentOS_6/isv:ownCloud:desktop.repo 
yum install owncloud-client

В конфиге включаем

BACKUP_TO_OWNCLOUD=1

В следующей строке в адресе меняем "address" на IP своего сервера (или домен)

Owncloud_address=https://address/owncloud/remote.php/webdav/backup

где backup каталог на owncloud который будет синхронизироваться.

Добавляем логин и пароль от owncloud

Owncloud_login= 
Owncloud_pass=

В итоге будет синхронизироваться каталог files с owncloud каталогом backup

Для шифрования файлов на webdisk

Включаем в конфиге

ENCRYPTION=1

Создаем ключ

gpg --gen-key

отвечаем

RSA and RSA (жмем enter)

2048 (жмем enter)

Real name: admin

(если имя создаете другое поменяйте и в конфиге ENCRYPTION_ID_USER="admin" )

Email address: (жмем enter)

Comment: (жмем enter)

Создаем публичный ключ

Enter passphrase:

После сообщения

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 215 more bytes)

Ждем пока сгенерирутся приватный ключ (у меня минут 30 генерировался)

Экспорт и импорт ключей Экспорт открытого ключа (gpg id=admin)в файл

gpg --export -a admin > public.asc

Экспорт приватного ключа в файл.

gpg --export-secret-keys -a admin > secret.asc

Импорт открытого ключа из файла.

gpg --import public.asc

Импорт закрытого ключа из файла.

gpg --allow-secret-key-import --import secret.asc

Создать файл с путями к файлам

nano /home/backup/tar.include.list

Пример файла для биллинга:

/var/www/mikbill
/etc/rc.d/rc.local
/etc/my.cnf
/etc/php-fpm.d/www.conf
/etc/nginx
/etc/crontab
/etc/php.ini
/etc/resolv.conf
/etc/sudoers
/etc/sysctl.conf
/etc/yum.repos.d
/etc/fstab
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/ssh/sshd_config
/etc/passwd
/usr/local/etc/raddb/radiusd.conf
/usr/local/etc/raddb/sites-enabled/dhcp

Пример файла для биллинга Debian:

/etc/network/interfaces
/var/www/mikbill
/etc/rc.local
/etc/mysql/my.cnf
/etc/nginx/conf.d
/etc/crontab
/etc/cron.d
/etc/resolv.conf
/etc/sysctl.conf
/home/backup/SYS_backup.conf

Пример файла для сервера BRAS accel:

/etc/accel-ppp.conf
/etc/accel-ppp.lua
/etc/init.d/firewall
/etc/network/interfaces
/etc/rc.local
/etc/nginx/conf.d
/var/www/mikbill/user_pages
/etc/resolv.conf
/etc/sysctl.conf
/etc/modules
/home/backup/SYS_backup.conf
/etc/dhcp/dhcpd.conf
/etc/unbound/unbound.conf
/etc/quagga
/etc/default/grub
/etc/modules
/etc/init.d/accel
/usr/local/share/accel-ppp/radius/dictionary

Включить в скрипте

BACKUP_FILES=1

(В этой версии нужен файл исключений, хотя-бы пустой)

torch /home/backup/tar.exclude.list

Пример файла исключений

/var/www/mikbill/admin/sys/mrtg_users
/var/www/mikbill/admin/res/help
/var/www/mikbill/admin/res/speedtest
/var/www/mikbill/admin/res/speedtest2
/var/www/mikbill/stat/app/log
/var/www/mikbill/stat/res/distr
/var/www/mikbill/stat/res/player
/var/www/mikbill/admin/res/mon2/img

В результате эти каталоги будут исключены из архива

Настроить postfix

mcedit /etc/postfix/main.cf
inet_interfaces = localhost
inet_protocols = all

Заменить на

inet_interfaces =127.0.0.1
inet_protocols = ipv4

Включить в скрипте

SEND_EMAIL=1

Указать почту

EMAIL=mailname@gmail.com

Указать имя сервера от которого будут приходить логи

SERVER_NAME=servername

Указать сервис для отправки почты (по умолчанию postfix, еще проверялся exim)

EMAIL_SERVICE=postfix

Запустить postfix и добавить в автозагрузку

service postfix start
chkconfig postfix on

Проверяем

netstat -an | grep 25

Вторая почта используется для отправки логов только при изменении файлов (DIFF_FILES=1). Работают независимо друг от друга Включить

SEND_EMAIL_2=1

Указать почту

EMAIL_2=mailname@gmail.com

Для подключения почты по альтернативным портам (postfix)

mcedit /etc/postfix/master.cf

это комментируем

smtp      inet  n       -       n       -       -       smtpd

Раскомментировать и проверить строчку

smtps     inet  n       -       n       -       -       smtpd

проверить

service postfix restart

cмотрим как поменялся порт

netstat -lnpt | grep master

отправляем тестовое письмо

echo "test"| sendmail -F "test" mail@gmail.com

и смотрим лог /var/log/maillog

почта тестировалась на сервисах google и yandex

создать файл в каталоге скрипта

nano diff.include.list

пример содержания (может включать в себя каталоги)

/etc/rc.d/rc.local
/etc/my.cnf
/etc/php-fpm.d/www.conf
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/crontab
/etc/php.ini
/etc/resolv.conf
/etc/sudoers
/etc/sysctl.conf
/etc/yum.repos.d
/etc/fstab
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/ssh/sshd_config
/etc/passwd
/var/www/mikbill/admin/app/etc/config.xml
/var/www/mikbill/admin/sys/update/mikbill_current
/usr/local/etc/raddb/radiusd.conf
/usr/local/etc/raddb/sites-enabled/dhcp
/etc/raddb/radiusd.conf
/root/.bash_history

включить в скрипте

DIFF_FILES=1

Если нужны исключения

nano diff.exclude.list

пример содержания

/etc/dhcp/dhcpd.conf/etc/mrtg/

файлы diff.include.list и diff.exclude.list поддерживают комментарии "#" и ";" . В общем это делает rsync, так что читать мануал по нему, например http://wiki.dieg.info/rsync

Пример проверки файлов для сервера Carbon Reductor

diff.include.list
/etc/
/root/.ssh
/root/.bash_history
/usr/local/Reductor
diff.exclude.list
/usr/local/Reductor/lists
/usr/local/Reductor/reductor_container
/usr/local/Reductor/cache/

Пример проверки файлов для debian accel

diff.include.list
/etc/
/var/www/
/root/.ssh
/root/.bash_history
diff.exclude.list
/etc/ppp/downlog.txt
/etc/ppp/uplog.txt
  • billing/howto/backup_local_and_yandex.txt
  • Последние изменения: 17 месяц (-ев) назад
  • — Олег Вильковский