Сервер: резервное копирование и выгрузка в Dropbox

Первым делом всегда-всегда-всегда нужно заботиться о резервной копии. Вариантов огромное множество, но лично я написал для себя простой и понятный скрипт для ежесуточного запаковывания данных с любого сервера, в том числе и shared-хостинга.

#!/bin/bash

USER=mysqlroot
PASSWORD=mysqlrootpass
BACKUP=/home/bezumkin/Backup
OLD=7   # Сколько дней хранить бэкапы

# Создаем директорию для сегодняшнего бэкапа
DIR=$BACKUP/`date '+%Y-%m-%d'`
mkdir $DIR
cd $DIR

# Сохраняем базы данных
for i in `mysql -u $USER -p$PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`;
do
    # Не обрабатываем служебные БД и все БД сайтов modx-test.com, у них имена типа s1234.
    if [[ "$i" != "mysql" && "$i" != "performance_schema" && ! "$i" =~ ^s[0-9] ]]
        then mysqldump --skip-lock-tables -u$USER -p$PASSWORD $i | bzip2 -c > www-$i.sql.bz2;
    fi
done

# Сохраняем системные директории
tar -cjf sys-etc.tar.bz2 /etc/
tar -cjf sys-log.tar.bz2 /var/log/
tar -cjf sys-root.tar.bz2 /root/

# Сохраняем сайты
for i in `ls /var/www/`;
do
    # Обрабатываем все, кроме сайтов modx-test.com
    if [[ ! "$i" =~ ^s[0-9] ]]
        then tar -cjf www-$i.tar.bz2 /var/www/$i --exclude=core/cache/*;
    fi
done

# Чистим старые логи и бэкапы
find /var/log -type f \( -name "*.gz" -o -name "*.1*" \) -exec rm '{}' \;

# Если эта команда верно показывает старые директории после бэкапа - расскомментируйте следующую
find $BACKUP/* -maxdepth 0 -ctime $OLD -exec echo '{}' \;

# Эта команда удаляет старые резервные копии, и я ее закомментировал на всякий случай. 
#find $BACKUP/* -maxdepth 0 -ctime $OLD -exec rm -r '{}' \;
Этот скрипт нужно сохранить в файл, и добавить в cron.

На следующий день все БД, сайты и системные директории будут скопированы и аккуратно разложены по разным файлам — это очень удобно. Также, при архивировании можно указывать условия. Например, я пропускаю все сайты от modx-test.com, по регулярному выражению ^s[0-9].

Обратите внимание на удаление старых бэкапов. По умолчанию я это отключил, нужно активировать самостоятельно, после проверки.
Если удалите что-нибудь нужное (как я, пока писал скрипт) — это не мои проблемы.

Получается вот такая картина:
root@bezumkin:~/Backup/2012-10-10# ls ./ -lsh
total 1.3G
668K -rw-r--r-- 1 root root 663K Oct 10 10:01 sys-etc.tar.bz2
152K -rw-r--r-- 1 root root 147K Oct 10 10:07 sys-log.tar.bz2
7.5M -rw-r--r-- 1 root root 7.5M Oct 10 10:07 sys-root.tar.bz2
160K -rw-r--r-- 1 root root 154K Oct 10 10:05 www-***.sql.bz2
 59M -rw-r--r-- 1 root root  59M Oct 10 10:08 www-***.tar.bz2
192K -rw-r--r-- 1 root root 187K Oct 10 10:05 www-***.sql.bz2
 48M -rw-r--r-- 1 root root  48M Oct 10 10:09 www-***.tar.bz2
                                              и так далее...
Для выгрузки бэкапов я использую Dropbox, который самостоятельно мониторит директорию с бэкапами и синхронизирует данные с домашним сервером.

Dropbox


Данная инструкция является очень вольным переводом этой статьи.

1. Качаем нужную версию для сервера.
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86" или
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86_64"
Если не знаете, что у вас за ОС, выполните команду
uname -a
У меня вот такой вывод:
Linux bezumkin 3.1.0-1.2-xen #1 SMP Wed Dec 7 19:01:22 MSK 2011 i686 GNU/Linux
i686 — это 32 битная ОС.

2. Распаковываем
tar -xzvf dropbox.tar.gz
3. Запускаем
~/.dropbox-dist/dropboxd
В первый раз он выведет ссылку на сервис, которую вам надо открыть у себя на компе и добавить этот сервер в число компьютеров аккаунта.

Пока не добавите — он так и будет выдавать эту ссылку. После добавления перезапускаем сервис (ctrl+c для прекращения работы) и мы должны увидеть "Client successfully linked, Welcome!"

4. Все, ваши файлы уже начинают синхронизироваться.

5. Устанавливаем Dropbox как службу. Для этого, от рута выполняем
sudo wget -O /etc/init.d/dropbox "https://gist.github.com/bezumkin/6712351/raw/108fc8af551cb4fdf7cdd08b891a45f405d283dc/dropbox" && sudo chmod +x /etc/init.d/dropbox
Затем меняем в /etc/init.d/dropbox юзера для запуска (там где написано «user1 user2»), сохраняем и делаем
sudo update-rc.d dropbox defaults
6. Запускаем
sudo service dropbox start
У Dropbox есть консольная утилита для работы, dropbox.py нужно ее скачать и сделать исполняемой:
wget http://www.dropbox.com/download?dl=packages/dropbox.py -O ~/.dropbox/dropbox.py && chmod +x ~/.dropbox/dropbox.py
~/.dropbox/dropbox.py help
 
Note: use dropbox help <command> to view usage for a specific command.
 
 status       get current status of the dropboxd
 help         provide help
 puburl       get public url of a file in your dropbox
 stop         stop dropboxd
 running      return whether dropbox is running
 start        start dropboxd
 filestatus   get current sync status of one or more files
 ls           list directory contents with current sync status
 autostart    automatically start dropbox at login
 exclude      ignores/excludes a directory from syncing
С ее помощью, можно настроить синхронизацию более гибко (нам же нужна только директория с бэкапами?). Для этого есть параметр exclude.

~/.dropbox/dropbox.py help exclude
 
dropbox exclude [list]
dropbox exclude add [DIRECTORY] [DIRECTORY] ...
dropbox exclude remove [DIRECTORY] [DIRECTORY] ...
 
"list" prints a list of directories currently excluded from syncing.  
"add" adds one or more directories to the exclusion list, then resynchronizes Dropbox. 
"remove" removes one or more directories from the exclusion list, then resynchronizes Dropbox.
With no arguments, executes "list". 
Any specified path must be within Dropbox.
Ну и понятно, что в скрипте резервного копирования нужно поменять BACKUP на директорию внутри Dropbox.

Очень полезная ссылка по работе с консольным Dropbox.
Василий Наумкин
Василий Наумкин
10 октября 2012, 07:32
modx.pro
13 774
Реклама

Комментарии: 58

Denys Butenko
Denys Butenko Старожил
10 октября 2012, 11:58
Для своих нужд изменял скрипт, сделал, чтобы при бэкапе пропускались директории /site/assets/cache — в которой хранятся phpthumbof кешированные картинки, /site/core/cache — системный кэш, /site/core/package — где хранятся архивы и распакованные пакеты. Размер бэкапа уменьшился на 60%.
    Василий Наумкин
    Василий Наумкин Администратор
    10 октября 2012, 12:00
    Хорошая мысль, поколдую.
      Василий Наумкин
      Василий Наумкин Администратор
      10 октября 2012, 12:29
      Добавил исключение директорий cache, размер сократился, но не сильно. Кому нужно, может подобавлять еще --exclude=шаблон.

      Packages, как мне кажется, лучше оставлять — там ведь могут лежать и уникальные пакеты, которых нет в репозитории.
        Denys Butenko
        Denys Butenko Старожил
        10 октября 2012, 15:18
        Проблема, как по мне, это хранение всех версий пакетов, что увеличивает размер бэкапа. А учитывая, что у меня 1 сайт, пакеты стандартные из репозитория — не критично, они же хранятся в другом месте (установленные). Видимо из-за них и было такое снижение размера бэкапа. Стояли версии miniShopa от 1.4.0 до текущей, плюс кучу других пакетов)
        Для более конкретных цифр полная бэкап сайта весил ~100 Мб, после исключения трёх директорий ~40Мб.
          Василий Наумкин
          Василий Наумкин Администратор
          10 октября 2012, 15:26
          Это да, согласен. Но скрипт универсальный, и кому надо — сами добавят, что еще исключить.

          Лично я руками чищу такие старые пакеты, периодически.
          Давид Мовсесян
          Давид Мовсесян Старожил
          17 октября 2013, 22:48
          Подскажите нубу как в скрипте сделать исключение не только папки cache, но и например папки gallery
            Пашок
            Пашок Старожил
            25 марта 2015, 12:48
            Василий, можешь объяснить немножко подробнее, как исключить всё что в папке кеша? Что сюда писать?
            if [[ ! "$i" =~ ^s[0-9] ]]
          Viktor Minator
          Viktor Minator Старожил
          10 октября 2012, 12:19
          «Если удалите что-нибудь нужное (как я, пока писал скрипт) — это не мои проблемы» — это наверх и красненьким =)
            Василий Наумкин
            Василий Наумкин Администратор
            10 октября 2012, 12:26
            Эта строка отключена, ее нужно включить принудительно.

            Сделал так для любителей тупого копипаста.
            DmitriyLyalyuev
            10 октября 2012, 13:42
            rsnapshot чем не подходит?
              Василий Наумкин
              Василий Наумкин Администратор
              10 октября 2012, 13:50
              Всегда радуют такие комментарии. Встречный вопрос — а что это?

              Оно еще проще чем мой скрипт? Быстрее ставится/настраивается?

              Зачем мне какое-то незнакомое приложение, если я могу простым скриптом решить свои задачи?
                DmitriyLyalyuev
                10 октября 2012, 14:04
                Это скрипт-обвязка над rsync. Ставится легко, настраивается еще проще. Умеет ходить на другие сервера и собирать бекап на локальной машине, версионность, уменьшение размера за счет зардлинков и много других вкусных плюшек в виде диффа, и т.п. Очень рекомендую.
                  Viktor Minator
                  Viktor Minator Старожил
                  10 октября 2012, 14:10
                  без ссылки комментарий не защитан
                  Василий Наумкин
                  Василий Наумкин Администратор
                  10 октября 2012, 14:24
                  Мега-комбаин, понятно.

                  Изучать дольше, чем писать свой скрипт заново.
                    DmitriyLyalyuev
                    10 октября 2012, 14:32
                    вы не правы. Я тоже так думал, пока не попробовал сам. настройка занимает минут 5-7 отсилы. Просто указав в конфиге чего бекапить и куда. Все.

                    Можно, конечно, вызывать mysqldump на удаленных серверах и т.п. Но это уже навороты.

                    У меня самописных бекапилок тоже было не мало под каждый проект. В результате пришел к этому скрипту и больше ничего не изобретаю давно. ;)
                      Dmytro Lukianenko
                      Dmytro Lukianenko Старожил
                      10 октября 2012, 17:40
                      Каждый вибирает для себя свой путь ) потому тут говорить что кто то не прав нет смысла
                      а вот за то что поделились своим способом спасибо )
              Denys Butenko
              Denys Butenko Старожил
              08 ноября 2012, 22:17
              Чтобы не выскакивало предупреждение tar: Removing leading '/' from names…
              Нужно добавить ключ P при архивации. И использовать его при распаковке.
                seigiard@gmail.com
                seigiard@gmail.com Старожил
                08 января 2013, 19:57
                then tar -cjf www-$i.tar.bz2 /var/www/$i --exclude=cache/*;
                меняем на
                then tar -cjf www-$i.tar.bz2 /var/www/$i --exclude=cache/*  --transform="s/var\/www\///";
                В результате архивы сайтов при распаковке избавляются от вложенности "/var/www/" и распаковываются сразу в папку со своим именем.
                  Василий Наумкин
                  Василий Наумкин Администратор
                  08 января 2013, 20:13
                  Спасибо.

                  Комментарий мне пришлось изменить, так как нужно использовать тег code для оформления частей скриптов или запросов. Удобнее читать.
                    Denys Butenko
                    Denys Butenko Старожил
                    08 января 2013, 20:41
                    Судя по всему, потерялась кавычка в
                    --transform="...";
                Сергей Берестецкий
                27 января 2013, 13:20
                Ну все таки как правильно сюда вписать
                mysqldump --skip-lock-tables -u$USER -p$PASSWORD $i | bzip2 -c > www-$i.sql.bz2;
                fi

                --add-drop-table
                  Сергей Берестецкий
                  27 января 2013, 13:38
                  Вот работающея строчка

                  then mysqldump --skip-lock-tables -u$USER -p$PASSWORD --add-drop-table $i | bzip2 -c > www-$i.sql.bz2;

                  Я всегда add-drop-table делаю, так удобно.

                  СикретНаме
                  СикретНаме Старожил
                  13 февраля 2013, 07:37
                  Я, вот, до резервного добрался и вопрос возник неожиданно — мы в некоторых файлах впрямую доступы указываем — гут ли это для безопасности и всё такое?
                    Василий Наумкин
                    Василий Наумкин Администратор
                    13 февраля 2013, 07:43
                    Если злоумышленник читает файлы из директории /root — то безопасности уже как таковой нет.
                      СикретНаме
                      СикретНаме Старожил
                      13 февраля 2013, 07:48
                      Лаконично, доходчиво, внятно и… логично. Спасибо.
                    Александр Наумов
                    23 марта 2013, 23:32
                    Спасибо, классный пост!!!
                    Василий, а не подскажите, как удалить dropbox или как заменить аккаунт dropbox?
                      Василий Наумкин
                      Василий Наумкин Администратор
                      23 марта 2013, 23:35
                      Кажется, нужно просто удалить ~/.dropbox, там конфиги хранятся.

                      Точно не помню, проще будет погуглить.
                        Александр Наумов
                        23 марта 2013, 23:39
                        Спасибо, попробую.
                          Denys Butenko
                          Denys Butenko Старожил
                          07 апреля 2013, 15:15
                          Зайдите через web-интерфейс и отключите сервер который прилинкован.
                    Алексей
                    Алексей Старожил
                    07 апреля 2013, 14:22
                    непонятно через какие порты он работает — все порты кроме 80 и 443 и 22 закрыты
                    Alexei Garmash
                    Alexei Garmash Старожил
                    22 апреля 2013, 00:31
                    А возможна ли замена tar на что-то другое при архивации сайта?
                    Если да, пожалуйста, подскажите как изменить скрипт.

                    Дело в том, что архивы, созданные скриптом почему-то не открываются:
                    «Архив поврежден или имеет неизвестный формат», пробовал WinRAR, 7-zip и TotalCommander.

                    С бекапами sql все в норме.
                      Василий Наумкин
                      Василий Наумкин Администратор
                      22 апреля 2013, 05:13
                      Погугли, как использовать zip из консоли и замени
                      then tar -cjf www-$i.tar.bz2 /var/www/$i --exclude=cache/*;
                      на
                      then zip -параметры www-$i.zip /var/www/$i;
                      Andrei Kilin
                      Andrei Kilin Старожил
                      24 апреля 2013, 09:40
                      Пользуюсь скриптом давно, бэкапится замечательно.
                      Но вот процесс восстановления у меня как-то через зад всегда проходит.

                      Можешь рассказать как по фэншую развернуть бэкап, чтобы быстро и правильно?
                        Перетягин Илья
                        Перетягин Илья Старожил
                        22 августа 2013, 15:24
                        Василий добрый день!
                        Появилась не понятная проблема, когда надо восстановить сайт из рез.копии выплывает белый экран.
                        То есть берем бд, заливаем, все хорошо. Берем архив с файлами, достаем от туда сайт, ставим в нужную директорию, меняем конфиг файлы, назначаем чмоды и белый экран, что в админке, что на фронте…
                        Если к этой же бд (из рез. копии) залить файлы из директории, без архивации, то все работает, если архивировать в zip, то так же все работает, а вот с tar.bz2 не понятная проблема.
                        В чем может быть дело, куда копать?
                          Александр Наумов
                          10 сентября 2013, 23:10
                          Так же испытал проблемы с восстановлением, в итоге в моем случае проблема оказалась в следующем.
                          Сайт не работал демонстрировал белый экран, но как только я с рабочего сайта перекинул в папку core/xpdo/cache все файлы — все заработало.

                          Василий, в чем может быть проблема, может при бэкапе не нужно чистить кэш xpdo?
                            Василий Наумкин
                            Василий Наумкин Администратор
                            11 сентября 2013, 05:32
                            А с чего ты решил, что нужно?

                            Во всех инструкциях пишут чистить только /core/cache/ — про xpdo речи нет.
                              Александр Наумов
                              11 сентября 2013, 06:07
                              Спасибо, просто данный скрипт чистит эту папку, вот я и подумал, может быть инструкции поменялись.
                                Василий Наумкин
                                Василий Наумкин Администратор
                                11 сентября 2013, 06:10
                                Я после распаковки всегда накатываю setup и обновляю сайт — ни разу проблем не было.

                                А то, что директории cache/* пропускается — это моя ошибка, наверное =) Хотел пропустить только /core/cache и не подумал про другие.
                          Любовь
                          Любовь Старожил
                          26 сентября 2013, 14:21
                          Подскажите, пожалуйста, если не сложно как правильную ссылку найти для 5 пункта?
                          raw.github.com/gist/2347727/108fc8af551cb4fdf7cdd08b891a45f405d283dc/dropbox
                          эта 404 выдает.
                            Василий Наумкин
                            Василий Наумкин Администратор
                            26 сентября 2013, 14:26
                            Залил заново, можно качать.
                              Любовь
                              Любовь Старожил
                              26 сентября 2013, 14:33
                              Большое спасибо!
                                Evgeny Epifanov
                                Evgeny Epifanov Старожил
                                20 ноября 2013, 18:31
                                При запуске:
                                ~/.dropbox-dist/dropboxd
                                Пишет:
                                /etc/init.d/dropbox: 58: /etc/init.d/dropbox: Syntax error: end of file unexpected (expecting ")")
                                  Evgeny Epifanov
                                  Evgeny Epifanov Старожил
                                  22 ноября 2013, 18:53
                                  Неужели только у меня такая проблема?
                                    Evgeny Epifanov
                                    Evgeny Epifanov Старожил
                                    22 ноября 2013, 19:18
                                    Взял файл отсюда все отлично.
                                      Василий Наумкин
                                      Василий Наумкин Администратор
                                      22 ноября 2013, 19:39
                                      Ура!

                                      Я тоже обновил файлик, не знаю, что случилось.
                              Evgeny Epifanov
                              Evgeny Epifanov Старожил
                              12 декабря 2013, 22:41
                              Настроил Яндекс Диск. В принципе разницы особой нет, только Яндекс дает 10Гб места сразу.
                              Кому интересно, вот инструкция: http://help.yandex.ru/disk/cli-clients.xml
                                Алексей
                                Алексей Старожил
                                19 февраля 2014, 11:01
                                # Сохраняем базы данных
                                for i in `mysql -u $USER -p$PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`;
                                do
                                    # Не обрабатываем служебные БД и все БД сайтов modx-test.com, у них имена типа s1234.
                                    if [[ "$i" != "mysql" && "$i" != "performance_schema" && ! "$i" =~ ^s[0-9] ]]
                                        then mysqldump --skip-lock-tables -u$USER -p$PASSWORD $i | bzip2 -c > www-$i.sql.bz2;
                                    fi
                                done
                                
                                # Сохраняем сайты
                                for i in `ls /var/www/`;
                                do
                                    # Обрабатываем все, кроме сайтов modx-test.com
                                    if [[ ! "$i" =~ ^s[0-9] ]]
                                        then tar -cjf www-$i.tar.bz2 /var/www/$i --exclude=cache/*;
                                    fi
                                done
                                как в этом коде написать исключения для /var/www/pma и её mysql базы
                                  Алексей
                                  Алексей Старожил
                                  19 февраля 2014, 12:42
                                  Прошу прощение за глупый вопрос болею, проблему решил
                                  Артём Добряков
                                  Артём Добряков Старожил
                                  17 октября 2014, 13:30
                                  Ребята, подскажите как заставить dropbox стартовать при перезагрузке сервера автоматически? А то сейчас вручную приходится вводить команду
                                  ~/.dropbox/dropbox.py start
                                    Александр
                                    Александр Старожил
                                    24 декабря 2015, 16:45
                                    Скрипт не работает… выдает такую ошибку
                                    bash: ./backup: /bin/bash^M: bad interpreter: No such file or Directory
                                    причем файл кидал и запускал с разных мест и эффект тот же…
                                    Кто то сталкивался с такой проблемой?
                                      Василий Наумкин
                                      Василий Наумкин Администратор
                                      24 декабря 2015, 17:33
                                      Много кто сталкивался, нужно всего лишь задать вопрос в Google и посмотреть ответы.
                                        Александр
                                        Александр Старожил
                                        24 декабря 2015, 19:17
                                        Спасибо. С этим разобрался. Теперь проблема стала такая что кроме как от root не запускается sudo service dropbox start
                                        и в статусе (sudo service dropbox) пишет что сервис от имени такого то пользователя не запущен.
                                        Как она решается? В Google смотрел и пока ничего толкового не нашел…
                                        Советуют в файле /etc/init.d/dropbxox в строке DEAMON=.dropbox-dist/dropbox заменить на DEAMON=.dropbox-dist/dropboxd
                                        пробовал и ничего не вышло из этого
                                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                      58