Backup сервера на Яндекс.Диск

2 февраля 2015
Комментарии к записи Backup сервера на Яндекс.Диск отключены

Как известно, админы делятся на тех кто не делает бэкапы, и тех кто уже делает.

Кнопка backup

Так то у меня есть бекапы средствами хостинга, но для собственного спокойствия решил таки сделать небольшой скриптик для бекапа всего важного на яндекс.диск, благо появился консольный клиент яндекс.диска под linux.

Особенности:
1. каждая БД сохраняется отдельным файлом, потом все вместе архивируются
2. архивируется каталог /etc
3. архивируется каталог /root
4. архивируется каталог /home
5. итоговый архив шифруется с помощью gpg
6. если архивов в папке больше 7шт (настраивается переменной MAX_FILES), то старые удаляются.

Вся установка/настройка скрипта сводится к:
1. установка и настройка клиента яндекс.диска по ссылке выше
2. копирование скрипта куда-нибудь на сервер
3. настроить логин/пароль к mysql базе

MYSQL_USER="user"
MYSQL_PASSWORD="password"

4. ввести пароль для шифрования файле бекапа (через gpg)

GPG_PASSOWRD="gpg_password"

5. прописать скрипт в cron на запуск например в 4 утра.

0       4       *       *       *       /home/cron/backup.sh  >/dev/null 2>&1

сам скрипт:

#!/bin/bash
MYSQL_USER="user"
MYSQL_PASSWORD="password"
GPG_PASSOWRD="gpg_password"
BACKUP_DIRECTORY="/home/backups"
MAX_FILES=7

databases=`mysql --user=$MYSQL_USER --password=$MYSQL_PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`

curr_date=`date +%Y\.%m\.%d`

for db in $databases; do
    echo `date +%H:%M:%S` ": Dumping database: $db"
    OPT=""
    if [[ "$db" == "mysql" ]] ; then
        OPT=" --events"
    fi
    mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --databases $db --add-drop-table --add-locks --create-options --single-transaction -Q -c -e $OPT > /tmp/$curr_date.$db.sql
done

echo `date +%H:%M:%S` ": Create DB archive"
cd /tmp
tar czf /home/db_$curr_date.tgz *.sql

echo `date +%H:%M:%S` ": Remove tmp sql files" 
rm /tmp/*.sql 

echo `date +%H:%M:%S` ": Backup etc files"
cd /etc/
tar czf /home/etc_$curr_date.tgz *

echo `date +%H:%M:%S` ": Backup root files"
cd /root/
tar czf /home/root_$curr_date.tgz *

echo `date +%H:%M:%S` ": Backup all files"
cd /home/
tar czf $BACKUP_DIRECTORY/backup_$curr_date.tgz * --exclude="backups" --exclude="*/wp-content/cache/*"

/usr/bin/gpg -c --force-mdc --batch --yes --passphrase=$GPG_PASSOWRD $BACKUP_DIRECTORY/backup_$curr_date.tgz

echo `date +%H:%M:%S` ": Remove tmp files"
rm /home/db_$curr_date.tgz  /home/etc_$curr_date.tgz /home/root_$curr_date.tgz $BACKUP_DIRECTORY/backup_$curr_date.tgz

echo `date +%H:%M:%S` ": Remove old backup files"

bf=`ls -1 $BACKUP_DIRECTORY/backup*.tgz.gpg | sort -d`
fc=`ls -1 $BACKUP_DIRECTORY/backup*.tgz.gpg | wc -l`

if [ "$fc" -gt "$MAX_FILES" ] ; then
    for file in $bf
    do
        if [ "$fc" -gt "$MAX_FILES" ] ;then
            fc=$(($fc - 1))
            rm -f $file
        fi
    done
fi

echo `date +%H:%M:%S` ": Yandex.Disk sync"
/usr/bin/yandex-disk sync

В планах:
1. сделать сохранение месячных и недельных бекапов
2. подумать над инкрементными ежедневными бекапами (хотя тут наверное проще какую-нибудь Bacula поставить) %)

Опубликовал: