Sobre nós Guias Projetos Contactos
Админка
please wait

O Rsync é o padrão de referência para sincronização e transferência eficiente de ficheiros em ambientes Unix. Utiliza codificação delta para transferir apenas as partes alteradas dos ficheiros, tornando-o ideal para backups, deployments e mirroring. Este guia aborda a utilização prática do rsync na perspetiva de um developer sénior.

Porquê Rsync

O Rsync oferece vantagens significativas:

  1. Transferência Delta: Envia apenas as diferenças dos ficheiros
  2. Compressão: Reduz a utilização de largura de banda
  3. Preservação: Mantém permissões, timestamps, symlinks
  4. Backups Incrementais: Eficiente para sincronizações regulares
  5. Integração com SSH: Transferências seguras através da rede

Sintaxe Básica

rsync [options] source destination

Sincronização Local

# Copiar ficheiros para outro diretório
rsync -av /source/path/ /destination/path/
# Espelhar diretório (eliminar ficheiros extra no destino)
rsync -av --delete /source/ /destination/

Importante: A barra final na origem é relevante:

  • /source/ - copia o conteúdo da origem
  • /source - copia o próprio diretório de origem

Opções Comuns

OpçãoDescrição
-aModo archive (recursivo, preserva tudo)
-vSaída verbosa
-zComprimir durante a transferência
-PProgresso + partial (retomar transferências)
-nDry run (mostrar o que aconteceria)
--deleteEliminar ficheiros no destino que não existem na origem
--excludeExcluir ficheiros que correspondam ao padrão
--includeIncluir ficheiros que correspondam ao padrão
-eEspecificar a shell remota

Sincronização Remota

Via SSH

# Enviar para servidor remoto
rsync -avz -e ssh /local/path/ user@server:/remote/path/
# Obter do servidor remoto
rsync -avz -e ssh user@server:/remote/path/ /local/path/
# Com porta SSH não padrão
rsync -avz -e 'ssh -p 2222' /local/ user@server:/remote/
# Com chave SSH
rsync -avz -e 'ssh -i ~/.ssh/mykey' /local/ user@server:/remote/

Com Password

Para scripts (menos seguro do que chaves):

# A utilizar sshpass
sshpass -p "password" rsync -avz /local/ user@server:/remote/
# Ou com variável de ambiente
SSHPASS="password" sshpass -e rsync -avz /local/ user@server:/remote/

Estratégias de Backup

Backup Básico

#!/bin/bash
SOURCE="/home/user/documents/"
BACKUP="/backup/documents/"
LOG="/var/log/backup.log"
rsync -av --delete \
--log-file="$LOG" \
"$SOURCE" "$BACKUP"

Backup Incremental com Hard Links

Criar backups incrementais eficientes em termos de espaço:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
SOURCE="/home/user/"
BACKUP_BASE="/backup"
LATEST="$BACKUP_BASE/latest"
TARGET="$BACKUP_BASE/$DATE"
# Criar backup usando hard links para o anterior
rsync -av --delete \
--link-dest="$LATEST" \
"$SOURCE" "$TARGET"
# Atualizar symlink latest
rm -f "$LATEST"
ln -s "$TARGET" "$LATEST"

Script de Backup Remoto

#!/bin/bash
set -e
# Configuração
SOURCE_SSH="user@production:/var/www"
BACKUP_BASE="/backups/production"
DATE=$(date +%Y-%m-%d_%H%M)
LATEST="$BACKUP_BASE/latest"
TARGET="$BACKUP_BASE/$DATE"
KEEP_DAYS=7
OPTIONS="-avz --delete --progress"
OPTIONS="$OPTIONS --exclude='*.log'"
OPTIONS="$OPTIONS --exclude='node_modules'"
OPTIONS="$OPTIONS --exclude='.git'"
# Criar backup
mkdir -p "$TARGET"
rsync $OPTIONS \
--link-dest="$LATEST" \
-e 'ssh -o StrictHostKeyChecking=no' \
"$SOURCE_SSH" "$TARGET"
# Atualizar link latest
rm -f "$LATEST"
ln -s "$TARGET" "$LATEST"
# Limpar backups antigos
find "$BACKUP_BASE" -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;
echo "Backup completed: $TARGET"

Sincronização Seletiva

Padrões de Include/Exclude

# Excluir padrões específicos
rsync -av \
--exclude='*.log' \
--exclude='*.tmp' \
--exclude='node_modules' \
--exclude='.git' \
/source/ /dest/
# Excluir a partir de ficheiro
rsync -av --exclude-from='exclude.txt' /source/ /dest/

exclude.txt:

*.log
*.tmp
*.swp
node_modules/
.git/
.env

Incluir Apenas Ficheiros Específicos

rsync -avm \
--include='*/' \
--include='*.php' \
--include='*.js' \
--include='*.css' \
--exclude='*' \
/source/ /dest/

A flag -m remove diretórios vazios.

Backup Apenas do Código-Fonte

#!/bin/bash
rsync -avm \
--include='*/' \
--include='*.php' \
--include='*.js' \
--include='*.ts' \
--include='*.vue' \
--include='*.css' \
--include='*.scss' \
--include='*.html' \
--include='*.json' \
--include='*.env.example' \
--include='.gitignore' \
--exclude='*' \
user@server:/var/www/app/ /backup/code/

Otimização de Performance

Limitação de Largura de Banda

# Limitar a 1000 KB/s
rsync -avz --bwlimit=1000 /source/ /dest/
# Limitar a 5 MB/s
rsync -avz --bwlimit=5000 /source/ /dest/

Compressão

# Compressão por defeito
rsync -avz /source/ user@server:/dest/
# Ignorar compressão para ficheiros pré-comprimidos
rsync -avz --skip-compress=gz/jpg/mp4/zip /source/ user@server:/dest/

Transferências em Paralelo

Utilize vários processos rsync para muitos ficheiros pequenos:

#!/bin/bash
SOURCE="/source"
DEST="user@server:/dest"
# Encontrar diretórios e sincronizar em paralelo
find "$SOURCE" -maxdepth 1 -type d | \
parallel -j 4 rsync -avz {} "$DEST/"

Padrões de Deployment

Deployment Simples

#!/bin/bash
rsync -avz --delete \
--exclude='.git' \
--exclude='.env' \
--exclude='node_modules' \
--exclude='storage/logs/*' \
./ user@server:/var/www/app/

Deployment com Comutação Atómica

#!/bin/bash
SERVER="user@production"
APP_PATH="/var/www"
RELEASE=$(date +%Y%m%d%H%M%S)
# Sincronizar para o novo diretório de release
rsync -avz --delete \
--exclude='.git' \
--exclude='node_modules' \
./ "$SERVER:$APP_PATH/releases/$RELEASE/"
# Executar comandos remotos
ssh "$SERVER" << EOF
cd $APP_PATH/releases/$RELEASE
# Ligar ficheiros partilhados
ln -s $APP_PATH/shared/.env .env
ln -s $APP_PATH/shared/storage storage
# Instalar dependências
composer install --no-dev
npm ci && npm run build
# Mudar o symlink de forma atómica
ln -sfn $APP_PATH/releases/$RELEASE $APP_PATH/current
# Reiniciar serviços
sudo systemctl reload php-fpm
# Limpar releases antigas (manter as últimas 5)
ls -dt $APP_PATH/releases/*/ | tail -n +6 | xargs rm -rf
EOF

Monitorização e Logging

Progresso e Estatísticas

# Mostrar progresso
rsync -avP /source/ /dest/
# Mostrar estatísticas no fim
rsync -av --stats /source/ /dest/
# Detalhar alterações (detalhado)
rsync -avvi /source/ /dest/

Logging para Ficheiro

rsync -av \
--log-file=/var/log/rsync.log \
--log-file-format="%t %f %b" \
/source/ /dest/

Resolução de Problemas

Fazer Primeiro um Dry Run

Teste sempre com -n:

rsync -avn --delete /source/ /dest/

Depurar Problemas de Ligação

# SSH verboso
rsync -avz -e 'ssh -v' /source/ user@server:/dest/
# Verificar o que seria transferido
rsync -avni /source/ /dest/

Lidar com Ficheiros Grandes

# Retomar transferências parciais
rsync -avP --partial /source/ /dest/
# Checksum em vez de mod-time (mais lento, mas preciso)
rsync -avc /source/ /dest/

Problemas de Permissões

# Preservar permissões (por defeito com -a)
rsync -av /source/ /dest/
# Não preservar (copiar como utilizador atual)
rsync -rv --no-perms --no-owner --no-group /source/ /dest/

Integração com Cron

Backup Automatizado

# /etc/cron.d/backup
0 2 * * * root /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Bloqueio para Evitar Sobreposição

#!/bin/bash
LOCKFILE="/var/run/backup.lock"
(
flock -n 200 || { echo "Backup already running"; exit 1; }
rsync -av /source/ /dest/
) 200>"$LOCKFILE"

Principais Conclusões

  1. Teste sempre com -n: Dry run antes de transferências reais
  2. A barra final é relevante: /source/ vs /source
  3. Use -P para transferências grandes: Progresso e capacidade de retoma
  4. --delete com cautela: Pode remover ficheiros no destino
  5. --link-dest para backups: Backups incrementais eficientes em termos de espaço
  6. Limitação de largura de banda: Seja cuidadoso em redes partilhadas

O Rsync é indispensável para qualquer trabalho de operações — domine-o para uma sincronização de ficheiros eficiente e fiável em toda a sua infraestrutura.

 
 
 
Языки
Темы
Copyright © 1999 — 2026
ZK Interactive