Rsync Tutorial · 6 min read · Dec 13, 2025

Espelhe Seu Site Com rsync

Este tutorial mostra como você pode espelhar seu site do seu servidor web principal para um servidor de backup que pode assumir se o servidor principal falhar. Usamos a ferramenta rsync para isso, e fazemos com que ela seja executada através de um trabalho cron que verifica a cada x minutos se há algo para atualizar no espelho. Assim, seu servidor de backup deve estar geralmente atualizado se precisar assumir.

rsync atualiza apenas arquivos que mudaram, então você não precisa transferir 5 GB de dados sempre que executar o rsync. Ele apenas espelha arquivos novos/mudados, e também pode excluir arquivos do espelho que foram excluídos no servidor principal. Além disso, ele pode preservar permissões e propriedades de arquivos e diretórios espelhados; para preservar as propriedades, precisamos executar o rsync como root, que é o que fazemos aqui. Se as permissões e/ou propriedades mudarem no servidor principal, o rsync também as mudará no servidor de backup.

Neste tutorial, vamos tunelar o rsync através do SSH, que é mais seguro; isso também significa que você não precisa abrir outra porta em seu firewall para o rsync - é suficiente que a porta 22 (SSH) esteja aberta. O problema é que o SSH requer uma senha para fazer login, o que não é bom se você quiser executar o rsync como um trabalho cron. A necessidade de uma senha requer interação humana, o que não é o que queremos.

Mas, felizmente, há uma solução: o uso de chaves públicas. Criamos um par de chaves (em nosso servidor de backup mirror.example.com), uma das quais é salva em um arquivo no sistema remoto (server1.example.com). Depois, não seremos mais solicitados a uma senha quando executarmos o rsync. Isso também inclui trabalhos cron, que é exatamente o que queremos.

Como você já deve ter adivinhado a partir do que escrevi até agora, o conceito é que iniciamos o espelhamento de server1.example.com diretamente de mirror.example.com; server1.example.com não precisa fazer nada para ser espelhado.

Usarei a seguinte configuração aqui:

  • Servidor principal: server1.example.com (server1) - Endereço IP: 192.168.0.100
  • Servidor de espelho/backup: mirror.example.com (mirror) - Endereço IP: 192.168.0.175
  • O site que deve ser espelhado está em /var/www no server1.example.com.

rsync é para espelhar apenas arquivos e diretórios; se você quiser espelhar seu banco de dados MySQL, use espelhamento/repliação MySQL em vez disso.

Quero dizer primeiro que esta não é a única maneira de configurar tal sistema. Existem muitas maneiras de alcançar esse objetivo, mas este é o caminho que vou seguir.

O primeiro passo é fazer login ou se tornar o usuário root em seu sistema. No Debian e centOS, use:

su -

Se você estiver logado como um usuário diferente de root. No Ubuntu, use:

sudo -s

em vez disso.

1 Instalar rsync

Primeiro, precisamos instalar o rsync em server1.example.com e mirror.example.com. Para sistemas Debian e Ubuntu, isso se parece com isto:

server1/mirror:

(Estamos fazendo isso como root!)

apt install rsync

Em outras distribuições Linux, você usaria yum / dnf (Fedora/CentOS) ou yast (SuSE) para instalar o rsync.

No CentOS / Rocky Linux ou AlmaLinux, use:

dnf install rsync

2 Criar Um Usuário Não Privilegiado Em server1.example.com

Agora criamos um usuário não privilegiado chamado someuser em server1.example.com que será usado pelo rsync em mirror.example.com para espelhar o diretório /var/www (claro, someuser deve ter permissões de leitura em /var/www em server1.example.com).

server1:

(Estamos fazendo isso como root!)

sudo useradd -d /home/someuser -m -s /bin/bash someuser

Isso criará o usuário someuser com o diretório home /home/someuser e o shell de login /bin/bash (é importante que someuser tenha um shell de login válido - algo como /bin/false não funciona!). Agora dê uma senha a someuser:

passwd someuser

3 Testar rsync

Em seguida, testamos o rsync em mirror.example.com. Como root, fazemos isso:

mirror:

rsync -avz -e ssh [email protected]:/var/www/ /var/www/

Você deve ver algo como isto. Responda com sim:

A autenticidade do host 'server1.example.com (192.168.0.100)' não pode ser estabelecida.  
A impressão digital da chave RSA é 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.  
Você tem certeza de que deseja continuar conectando (sim/não)?
<-- sim

Então insira a senha de someuser, e você deve ver que o diretório /var/www do server1.example.com está espelhado para /var/www em mirror.example.com.

Você pode verificar isso assim em ambos os servidores:

server1/mirror:

ls -la /var/www

Você deve ver que todos os arquivos e diretórios foram espelhados para mirror.example.com, e os arquivos e diretórios devem ter as mesmas permissões/propriedades que em server1.example.com.

4 Criar As Chaves Em mirror.example.com

Agora criamos o par de chaves privada/pública em mirror.example.com:

mirror:

(Estamos fazendo isso como root!)

mkdir /root/rsync  
ssh-keygen -t dsa -b 1024 -f /root/rsync/mirror-rsync-key

Você verá algo como isto:

Gerando par de chaves dsa pública/privada.  
Digite a frase secreta (vazia para nenhuma frase secreta): [pressione enter aqui]  
Digite a mesma frase secreta novamente: [pressione enter aqui]  
Sua identificação foi salva em /root/cron/mirror-rsync-key.  
Sua chave pública foi salva em /root/cron/mirror-rsync-key.pub.  
A impressão digital da chave é:  
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@mirror

É importante que você não insira uma frase secreta, caso contrário, o espelhamento não funcionará sem interação humana, então simplesmente pressione enter!

Em seguida, copiamos nossa chave pública para server1.example.com:

mirror:

(Ainda estamos fazendo isso como root.)

scp /root/rsync/mirror-rsync-key.pub [email protected]:/home/someuser/

A chave pública mirror-rsync-key.pub deve agora estar disponível em /home/someuser em server1.example.com.

5 Configurar server1.example.com

Agora faça login via SSH em server1.example.com como someuser (não root!) e faça isso:

server1:

(Por favor, faça isso como someuser!)

mkdir ~/.ssh  
chmod 700 ~/.ssh  
mv ~/mirror-rsync-key.pub ~/.ssh/  
cd ~/.ssh  
touch authorized_keys  
chmod 600 authorized_keys  
cat mirror-rsync-key.pub >> authorized_keys

Ao fazer isso, anexamos o conteúdo de mirror-rsync-key.pub ao arquivo /home/someuser/.ssh/authorized_keys. /home/someuser/.ssh/authorized_keys deve se parecer com isto:

server1:

(Ainda como someuser!)

vi /home/someuser/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@  
mirror

Agora queremos permitir conexões apenas de mirror.example.com, e o usuário que se conecta deve ser permitido a usar apenas rsync, então adicionamos

command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty

logo no início de /home/someuser/.ssh/authorized_keys:

server1:

(Ainda como someuser!)

vi /home/someuser/.ssh/authorized_keys
command="/home/someuser/rsync/checkrsync",from="mirror.example.com",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom root@  
mirror

Você deve usar um FQDN como mirror.example.com em vez de um endereço IP após from=, caso contrário, o espelhamento automatizado não funcionará!

Agora criamos o script /home/someuser/rsync/checkrsync que rejeita todos os comandos, exceto rsync.

server1:

(Ainda fazemos isso como someuser!)

mkdir ~/rsync  
vi ~/rsync/checkrsync
#!/bin/sh  
  
case "$SSH_ORIGINAL_COMMAND" in  
        *\&*)  
                echo "Rejeitado"  
                ;;  
        *\(*)  
                echo "Rejeitado"  
                ;;  
        *\{*)  
                echo "Rejeitado"  
                ;;  
        *\;*)  
                echo "Rejeitado"  
                ;;  
        *\<*)  
                echo "Rejeitado"  
                ;;  
        *\`*)  
                echo "Rejeitado"  
                ;;  
        rsync\ --server*)  
                $SSH_ORIGINAL_COMMAND  
                ;;  
        *)  
                echo "Rejeitado"  
                ;;  
esac
chmod 700 ~/rsync/checkrsync

6 Testar rsync Em mirror.example.com

Agora devemos testar em mirror.example.com se podemos espelhar server1.example.com sem sermos solicitados a senha de someuser. Fazemos isso:

mirror:

(Estamos fazendo isso como root!)

rsync -avz --delete --exclude=/stats --exclude=/error --exclude=/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/

(A opção –delete significa que arquivos que foram excluídos em server1.example.com também devem ser excluídos em mirror.example.com. A opção –exclude significa que esses arquivos/diretórios não devem ser espelhados; por exemplo, –exclude=/error significa “não espelhar /var/www/error”. Você pode usar várias opções –exclude. Listei essas opções como exemplos; você pode ajustar o comando para suas necessidades. Dê uma olhada em

man rsync

para mais informações.)

Você deve agora ver que o espelhamento está ocorrendo:

recebendo lista de arquivos ... feito  
  
enviado 71 bytes  recebido 643 bytes  476.00 bytes/seg  
tamanho total é 64657  aceleração é 90.56

sem ser solicitado a uma senha! Isso é o que queríamos.

7 Criar Um Trabalho Cron

Queremos automatizar o espelhamento, por isso criamos um trabalho cron para isso em mirror.example.com. Execute crontab -e como root:

mirror:

(Estamos fazendo isso como root!)

crontab -e

e crie um trabalho cron como este:

*/5 * * * * /usr/bin/rsync -azq --delete --exclude=/stats --exclude=/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key" [email protected]:/var/www/ /var/www/ 

Isso executaria o rsync a cada 5 minutos; ajuste conforme suas necessidades (veja

man 5 crontab

). Eu uso o caminho completo para o rsync aqui (/usr/bin/rsync) apenas para ter certeza de que o cron sabe onde encontrar o rsync. O local do seu rsync pode ser diferente. Execute

mirror:

(Estamos fazendo isso como root!)

which rsync

para descobrir onde está o seu.

8 Links

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.