Итак, как работает этот скрипт:
– архивирует и пакует необходимые папки и файлы в папку $BDIR,
– делает дамп ваших баз данных (mysql) и пакует их в папку $BDIR;
– все, что напаковал сжимает одним файлом ($BFILE) в $BDIR;
– затем, с помощью curlftpfs монтирует ftp папку для бекапов в папку на компьютере и заливает туда $BFILE;
– удаляет старые бэкапы на фтп и на жестком диске;
– о проделанных действиях генерирует сообщение на почту и пишет в лог;
– в случае ошибки приостанавливает выполнение скрипта.
Для нормальной работы скрипта необходимы: ssmtp и curlftpfs. Так же, необходимо не забыть создать папку, в которую будем подмонтировать ftp.
1 |
nano /home/scripts/ftp_del_old_file_v01.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#!/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 |