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
Для подключения других файловых хранилищ поддерживающих davfs2
Прописать в /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
отобразит статус работы демона (состояние синхронизации, ошибки синхронизации, список синхронизированных файлов, общее и свободное пространство на Диске).
Для работы с клиентом DropBox
Два варианта:
- резервирование каталога 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
Все, демон или автозапуск не нужен, будет запускаться синхронизация каталога из скрипта
Для работы с облачным хранилищем MEGA
Установка на 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
Для работы с клиентом Owncloud
(Подразумевается синхронизация каталога 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