Backups do servidor via Dropbox

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: