Entries Comments



Category: Bash

Backup em servidor remoto.

27 February, 2007 (16:42) | Bash, Ferramentas | By: João José

Confesso que, como muita gente, tenho sido desleixado no que toca a backups dos meus sites. Ontem depois do segundo amargo de boca que me custou 6 horas de trabalho para tentar pôr tudo no lugar decidi finalmente arranjar uma solução satisfatória (ou seja automática) para efectuar backups.

Lista de ingredientes:

  • 2 servidores com acesso shell
  • Um cliente ssh
  • 10 minutinhos que podem poupar muitas horas de trabalho

Se ainda não têm acesso shell ao vosso servidor enviem um email ao vosso host para vos dar. Se o host não o permitir acho que está na altura de mudarem de host :) . Entretanto se quiserem mudar ou apenas adquirir o servidor para os backups podem encontrar uma opção baratuxa aqui (link afiliado).

Ok, agora que já têm dois servidores com acesso shell vamos ao que interessa. Abram o vosso cliente ssh ( Se não têm recomendo o Putty) e liguem-se aos vossos sites, um em cada janela.

1- De forma a poder aceder remotamente ao servidor de forma automática vamos ter de autorizar uma ligação do servidor local (onde temos os ficheiros) ao remoto (para onde queremos enviar o backup).

Para isso no servidor local corram o seguinte comando:

Code (bash)

ssh-keygen -t rsa

Carreguem enter em todos os prompts até voltarem à linha de comando.

No meu caso é este o output:

Code (bash)

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
**************** root@as.webkaput.com
 

De seguida vamos abrir o ficheiro id_rsa.pub de forma a copiar a chave indentificativa da nosso servidor. Usando o editor VI.

Code (bash)

vi /root/.ssh/id_rsa.pub

Não se esqueçam de mudar o caminho do ficheiro para o vosso caso específico.

No VI fazemos:

seleccionar texto com o rato -> botão direito do rato -> ESC -> :q!

Isto vai copiar o texto e vai sair do editor sem gravar o ficheiro.

Saltamos agora para a janela do servidor remoto. Neste servidor vamos ter de encontrar a directoria /.ssh usando o comando find.

Code (bash)

find . -type d -name ‘.ssh’ -print
 

Depois de encontrada a directoria /.ssh vamos criar um ficheiro com o nome authorized_keys.

Code (bash)

vi /caminho-encontrado/.ssh/authorized_keys
 

No VI para copiar e gravar fazemos:

Botão direito do rato -> ESC ->:wq

E pronto o nosso servidor local já tem acesso ao nosso servidor remoto.

2-Vamos agora fazer um backup da nossa base de dados mysql e enviá-la para o servidor remoto

Em cada um dos servidores criamos uma directoria usando o mkdir para colocar o ficheiro por exemplo:

Code (bash)

mkdir /home/mysqlbak
 

Se ainda não têm uma directoria de cronjobs no servidor local criem uma abaixo da raiz da pasta web (normalmente www ou public_html) ou seja uma pasta que não está acessível via web. De seguida cria-se o script que cria e exporta o backup.

Code (bash)

mkdir /home/cronjobs
vi /home/cronjobs/backup.sh
 

No VI escrevem:

Code (bash)

mysqldump -u USERNAME -pPASSWORD nome-da-db >/home/mysqlbak/mysqldump.sql
rsync -avz /home/mysqlbak/mysqldump.sql username@ip-do-servidor-remoto:/home/mysqlbak/mysqldump.sql
 

ESC->:wq

O comando rsync tem a vantagem de sincronizar os ficheiros entre servidores ou seja não transfere a totalidade do ficheiro.

  • USERNAME é o username de acesso à vossa base de dados
  • PASSWORD é a password de acesso à vossa base de dados (e sim é mesmo -pPASSWORD tudo pegado)
  • nome-da-db é o nome da vossa base de dados. Se quiserem fazer um backup de todas as bases de dados coloquem –all-databases.
  • username é o username de acesso shell ao servidor remoto

Ok, temos o nosso script criado. Para testar o script vamos primeiro ter de mudar as permissões do ficheiro. Isto pode fazer-se usando o chmod.

Code (bash)

chmod ug=rwx /home/cronjobs/backup.sh
 

De seguida corremos o script.

Code (bash)

source /home/cronjobs/backup.sh
 

E pronto! Se não houver erros devemos ter agora o ficheiro /home/mysqlbak/mysqldump.sql em ambos os servidores.

3- Finalmente vamos fazer um cronjob para executar esta tarefa de hora a hora.

Code (bash)

crontab -e
 

E adicionamos a seguinte linha.

Code (bash)

0       *       *       *       *       /home/cronjobs/backup.sh
 

ESC->:wq

E pronto já podemos dormir mais descansados :)