Бекап локальный и в облачное хранилище, контроль изменений файлов в системе
Автономное резервное копирование базы, файлов и каталогов системы
Быстрая установка
mkdir /home/backup cd /home/backup wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf chmod +x SYS_backup.sh wget https://github.com/mikbill/design/raw/master/backup/tar.include.list wget https://github.com/mikbill/design/raw/master/backup/tar.exclude.list |
Что делает скрипт:
- резервные копии базы mysql- резервные копии любых файлов и директорий из списка с возможностью исключений
- копии делаются локально в настраиваемый каталог в системе и если настроено, то еще и в облако
- Поддержка облачных хранилищ с описанием настройки каждого:
все, что поддерживают WedDAV в Linux
Dropbox Client - 2 GB, журнал версий
Dropbox uploader - 2 GB, журнал версий
Yandex.Disk WebDAV - 10 GB
Yandex.Disk Client - 10 GB
pCloud WebDAV - 12 GB, журнал версий
Mega Client - 50 GB
ownCloud Client - частное хранилище
Google drive через Gdrive - 15 GB
- возможность работы с несколькими облачными сервисами одновременно. Для этого просто настраивается еще один скрипт в другом каталоге и еще один вызов из крона. Так сделано чтобы работа систем полностью не зависела от работы и настройки другого бекапа.
- возможность gpg-шифрования по ключу всех файлов, перед отправкой в облако.
- проверка конца дампа базы. Если дамп не полный, то в лог запишется соответствующая запись
- ведение лога операций, лог сохраняется и на облаке.
- поддержка - CentOS, Debian, Ubuntu. Настройка на этих системах практически не отличается. Установка в примере идет для CentOS, для Debian/Ubuntu делать тоже самое с заменой установщика пакетов yum на apt-get
- настройка ротации файлов в локальном каталоге и в облаке.
- возможность работы с почтой. Настройка отправки лога на почту при каждом действии, так и отправка только при изменениях в системе.
- ведет слежение за изменениями файлов и каталогов в системе. Если файл был изменен, покажет какие строчки были изменены, что там было и что стало. В том числе покажет удаленные файлы, с возможностью восстановления из резервной копии (облака/локальной копии). Список слежения широко настраивается. Можно указать файлы, папки, с возможностью исключений. Вкратце логика такая, - при следующей проверке проверяется предыдущий снимок с текущим. Если есть отличия, то файлы предыдущего снимка архивируются (только те, что отличаются, отсутствуют, добавлены), при этом все отличия заносятся в лог.
- интегрирован с работой Mikbill. Подтягивает учетные данные с конфигов. Уже готовые листы для сохранения каталога Mikbill с исключениями ненужных файлов в бекапе. Такие же листы есть для сервера Accel и для IPTV сервера с установленным Stalker-Portal, Carbon Reductor. В тоже время скрипт не привязан к Mikbill или еще к чему-либо, может использоваться с любым другим функционалом.
- проверка подключения облачного диска перед самым вызовом создания бекапа. Не нужно настраивать подключение облачного диска при запуске системы. Скрипт сам проверит и запустит. В случае с WebDAV можно и отмонтировать диск после операции.
Установка
Для закачки скрипта нужен wgetДля CentOS:
- yum install wget
- apt-get install wget
- mkdir /home/backup
- cd /home/backup
SYS_backup.sh - вся логика. Тут ничего не менять, если не знаете, что делаете.
SYS_backup.conf - файл конфигурации. Все настройки будут тут. Далее просто конфиг.
Качаем файлы
- wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh
- wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.conf
- chmod +x /home/backup/SYS_backup.sh
Настройка автозапуска из крона (в примере ежедневный бекап в 6 утра)
- mcedit /etc/crontab
# Mikbill backup
00 06 * * * root /home/backup/SYS_backup.sh
Настройка функционала
Сам делаю и рекомендую бекап на дропбокс через Dropbox-uploader (настройка ниже)
Для работы Yandex Disk WebDAV
Регистрация яндекс диска (+1 ГБ по реферальной системе)Плюс идет акция +32 GB, подробности по ссылке
Добавляем epel репозиторий для davfs2
- yum install epel-release
Ставим davfs
- 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 # Тут будет кеш по умолчанию, можно изменить по желанию
- mkdir /home/backup/webdisk
- mount -t davfs https://webdav.yandex.ru /home/backup/webdisk
проверить
- df -h /home/backup/webdisk
для проверки передачи можно в момент передачи открыть вторую консоль и смотреть передачу iftop-ng
установка c epel
- yum install iftop
Еще проверка сетевого подключения
- sudo netstat -nap | grep davfs
ошибка /sbin/mount.davfs: can't open fuse device (у меня была на vps)
ядро скомпилено без поддержки fuse
попробовать включить
- modprobe fuse
и проверить
- lsmod | grep fuse
BACKUP_TO_WEBDISK=1Размонтирование яндекс диска после выполнения скрипта (монтирование происходит автоматически)
UMOUNT_DISK=0Размонтирование не сработает если открыт mc в каталоге webdisk
Для шифрования файлов на webdisk
Включаем в конфигеENCRYPTION=1Создаем ключ
- gpg --gen-key
Отвечаем
Enter passphrase:
RSA and RSA (жмем enter)Создаем публичный ключ
2048 (жмем enter)
Срок дейсвия ключа: 0
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
Для расшифровки на другом компьютере
Импортируем секретный ключ
(у меня пошло и так)
- gpg --import secret.asc
и расшифровываем
- gpg --decrypt-files FILENAME.gpg
Также нужно будет ввести пароль от секретного ключа
Для подключения других файловых хранилищ поддерживающих WebDAV
прописать в /etc/davfs2/secrets ссылку на webdav и логин пароль по примеру яндекс дисканастроить точку монтирования в скрипте MOUNT_POINT=
Добавить точку монтирования и свои учетные данные в /etc/davfs2/secrets своего хранилища.
Точку монтирования WebDAV можно узнать на сайте своего облака.
Пример подключения pCloud
- mcedit /etc/davfs2/secrets
https://webdav.pcloud.com LOGIN PASSWORDв скрипте SYS_backup.conf закомментировать настроенную по умолчанию точку монтирования
#MOUNT_POINT=https://webdav.yandex.ruи занести свою
MOUNT_POINT=https://webdav.pcloud.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
Для работы с клиентом Owncloud
Установка клиента - Ссылка- 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=В итоге будет синхронизироваться каталог files с owncloud каталогом backup
Owncloud_pass=
Для работы с клиентом dropbox
Регистрация
https://www.dropbox.com/ru/login
Проверить свободное место на аккаунте
https://www.dropbox.com/account/personal
Два варианта настройки:
- резервирование каталога files (самый простой, без лишних настроек).
Для включения этого режима включаем:
BACKUP_TO_DROPBOX_CLIENT=1Отключаем WebDisk
BACKUP_TO_WEBDISK=0- резерверование в каталог webdisk (плюс в поддержке шифрования, бекап в 1 файл, что актуально для dropbox,- бекапится в один файл, а старые копии можно забирать на dropbox с истории версий).
Для включения этого режима включаем:
BACKUP_TO_DROPBOX_CLIENT=1Ставим клиент dropbox:
BACKUP_TO_WEBDISK=1
https://www.dropbox.com/ru/install-linux
- cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
- ~/.dropbox-dist/dropboxd
Переходим по ссылке которую кинуло в консоль. Тут важно проверить актуальную учетку на которую будет подключаться клиент. Подтверждаем. Видим такую запись в консоли
На Debian ставим curl"Этот компьютер теперь подсоединен к аккаунту Dropbox"Прерываем работу скрипта.
- apt-get install curl
Ставим 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
Все, демон или автозапуск не нужен, он будет запускаться из скрипта и закрываться после загрузки файлов
Для работы с Dropbox-uploader (не нужен демон)
В каталоге бекапа выполняем:- wget "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh
- rm -f dropbox_uploader.sh
- mv dropbox_uploader.sh.1 dropbox_uploader.sh
- chmod +x dropbox_uploader.sh
Ставим shasum
Ошибка в логе - which: no shasum in (/sbin:/bin:/usr/sbin:/usr/bin)
- yum install perl-Digest-SHA -y
Меняем в файле расположение токена
CONFIG_FILE=/home/backup/dropbox_uploader
Создаем токен в дропбоксе:
Выбрать
1. "Dropbox API"
1. "Dropbox API"
2. "Full Dropbox"
3. Добавить любое имя
Жмем create app
Выбираем срок действия токена
Access token expiration
no expiration
И далее "generated access token" жмем кнопку "Generate"
Запускаем скрипт
- ./dropbox_uploader.sh
Вводим полученный токен
В настройках SYS_backup.conf
BACKUP_TO_WEBDISK=0По желанию:
BACKUP_TO_DROPBOX_UPLOADER=1
WEBDISK_ONE_FILE=1
Ошибка при заливке на dropbox
FAILED
An error occurred requesting /commit_chunked_upload
- Закончилось место в хранилище
Настройка Gdrive (google disk)
(ссылку на разные системы смотреть тут https://github.com/prasmussen/gdrive)
- wget -O /usr/sbin/gdrive https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA
- chmod 755 /usr/sbin/gdrive
Авторизируемся
- gdrive about
Полученную строку в консоли вставляем в адресную строку браузера и разрешаем доступ к диску
В конфиге разрешаем резервное копирование на Gdrive
Backup_to_Gdrive=1Добавляем токен. Его берем из файла /root/.gdrive/token_v2.json (переменная access_token) и прописываем переменной Gdrive_access_token. Это очень важно, иначе Gdrive не сможет получить доступ к хранилищу из крона
Gdrive_access_token=Смотрим чтобы webdisk был отключен
BACKUP_TO_WEBDISK=0Удаления старых файлов пока в этой технологии нет, но планируется
Для работы бекапа файлов и каталогов
создать файл с путями к файлам в каталоге с скриптом- nano /home/backup/tar.include.list
Комменты # и ; не работают
Пример файла для биллинга:
#/etc/unbound/unbound.confПример файла для биллинга Debian:
#/usr/local/etc/raddb/sites-enabled/dhcp
/etc/sysconfig/network-scripts
/var/www/mikbill
/etc/rc.d/rc.local
/etc/my.cnf
/etc/nginx/conf.d
/etc/crontab
/etc/cron.d
/etc/resolv.conf
/etc/sysctl.conf
/home/backup/SYS_backup.conf
/etc/network/interfacesПример файла для сервера BRAS accel:
/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
/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
/etc/default/isc-dhcp-relay
/etc/default/isc-dhcp-server
Включить
BACKUP_FILES=1Также возможен лист для исключения из архива
создать файл с путями к файлам в каталоге с скриптом
- nano /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.1inet_protocols = ipv4
- service postfix start
- chkconfig postfix on
- traceroute -n -T -p 25 alt4.gmail-smtp-in.l.google.com
- netstat -an | grep 25
SEND_EMAIL=1Указать почту
EMAIL=mailname@gmail.comУказать сервис для отправки почты (по умолчанию postfix, еще проверялся exim)
EMAIL_SERVICE=postfix
Указать имя сервера от которого будут приходить логи
SERVER_NAME=servername
Вторая почта используется для отправки логов только при изменении файлов (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
почта тестировалась на почтах google и yandex
Для слежения за изменениями файлов
Логика работы подробнее: в подкаталоге diff/old создается копия всех файлов зарегистрированных в листе diff.conf. При следующем запуске скрипта файлы с сервера будут скопированы в подкаталог diff/new и сверены с diff/old. Изменения (имя файла, номер строки и сами строки) будут занесены в лог и при желании отправлены на почту. После этого каталог diff/old архивируется и удаляется и в него переносятся данные с каталога diff/new.
Настройка
Создать файл в каталоге скрипта- 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
diff.include.list
diff.include.list
/etc/
/root/.ssh
/root/.bash_history
/usr/local/Reductor
diff.exclude.list
/usr/local/Reductor/listsПример проверки файлов для debian accel
/usr/local/Reductor/reductor_container
/usr/local/Reductor/cache/
diff.include.list
/etc/
/var/www/
/root/.ssh
/root/.bash_history
diff.exclude.list
/etc/ppp/downlog.txt
/etc/ppp/uplog.txt
Лог в консоль (дебаг)
при ручном запуске включается
Также некоторое описание настроек смотреть в файле SYS_backup.confпри ручном запуске включается
LOG_IN_TERMINAL=0
Скрипты
SYS_backup.conf
# version 19 | |
# 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 | |
BACKUP_TO_YANDEX_CLIENT=0 | |
BACKUP_TO_DROPBOX_CLIENT=0 | |
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 | |
#Pcloud | |
#MOUNT_POINT=https://webdav.pcloud.com | |
#Mega | |
#MOUNT_POINT=mega | |
#MEGA_CONF=$HOME_DIR/megafs.ini | |
# CloudDav (google.drive for webdav) | |
#MOUNT_POINT=https://webdaveu.storagemadeeasy.com | |
# OWNCLOUD---------------------------------------------- | |
BACKUP_TO_OWNCLOUD=0 | |
Owncloud_address=https://address/owncloud/remote.php/webdav/backup | |
Owncloud_login= | |
Owncloud_pass= | |
# Копирование одного файла (для хранилищ с историей версий) | |
WEBDISK_ONE_FILE=0 | |
#Путь для WEBDISK | |
PACH_FOR_WEBDISK=$HOME_DIR/webdisk | |
DIR_BACKUP_FOR_WEBDISK=backups | |
#Время ротации файлов на облаке | |
LIFE_TIME_FILE_ON_WEBDISK=14 | |
#Удаление старых файлов при нехватке места для новых файлов | |
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 | |
# Secret: | |
# mcedit /etc/davfs2/secrets | |
# Mount: | |
# mount -t davfs https://webdav.yandex.ru /home/backup/webdisk | |
# Umount: | |
# umount /home/backup/webdisk |
SYS_backup.sh
#!/bin/bash | |
# Version 18 | |
# wget https://github.com/mikbill/design/raw/master/backup/SYS_backup.sh | |
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 | |
} | |
Create_folder_webdisk(){ | |
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 | |
} | |
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 [ "$BACKUP_TO_DROPBOX_CLIENT" -ne 0 ] | |
then | |
Create_folder_webdisk | |
~/dropbox.py start >>$LOG | |
else | |
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 | |
{ | |
Create_folder_webdisk | |
} | |
fi | |
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 --homedir /root/.gnupg -o $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK.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_WEBDISK 2>>$LOG | |
fi | |
STATUS=$? | |
fi | |
if [ $STATUS -ne 0 -a ! -e "$PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK" ];then | |
echo "! Ошибка $STATUS создания файла $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK !" >>$LOG | |
else | |
echo "Файл $PACH_FOR_WEBDISK/$DIR_BACKUP_FOR_WEBDISK/$FILENAME_WEBDISK создан успешно" >>$LOG | |
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 | |
if [ "$WEBDISK_ONE_FILE" -eq 0 ] | |
then | |
FUNC_RM_OLDFILES_WEBDISK | |
fi | |
fi | |
# Yandex client-------------------------------- | |
if [ "$BACKUP_TO_YANDEX_CLIENT" -ne 0 ] | |
then | |
yandex-disk start >>$LOG | |
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 --single-transaction -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 | |
if [ "$WEBDISK_ONE_FILE" -ne 0 ] | |
then | |
FILENAME_WEBDISK=sql-"$SERVER_NAME".sql.gz | |
else | |
FILENAME_WEBDISK=$FILENAME | |
fi | |
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 | |
if [ "$WEBDISK_ONE_FILE" -ne 0 ] | |
then | |
FILENAME_WEBDISK=files-"$SERVER_NAME".tar.gz | |
else | |
FILENAME_WEBDISK=$FILENAME | |
fi | |
FUNC_COPY_TO_WEBDISK | |
} | |
fi | |
} | |
fi | |
# Owncloud ------------------------------------ | |
if [ "$BACKUP_TO_OWNCLOUD" -ne 0 ] | |
then | |
owncloudcmd -u $Owncloud_login -p $Owncloud_pass $PACH_FOR_BACKUP_TO_DISK $Owncloud_address | |
fi | |
# DropBox ------------------------------------- | |
if [ "$BACKUP_TO_DROPBOX_CLIENT" -ne 0 -a "$BACKUP_TO_WEBDISK" -eq 0 ] | |
then | |
~/dropbox.py start >>$LOG | |
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 | |
if [ "$WEBDISK_ONE_FILE" -ne 0 ] | |
then | |
FILENAME_WEBDISK=configs-"$SERVER_NAME".tar.gz | |
else | |
FILENAME_WEBDISK=$FILENAME | |
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 | |
if [ "$WEBDISK_ONE_FILE" -ne 0 ] | |
then | |
FILENAME_WEBDISK=log.tar.gz | |
else | |
FILENAME_WEBDISK=$FILENAME | |
fi | |
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 |
Комментарии
Отправить комментарий