Как известно, админы делятся на тех кто не делает бэкапы, и тех кто уже делает.
Так то у меня есть бекапы средствами хостинга, но для собственного спокойствия решил таки сделать небольшой скриптик для бекапа всего важного на яндекс.диск, благо появился консольный клиент яндекс.диска под 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 поставить) %)