Introduza o termo a pesquisar e clique Enter.

Backups do servidor via Dropbox

Set 10 02

Escrito por Luis Nabais @ 02/09/10 18:09 | 7 Comentários »

Um pequeno blog pessoal e meia dúzia de projectos pessoais podem não ser os dados mais importantes do mundo mas não deixa de fazer sentido manter backups regulares. Se isto não é problema para quem contrata um serviço completo de alojamento onde é costume serem feitos backups regulares passa a ser para malta como eu que prefere aventurar-se sozinho num VPS.

Então tive uma ideia (e claramente não fui o primeiro): porque não usar uma conta gratuita no Dropbox como espaço off-site para os backups? (btw este link dá 256mb de bónus a quem o usar para se inscrever)

Posto isto meti mãos à obra.

1. Script backup

O primeiro ponto foi criar um pequeno script para fazer os backups de forma automatizada. Não é o melhor script do mundo (ainda estou a ponderar usar o rsync) mas serve para algo simples como o meu site pessoal.

#!/bin/sh
mysql_user="user1"
mysql_pass="password"

timestamp=`date +%s`
mysqldump --user $mysql_user -p$mysql_pass --all-databases --opt | gzip > mysql-$timestamp.sql.gz
tar -czpf docs-$timestamp.tar.gz /var/www
tar -czf backup-$timestamp.tar.gz mysql-$timestamp.sql.gz docs-$timestamp.tar.gz
rm -f mysql-$timestamp.sql.gz docs-$timestamp.tar.gz
chown user1:user1 backup-$timestamp.tar.gz
mv backup-$timestamp.tar.gz ~user1/Dropbox/

Como podem ver há algumas coisas que é preciso fazer para este script funcionar. Primeiro foi preciso adicionar um user novo ao MySQL para fazer o backup das bases das dados (são necessárias permissões globais para SELECT e LOCK TABLES) e depois adicionei um novo utilizador ao sistema que vai correr o daemon da Dropbox.

Depois, para o script correr periodicamente bastou adiciona-lo ao crontab do utilizador root:

# crontab -e

Um exemplo de linha a adicionar ao crontab seria a seguinte (que corre ás 5 da manhã do dia 30 de cada mês):

* 5 30 * * /root/scripts/backup.sh > /dev/null %2>1

2. Instalar Dropbox
Agora temos de instalar o daemon da Dropbox no nosso servidor e coloca-lo a correr debaixo do utilizador que criamos para o efeito.

$ cd ~
$ wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86
$ tar xzf dropbox-lnx.x86-0.7.110.tar.gz
$ .dropbox-dist/dropboxd

Depois de correr o programa pela primeira vez ele vai mostrar um endereço URL que deve ser visitado usando um qualquer browser. O URL não vai mostrar qualquer confirmação mas se forem à tab de eventos no site da Dropbox vão ver o vosso servidor associado à conta em questão e a sincronização vai começar a funcionar.

Agora é um bom momento para terminar o processo da dropbox e criar o script que vai ser usado para arrancar a dropbox como daemon. As instruções que se seguem são para CentOS 5, para a vossa distribuição de linux vejam a wiki da Dropbox.

Como root criem um ficheiro /etc/init.d/dropbox com o seguinte conteúdo:

# chkconfig: 345 85 15
# description: Startup script for dropbox daemon
#
# processname: dropboxd
# pidfile: /var/run/dropbox.pid
#
# Source function library.
. /etc/rc.d/init.d/functions

DROPBOX_USERS="user1"

prog=dropboxd
lockfile=${LOCKFILE-/var/lock/subsys/dropbox}
RETVAL=0

start() {
        echo -n $"Starting $prog"
        for dbuser in $DROPBOX_USERS; do
            daemon --user $dbuser /home/$dbuser/.dropbox-dist/dropboxd &
        done

        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
        echo -n $"Stopping $prog"
    for dbuser in $DROPBOX_USERS; do
        killproc dropbox
    done
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

status() {
    for dbuser in $DROPBOX_USERS; do
        dbpid=`pgrep -u $dbuser dropbox`
        if [ -z $dbpid ] ; then
            echo "dropboxd for USER $dbuser: not running."
        else
            echo "dropboxd for USER $dbuser: running."
        fi
    done
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  status)
        status
        ;;
  *)
        echo $"Usage: $prog {start|stop|restart|status}"
        RETVAL=3
esac

exit $RETVAL

Não se esqueçam de o tornar executável e de mudar o nome do utilizador no topo. Aviso também desde já que este script não deve ser muito solido nomeadamente na parte de parar o serviço. Se alguém quiser sugerir melhorias estejam à vontade.

Com isto a Dropbox já está a funcionar, o script já está a correr mensalmente e “automagicamente” vão ver os backups aparecerem na pasta da Dropbox. Agora fiquem é avisados, um backup da minha VPS ocupa sensivelmente 350mb pelo que bastam cerca de 5/6 meses para encher uma conta da Dropbox pelo que vale a pena ir rodando os backups para poupar espaço. E não se esqueçam também de ir testando os backups não vá chegar o dia em que são precisos e se depararem com um belo ficheiro corrupto em vez do dump da base de dados por exemplo.

Referencias:

pub:

7 Comentários

  1. Ricardo Simão

    02 de Setembro de 2010 ás 22:36

    a utilizar Safari 6531.22.7 em iOS 4.0.2

    Para sincronismo estou a utilizar o Unison ( yum install unison). Sincroniza tb via ssh basta estar instalado em todos os servers. Se gerares public keys nem precisa de password. E podes levar mais longe o backup, alem de enviares os logs via mail, se tiveres um iPhone utiliza o Prowl. É um pequeno programa que recebe Push Notifications via API. Dá uma olhada no site deles. Podes por a tua script a enviar msgs para o serviço deles que recebes no telefone.
    De manhã quando acordo vejo sempre se os backups dos servers da empresa estão OK. Assim não me apanham desprevenido.

    • Dextro

      02 de Setembro de 2010 ás 22:57

      a utilizar Mozilla Firefox 3.6.7 em Fedora Linux

      sim, isso devem ser tudo coisas fantasticas mas:

      1 – Não tenho iPhone

      2 – Ninguém falou aqui em sincronizar maquinas mas sim numa forma relativamente simples e barata de fazer backups a um único servidor.

    • Ricardo Simão

      02 de Setembro de 2010 ás 23:35

      a utilizar Safari 6531.22.7 em iOS 4.0.2

      Ó inteligente tu é que falaste em rsync no post, eu apenas referi que uso outro programa e que dá para fazer mais. Tu podes não ter um iPhone mas se calhar alguém que o lê o post tem e não conhece o Prowl. A ideia de ter blog não é partilhar ou escreves para o teu umbigo? Já que estás a escrever scripts escreve algo de jeito ou então aproveita ideias de alguém que sabe mais que tu.

    • Dextro

      02 de Setembro de 2010 ás 23:52

      a utilizar Mozilla Firefox 3.6.8 em Windows 7

      Como adoro ser insultado e como adoro quando há malta que aparece aqui a afirmar logo que sabe mais que eu sem sequer me conhecer (não é que eu duvide da existência dessas pessoas, ao contrario de muitos tenho plena noção da minha ignorância).

      De qualquer forma lamento mas o Unison é um software bastante distinto do rsync com um use case relativamente diferente. Habitualmente em backups a ultima coisa que se quer fazer é alterar o backup. Em retrospectiva o rsync se calhar não devia sequer ser ponderado para o meu problema, tenho de admitir, dado não existir um segundo servidor para receber os ficheiros.

      Claro que se podiam fazer coisas bem melhores como ter sempre uma segunda maquina com uma copia completa da primeira mas isso envolvia dinheiro que não estou disposto a gastar neste caso.

      E sim, eu escrevo para partilhar o que bem me entender e quem gosta lê, quem não gosta ignora. Eu nem sequer faço dinheiro com isto, bem pelo contrario, portanto não me podem sequer acusar de estar atrás do dinheiro da publicidade.

      E ainda mais: dado eu ter push notifications do meu email no telemóvel não preciso de qualquer serviço externo para ser instantaneamente notificado do que quer que seja, basta um email. E isso é outra coisa que se faz num script com poucas linhas.

      Antes de insultar pense primeiro se o seu comentário foi de facto útil para o assunto em questão.

  2. Cláudio Franco

    03 de Setembro de 2010 ás 10:10

    a utilizar Mozilla Firefox 3.6.8 em Mac OS X 10

    Se os ficheiros que tiveres aqui no blog forem só as imagens e o próprio blog em si não vale a pena estares a guardar as versões mensais de todos eles.
    Isto é, em nada (penso) te ajuda ter a mesma imagem num pasta de março, de abril…

    Talvez aí o rsync te possa fazer a diferença, ele pode ir sempre adicionando os ficheiros novos e os modificados.

    À parte podias fazer sim um script que corre diariamente e enviava uma cópia da BD MySQL para o teu GMail (dúvido que a BD passe os 10mb de limite do GMail) e sempre ganhavas uma cópia diária.

    Mas isto sou eu 🙂

    • Dextro

      03 de Setembro de 2010 ás 13:18

      a utilizar Mozilla Firefox 3.6.7 em Fedora Linux

      Sim sim, não é mal pensado. A ver se vejo uma forma de guarda a diferença semanalmente ou assim em cima do que já fiz. Assim tenho um backup total do servidor a cada mês mais as pequenas diferenças a cada semana (diariamente não creio que valha a pena, talvez duas vezes por semana).