Иногда проще сделать самому, чем искать что-то подобное... Так думал я когда сделал первую версию скрипта резервного копирования. Благодаря помощи angel2s2, который приоткрыл мне дао bash программирования, родилась эта версия скрипта.
Итак, как работает этот скрипт:
- архивирует и пакует необходимые папки и файлы в папку $BDIR,
- делает дамп ваших баз данных (mysql) и пакует их в папку $BDIR;
- все, что напаковал сжимает одним файлом ($BFILE) в $BDIR;
- затем, с помощью curlftpfs монтирует ftp папку для бекапов в папку на компьютере и заливает туда $BFILE;
- удаляет старые бэкапы на фтп и на жестком диске;
- о проделанных действиях генерирует сообщение на почту и пишет в лог;
- в случае ошибки приостанавливает выполнение скрипта.
Для нормальной работы скрипта необходимы: ssmtp и curlftpfs. По настройке ssmtp читаем тут, а по curlftpfs: тут и тут. Так же, необходимо не забыть создать папку, в которую будем подмонтировать ftp.
Сам скрипт:
#!/bin/bash
# папка, в которую будем складывать бэкапы
DATE=`date +%F_%H-%M`
mkdir /media/D/backup/laptop/backup-$DATE
BDIR="/media/D/backup/laptop/backup-$DATE"
# имя бэкап файла
BFILE="/media/D/backup/laptop/backup-$DATE.tar.gz"
# домашняя папка
HDIR="/home/homedir"
# лог файл
LFILE="$HDIR/.log/backup.log"
# для ошибок
ERROR=""
# для сообщений
MESSAGE=""
# для почты
MAIL=""
# функция завершения скрипта
_exit() {
# тема почтового сообщения
if [[ $1 -gt 0 ]]; then
MAIL="Subject: `date +%H:%M` ERROR: Generate backup\n"
else
MAIL="Subject: New backup file from $DATE\n"
fi
MESSAGE="$MESSAGE\n[-------- `date +%F_%T` Generate files backup finish -]\n"
MAIL="$MAIL\n$MESSAGE"
# отправляем на почту
echo -e "$MAIL" | ssmtp account@example.com
# пишем в лог
echo -e "$MESSAGE" >> $LFILE
exit $1
}
# функция для проверки ошибок
_check_error(){
if [[ $? -gt 0 ]]; then
MESSAGE="$MESSAGE\n$ERROR"
MESSAGE="$MESSAGE\n`date +%H:%M` ERROR: $1."
_exit 1
else
MESSAGE="$MESSAGE\n`date +%H:%M` $2."
fi
ERROR=""
}
# функция для сжатия логов
_compress_log(){
# если лог файл существует
if [ -e $1 ]; then
# если его размер больше 1Mb
if [ $(stat -c %s $1) -gt 1048576 ]; then
# сжимаем
ERROR="$(tar cvpzf "$HDIR/.log/backup-$DATE.log.tar.gz" "$1" 2>&1 > /dev/null)"
_check_error "compress a log file failed" "compress a log file successfull"
# удаляем
rm -f "$1"
# создаем новый пустой лог файл
touch "$1"
fi
else
# если лог файл не существует, то создаем новый пустой лог файл
touch "$1"
fi
}
# создаем лог
_compress_log $LFILE
# старт!
# бэкапим домашнюю папку
MESSAGE="[-------- `date +%F_%T` Generate files backup --------]"
MESSAGE="$MESSAGE\n`date +%H:%M` 1. Home dir backup."
ERROR="$(tar cvpzf "$BDIR/home.tar.gz" --exclude=$HDIR/Загрузки \
--exclude=$HDIR/Видео --exclude=$HDIR/Музыка \
--exclude=$HDIR/Картинки --exclude=$HDIR/.wine/drive_c/temp \
--exclude=$HDIR/.wine/drive_c/windows/temp --exclude=$HDIR/.Trash-0 \
--exclude=$HDIR/.cache \
--exclude=$HDIR/.local/share/Trash "$HDIR" 2>&1 > /dev/null)"
_check_error "home dir backup failed" "home dir backup successfull"
.....
# Делаем бекап настроек апача и пхп
MESSAGE="$MESSAGE\n`date +%H:%M` 2. Webserver's configs backup."
ERROR="$(tar cvpzf "$BDIR/apache2.tar.gz" /etc/apache2 2>&1 > /dev/null)"
_check_error "apache2 backup failed" "apache2 backup successfull"
ERROR="$(tar cvpzf "$BDIR/php5.tar.gz" /etc/php5 2>&1 > /dev/null)"
_check_error "php5 backup failed" "php backup successfull"
# Тут бекапим свои файлы, например я бекаплю флешку
MESSAGE="$MESSAGE\n`date +%H:%M` 3. Web projects backup."
ERROR="$(tar cvpzf "$BDIR/open_projects.tar.gz" "/media/Transcend/open project" 2>&1 > /dev/null)"
_check_error "open project dir backup failed" "open project dir backup successfull"
ERROR="$(tar cvpzf "$BDIR/personal.tar.gz" /media/Transcend/Personal 2>&1 > /dev/null)"
_check_error "personal files backup failed" "personal dir backup successfull"
# бэкапим базы данных
MESSAGE="$MESSAGE\n`date +%H:%M` 4. Databases backup."
ERROR="$(mysqldump --user=username --host=localhost --password=pass --default-character- set=utf8 db1 2>&1 > "$BDIR/db1.sql")"
_check_error "db1 database backup failed" "db1 database backup successfull"
ERROR="$(mysqldump --user=username --host=localhost --password=pass --default-character-set=utf8 db2 2>&1 > "$BDIR/db2.sql")"
_check_error "db2 database backup failed" "db2 database backup successfull"
# сжимаем все полученные бэкапы в один файл
MESSAGE="$MESSAGE\n`date +%H:%M` 5. Compress backup files."
ERROR="$(tar cvpzf "$BFILE" "$BDIR" 2>&1 > /dev/null)"
_check_error "compress backup files failed" "compress backup files successfull"
ERROR="$(rm -rf "$BDIR" 2>&1 > /dev/null)"
_check_error "delete backup dir failed" "delete backup dir successfull"
# заливаем все на фтп
MESSAGE="$MESSAGE\n`date +%H:%M` 6. Uploading the backup file to ftp server."
# монтируем фтп как папку
ERROR="$(curlftpfs ftp://username:password@servername/backup/laptop "$HDIR/.ftp" 2>&1 > /dev/null)"
_check_error "ftp mount failed" "ftp mount successfull"
# заливаем (причем копируем, чтобы на харде тоже копия осталась)
ERROR="$(cp -f "$BFILE" "$HDIR/.ftp" 2>&1 > /dev/null)"
_check_error "ftp upload failed" "ftp upload successfull"
# удаляем бэкап файлы на фтп старше 21 дня
F="$(ls -1 "$HDIR"/.ftp/backup* | wc -l)"
ERROR="$(find "$HDIR"/.ftp/backup* -mtime +22 -delete 2>&1 > /dev/null)"
F1="$(ls -1 "$HDIR"/.ftp/backup* | wc -l)"
MESSAGE="$MESSAGE\nFiles on ftp: $F1, deleted: $(($F-$F1))."
_check_error "delete files on ftp failed" "delete files on ftp successfull"
# размонтируем
ERROR="$(fusermount -u "$HDIR/.ftp" 2>&1 > /dev/null)"
_check_error "ftp umount failed" "ftp umount successfull"
# удаляем старые бэкапы на харде
MESSAGE="$MESSAGE\n`date +%H:%M` 7. Delete backup files on the hard disk."
ERROR="$(find /media/D/backup/laptop/backup* -mtime +8 -delete 2>&1 > /dev/null)"
_check_error "delete backup file failed" "delete backup file successfull"
# финиш
_exit 0
Скачать можно отсюда.

Войдите чтобы оставить комментарий