Бэкапим без расходов

    image
    Бэкапы — это вечная проблема: то объемы данных сумасшедшие, то вообще забываешь про них. В своем предыдущем проекте dvice.ru (он пока закрыт, так что без ссылки) я допустил досадную ошибку в самом начале его запуска. Я написал небольшой крон, который в 12 часов ночи удалял всех неактивированных пользователей, зарегистрировавшихся больше 24 часов назад. Но я ошибся в запросе и потерял данные пользователей, которые зарегистрировались до первого запуска этого запроса. Слава Богу, у меня были все данные в сессиях, поэтому я восстановил всех тех, кто логинился и ставил галку на чекбоксе — запомнить меня. Обидно и глупо, но на ошибках учатся. Поэтому перед запуском своего крайнего проекта — inwhite.ru, я сделал систему бэкапов.

    Бэкапы делались и копились, старые удалялись, и все было отлично. Пока внезапно я не понял, что страдаю полной фигней. Бэкапы-то я делаю, а вот забирать — не забираю. Объемы данных, лежащих на моем VPS, не такие большие, но по почте тоже особо не наотправляешься. Покупать еще один VPS и складывать туда все по FTP/SVN/CVS/SSH не особо хочется, хотя тоже вариант интересный.

    До вчерашнего дня я был озадачен мыслью: а как все же забирать эти данные? И вот вечером меня осенило.

    Я являюсь счастливым пользователем сервиса Dropbox. Хоть и с бесплатным аккаунтом, но благодаря inwhite.ru у меня есть еще 2.5ГБ места сверху, т.е. не начальные 2ГБ, а уже аж целых 4.5ГБ. И еще на 500МБ место может увеличиться. А это уже нормальная площадка для создания бэкапов средних объемов данных.

    На данный момент у меня файлов в архивах бэкапится на 200МБ, баз данных, которые я поставил бэкапиться ежедневно — 2МБ в день, а бэкапов базы данных inwhite.ru, которая бэкапится каждый час (от греха подальше), за неделю набирается пока что примерно на 215МБ.

    Я не стал искать книжку «КАК НАСТРОИТЬ БЭКАПЫ С ВАШЕГО СЕРВЕРА ЧЕРЕЗ ДРОПБОКС ЗА 24 ЧАСА». Покопавшись в больших интернетах, я нашел статью, в которой говорится о том, как настроить и заставить работать Dropbox при отсутствии GUI. Это было самое главное, т.к. если у вас не Windows сервер, то вряд ли у вас на сервере есть X.

    Статья находится по этому адресу, и я не буду приводить ее здесь, т.к. сам процесс довольно прост и описан достаточно подробно. Скажу лишь пару вещей:
    1. Если вы начали настраивать Dropbox, то HOST_ID зависит от папки, откуда запустили Dropbox
    2. Если вы из обсуждаемого в статье расположения файлов ~/.dropbox-dist перенесете файлы, например, как я, в /usr/local/dropbox (я привык там хранить программы), то вам надо будет по-новой получать HOST_ID
    3. dbreadconfig у меня так и не заработал, и что-то мне подсказывает, что у вас тоже просто так не заработает, только если вы не исправите этот скрипт, написанный на Python
    4. Следствие из п.3 — запаситесь sqlite3
    5. Скрипт запуска Debian/Ubuntu у меня тоже не особо пожелал работать, поэтому я вам тут его в исправленном виде выложу
    Также я позволил себе сделать несколько новых па, т.к. у меня свои правила на сервере. Надо создать пользователя для Dropbox:

    adduser --home /home/dropbox --shell /bin/false --disabled-login dropbox

    Обратите внимание на то, что в папке пользователя вам надо будет сделать еще одну папку — «Dropbox», т.к. именно в нее по умолчанию Dropbox будет записывать файлы.

    Т.е. по сути должно получиться что-то вроде:

    /home
        /home/dropbox
            # эту папку вам создаст сам Dropbox после первого правильного запуска
            /home/dropbox/.dropbox
            # а вот эту папку вам надо будет сделать самому, т.к. Dropbox этого почему-то не делает
            /home/dropbox/Dropbox

    Сам скрипт запуска


    USERS="dropbox"<br>DAEMON=/usr/local/dropbox/dropbox<br>LAUNCH=/usr/local/dropbox/dropboxd<br><br>start() {<br>  echo "Starting dropbox..."<br>  for dbuser in $USERS; do<br>  HOMEDIR=`getent passwd $dbuser | cut -d: -f6`<br>  if [ -x $DAEMON ]; then<br>    HOME="$HOMEDIR" start-stop-daemon -b -o -c $dbuser -S -u $dbuser -x $LAUNCH<br>  fi<br>  done<br>}<br>            <br>stop() {<br>  echo "Stopping dropbox..."<br>  for dbuser in $USERS; do<br>  if [ -x $DAEMON ]; then<br>      start-stop-daemon -o -c $dbuser -K -u $dbuser -x $DAEMON<br>  fi<br>  done<br>}<br>                        <br>status() {<br>  for dbuser in $USERS; do<br>  HOMEDIR=`getent passwd $dbuser | cut -d: -f6`<br>    USERPID=`cat $HOMEDIR/.dropbox/dropbox.pid`<br>    if [ -z $USERPID ] ; then<br>      echo "Dropbox for USER $dbuser: not running."<br>    else<br>      echo "Dropbox for USER $dbuser: running (pid $USERPID)"<br>  fi<br>  done<br>}<br>    <br>case "$1" in<br>  start)<br>  start<br>  ;;<br>                 <br>  stop)<br>  stop<br>  ;;<br><br>  restart|reload|force-reload)<br>  stop<br>  start<br>  ;;<br>                       <br>  status)<br>  status<br>  ;;<br>                          <br>  *)<br>  echo "Usage: /etc/init.d/dropbox {start|stop|reload|force-reload|restart|status}"<br>  exit 1<br>                   <br>esac<br>                         <br>exit 0

    Но написать статью про то, как воспользоваться какой-то там другой статьей — это мне кажется бредом, поэтому я решил поделиться не просто такого рода вариацией на тему «Как забэкапить данные с сервера без лишних телодвижений», а еще и скриптами самого процесса.

    Я уже говорил, что бэкап у меня происходит с разным постоянством для разных сайтов, но напомню еще раз:
    1. inwhite.ru – каждый час
    2. все остальное — каждые сутки
    По сути особой разницы в этих скриптах нет, поэтому приведу их 1 раз. Скриптов два, т.к. мы бэкапим базы и файлы, а они — суть разные вещи.

    Итак.

    Бэкапим базы данных


    #!/bin/bash<br><br>DATE=`date "+%Y-%m-%d"`<br>TIME=`date "+%H-%M"`<br><br># в Dropbox я создал специальную папку Backup, т.к.<br># у меня там хранятся еще и другие файлы и папки<br># если же вы создадите себе отдельный аккаунт на Dropbox<br># для этого, то, конечно же, вам эта папка будет не нужна<br>HOME="/home/dropbox/Dropbox/Backup"<br><br># массив таблиц, которые скрипт должен игнорировать<br># я старался максимально упростить жизнь, и сделать так, чтобы можно<br># было меньше залезать на сервер при добавлении новых баз<br># мне кажется, что проще залезть и добавить базу, которую не надо <br># бэкапить, чем каждый раз добавлять новые базы, которые надо бэкапить<br>SKIP=("information_schema" "mysql")<br><br>HOST="127.0.0.1" # хост, на котором расположена база данных<br>USER="" # укажите здесь имя пользователя для соединения с базой данных<br>PASSWORD="" # пароль этого пользователя<br><br># получаем список доступных баз данных<br>DBS="$(mysql -h$HOST -u$USER -p$PASSWORD -Bse 'show databases')"<br><br># небольшая функция, для проверки на вхождение записи в массив<br># я не буду объяснять, как она работает, если вы захотите, то сами<br># разберетесь, т.к. тут нет ничего сложного<br>in_array() {<br>  haystack=("$@")<br>  needle=$1<br>  <br>  unset haystack[0]<br>    <br>  for i in "${haystack[@]}"; do<br>    if [ "$needle" == "$i" ]; then<br>      return 1<br>    fi<br>  done<br>            <br>  return 0<br>}<br><br># HERE GOES THE MAGIC  <br>for DB in $DBS; do<br>  # есть ли текущая база в списке игнорируемых<br>  in_array $DB "${SKIP[@]}"<br>  <br>  # если нет<br>  if [ "$?" == 0 ]; then<br>  # создаем полный путь до папки, куда мы положим бэкап<br>  # это будет выглядеть примерно так:<br>  # /home/dropbox/Dropbox/Backup/DB/inwhite<br>  mkdir -p $HOME/DB/$DB<br><br>  # делаем дамп базы данных<br>  mysqldump -h$HOST -u$USER -p$PASSWORD $DB > /tmp/db-$DB-$DATE-$TIME.sql<br>  # сжимаем TAR'ом<br>  tar -Pcf /tmp/db-$DB-$DATE-$TIME.tar /tmp/db-$DB-$DATE-$TIME.sql<br>  # сжимаем GZIP'ом. обратите внимание на то, что стоит максимальное сжатие,<br>  # поэтому на больших объемах данных процесс может происхоть долго<br>  gzip -c9 /tmp/db-$DB-$DATE-$TIME.tar > $HOME/DB/$DB/$DATE.tar.gz<br><br>  # удаляем ненужные файлы, оставшиеся после создания бэкапа<br>  rm -f /tmp/db-$DB-$DATE-$TIME.tar<br>  rm -f /tmp/db-$DB-$DATE-$TIME.sql<br><br>  # удаляем файлы, которым больше 7 дней<br>  find $HOME/DB/$DB/* -type d -mtime +7 -exec rm -rf {} \;<br>  fi<br>done<br><br>exit 0;

    А теперь бэкапим файлы


    По сути это два примерно одинаковых процесса с небольшими различиями в плане получения данных.

    #!/bin/bash<br><br>HOME="/home/dropbox/Dropbox/Backup"<br><br>DATE=`date "+%Y-%m-%d"`<br>TIME=`date "+%H-%M"`<br><br># массив доменов, которые мы не бэкапим<br>SKIP=("test1.ru" "test2.ru" "test3.ru")<br><br># получаем список папок, в которых расположены файлы наших доменов<br># у меня файлы расположены в папке /home/apache<br># если у вас они расположены, например, в /var/www, то строка ниже<br># должна выглядеть примерно так:<br># DOMAINS=`find /var/www -maxdepth 1 -type d | sed 's/\/var\/www//' | sed 's/\///'`<br>DOMAINS=`find /home/apache -maxdepth 1 -type d | sed 's/\/home\/apache//' | sed 's/\///'`<br><br>in_array() {<br>  haystack=("$@")<br>  needle=$1<br>  <br>  unset haystack[0]<br>  <br>  for i in "${haystack[@]}"; do<br>  if [ "$needle" == "$i" ]; then<br>    return 1<br>  fi<br>  done<br>  <br>  return 0<br>}<br><br>for DOMAIN in $DOMAINS; do<br>  in_array $DOMAIN "${SKIP[@]}"<br><br>  if [ "$?" == 0 ]; then<br>  mkdir -p /$HOME/FS/$DOMAIN<br><br>  tar -Pcf /tmp/fs-$DOMAIN-$DATE-$TIME.tar /home/apache/$DOMAIN<br>  gzip -c9 /tmp/fs-$DOMAIN-$DATE-$TIME.tar > /$HOME/FS/$DOMAIN/$DATE.tar.gz<br><br>  # в случае с файлами мы удаляем только TAR, т.к. SQL файла<br>  # у нас тут не производится<br>  rm -f /tmp/fs-$DOMAIN-$DATE-$TIME.tar<br><br>  find /$HOME/FS/$DOMAIN/* -type d -mtime +7 -exec rm -rf {} \;<br>  fi<br>done;<br><br>exit 0;

    У меня они называются database и filesystem соответственно, так что после установки их в /etc/cron.daily вам надо сделать:

    chmod +x /etc/cron.daily/database
    chmod +x /etc/cron.daily/filesystem

    Это, конечно же, простейший вариант. Можно все сделать более «правильно» и положить эти скрипты куда-нибудь, а задачу добавить через crontab -e. Но я единоличный пользователь своего сервера, и доступа к нему нет ни у кого другого, поэтому я вправе сделать так, как мне проще и удобнее.

    Обращаю также внимание на то, что пользователю, от имени которого вы будете делать бэкапы базы данных достаточно таких прав:

    SELECT, SHOW DATABASES, LOCK TABLES, SHOW VIEW

    Вот, в общем-то, и все, что тут можно рассказать. Спасибо за внимание, и пользуйтесь на здоровье. Надеюсь, кому-то это все же пригодится.

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 41

      +4
      Коллега! Я ведь тоже настроил резервацию баз данных на Dropbox, только у меня все скрипты на Ruby. Кто бы мог подумать. :-)
      • НЛО прилетело и опубликовало эту надпись здесь
          +1
            +1
            На самом деле все это бред, т.к. по сути твой сервер в ДЦ — такое же потенциально дырявое ведро, как и данные в Dropbox'е. Захотят — получат любым способом. Не важно, где данные лежат: VPS, Dedicated/Colocation в ДЦ, Shared или даже дома стойку поставь — один хрен доберутся, если надо.
            • НЛО прилетело и опубликовало эту надпись здесь
                +1
                шифруйте бекап-архивы. тем же GPG
                  0
                  не забудте при этом забэкапить закрытый ключ :)
              +3
              Можно шифровать все передаваемые данные.
              +3
              www.mysqlperformanceblog.com/2008/11/24/using-information_schema-instead-of-shell-scripting/#comment-391394

              Очень хороший способ делать бекапы без лишних скиптов :) Я написал себе запрос, который генерирует для innodb бекап каждой таблицы в свой файл, каждая база в своей папке и всё это запаковывается с 7z :)
                +6
                мда… как все запущено :(

                1.бекапим файло:

                user@home$ ssh user@bla-bla.ru tar -czf — /path_to_website | dd of=/backups/`date "+%y-%m-%d"`.mysite.tgz

                2.бекапим базу:

                mysqldump -h remotesite -u user -ppass my_bd |gzip > /backups/`date "+%y-%m-%d"`.sql.gz

                это самый примитив, без всяких инкрементов, но он лучше на порядок вашего костыля.

                если же вы не доверяете своему домашнему хранилищу и у вас ценные данные — купите S3 — стоит копейки, а надежность несравнима с дропбокс.
                  +1
                  Dropbox == (S3 + удобный софт)
                    +2
                    Dropbox дает какую-то гарантию?
                      +1
                      Заплати деньги — будет гарантия. Хотя судя по тому, что у них не написано обратное, гарантия есть и в прямом случае, т.е. на бесплатном аккаунте.

                      Вы все еще забываете про то, что кроме Dropbox'а все это удовольствие заливается еще и ко мне на компьютер. Просто я ничего для этого не делаю. Один раз сделал и все.
                  +4
                  Когда не стоит задача бэкапа файлов, а лишь базы данных удобнее всего бэкапить в gmail, просто отправляю письмо с дампом по крону, в гмэйле фильтр, который сразу кладет письмо под ярлык backups. В случае необходимости можно отправить письмо с дампом обратно и развернуть. Можно под каждый проект завести отдельное гугломыло, можно в рабочее сливать.

                  В случае с inwhite.ru я вообще не понимаю зачем бэкапить файлы, скрипты и элементы дизайна должны быть у разраба, а это уже вопрос локального бэкапа. Ценность представляет только БД.

                  Итого скрипт на баш из 5 строк.
                    0
                    Пока писал свой комментарий, Вы уже успели запостить данную методику:)
                      0
                      У нас есть еще логотипы и скриншоты, а так же еще аватары, которые в случае сбоя просить залить пользователей еще раз как-то не очень хочется.

                      Сам inwhite.ru весит ~500КБ, а архив всех файлов проекта — ~80МБ. Как вы думаете, нам есть ради чего бэкапить файлы?
                        0
                        у вас новых аватаров и картинок 80 метров ежедневно? накой их все то бэкапить несколько раз?
                      +2
                      Backup можно хранить в виде писем с attach на Gmail. В результате получаете хранилище на 7Гб, с uptime близким к 100%.
                        0
                        Тоже о таком задумывался, вот только интересно не противоречит ли это TOS? TOS я прочитал, но если кто-то может перевести с юридического на человеческий было бы здорово. Я почему спрашиваю, много раз встречал в блогах посты на тему что гугл автоматизировано отлавливает вот такое вот использование gmail.
                          0
                          3 года бэкаплюсь так, нет проблем =)
                          +1
                          пример скрипта можно?
                            +10
                            #!/bin/sh

                            db_user=«пользователь»
                            db_pass=«пароль»
                            db_name=«база»
                            email=«email@gmail.com»

                            mysqldump -u $db_user -p$db_pass -A > ./dump.sql

                            gzip -f ./dump.sql

                            mutt -s «dump — $(date +%d.%m.%Y)» -a ./dump.sql.gz $email < /dev/null

                            rm ./dump.sql.gz

                            echo «Ok»
                              0
                              глупохабр съел кавычки.
                                0
                                Да, кавычки стоит заменить на стандартные
                            0
                            В Gmail ограничение на attach в 34MB вроде бы. Я ошибаюсь?
                          +8
                          а dropbox делают бэкапы? они в свою очередь складывают их на narod.ru =)
                            +7
                            а narod.ru складвает свои на dropbox…
                          • НЛО прилетело и опубликовало эту надпись здесь
                              +2
                              Использую для бэкапов bqbackup.com/
                              100 гигов за 20 долларов. Бэкапится с помощью Rsync. Проблем не было. Оплата через Пайпал.
                                0
                                Спасибо, полезная информация, 10 гигов за 5 баксов с rsync это интересно.
                                  +1
                                  rsyncpalace.com/west_shared.php — 15G за $6

                                  это реселлер bqbackup.com
                                    0
                                    Очень даже большое спасибо за информацию! Сейчас с боссом поговорю, надо внедрять как дополнительный бекап.
                                      0
                                      Ещё добавлю — сейчас пишут, что они уже не реселлер, сами сервера держат: They have since moved away from bqbackup and started renting out servers out of 3 other locations.
                                        0
                                        1and1.com
                                        120 GB за $4.99 / месяц, SSH-доступа нет, дают 2 домена (com/net/org/biz/info) бесплатно.
                                        250 GB за $9.99 / месяц, SSH-доступ есть, дают 3 домена бесплатно.
                                        Если взять обязательство пользоваться не менее 1 года, то первые 3 месяца вообще бесплатно. Оплата поквартально для последнего варианта. Для 1-го — не знаю, либо поквартально, либо за полгода.
                                    +1
                                    А это зачем делать?

                                    # сжимаем TAR'ом
                                    tar -Pcf /tmp/db-$DB-$DATE-$TIME.tar /tmp/db-$DB-$DATE-$TIME.sql


                                    Не думаю что TAR сможет что-то тут «сжать». Он не для этого обычно используется. :)
                                    В данном случае, когда файл один, можно сразу переходить к gzip-у.

                                      0
                                      вместо dropbox можно монтировать gmail-ящик с помощью gmailfs: mount -t gmailfs none /mnt/disk2
                                        0
                                        А я вот раньше свои бэкапы сам себе на GMail отправлял :)
                                          0
                                          … а потом бесконечный ящик кончился? )
                                          0
                                          Блинда Мейс, у меня на домашнем сервере куча БД mysql, и я как-то настроил, что по mysql рута пускают без пароля, а mysqldump не хочет без пароля рута пускать. У тебя нет мыслей, как мне это удалось сделать?
                                            0
                                            спасибо, пригодилось!

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

                                            Самое читаемое