====== 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(""," "); print }' | awk '{ gsub(""," "); print }' | awk '{print $1}') fi if [ "$DB_PASSWORD" = "" ] then DB_PASSWORD=$(cat $PATH_MIKBILL'app/etc/config.xml'| grep password | awk '{ gsub(""," "); print }' | awk '{ gsub(""," "); 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 смотрим как изменился порт 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