Restic: Backups Encriptados com Deduplicação para PME
Neste artigo
Introdução
O Restic é uma ferramenta de backup open-source escrita em Go, desenhada para ser rápida, segura e eficiente. Para pequenas e médias empresas (PME) que precisam de uma solução robusta sem o custo de plataformas comerciais, o Restic oferece encriptação autónoma, deduplicação ao nível de bloco e suporte para múltiplos backends de armazenamento.
Ao contrário de ferramentas tradicionais como rsync ou tar, o Restic gere automaticamente snapshots incrementais, mantendo histórico completo sem duplicar dados. Cada backup cria um ponto de restauração independente, mas apenas os blocos novos são transferidos. Isto reduz drasticamente o espaço e a largura de banda consumidos.
A encriptação AES-256-CTR com autenticação Poly1305 é aplicada antes de qualquer dado deixar a máquina de origem. O backend de armazenamento — seja S3, B2, um disco local ou um servidor SFTP — recebe apenas ciphertext. Nem o administrador do armazenamento consegue ler os ficheiros sem a palavra-passe de reposição.
ℹ Porquê o Restic para PME?
Sem dependência de agentes em serviço, instala-se com um único binário estático. Funciona em Linux, macOS e Windows. Os custos de operação resumem-se ao armazenamento objecto (típicamente 5-20 €/mês para 500 GB no B2 ou S3 Glacier). Não há licenças por servidor nem consolidação obrigatória.
O projecto é mantido activamente no GitHub, com releases regulares e documentação completa. A versão estável actual suporta repositórios v2, compressão opcional (zstd) e integração nativa com rclone para backends diversos.
Instalar e Configurar
O Restic distribui-se como binário estático, sem dependências de runtime. A forma mais simples em Debian/Ubuntu é via gestor de pacotes:
# Debian/Ubuntu
sudo apt update && sudo apt install restic
# Fedora/RHEL
sudo dnf install restic
# Arch Linux
sudo pacman -S restic
# macOS (Homebrew)
brew install restic
Para a versão mais recente, usar o self-update após a instalação inicial, ou descarregar directamente do GitHub Releases:
sudo restic self-update
Inicializar o repositório
O primeiro passo é criar um repositório encriptado. A palavra-passe definida aqui é a única chave para desenciptar os dados — perdê-la significa perder todos os backups. Guardar a palavra-passe em gestor de credenciais (Bitwarden, KeePass) é mandatório.
# Repositório local
restic init --repo /mnt/backup/restic-repo
# Repositório remoto via SFTP
restic init --repo sftp:user@server:/data/restic-repo
# Repositório S3
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="secret..."
restic init --repo s3:https://s3.eu-west-1.amazonaws.com/bucket-name/restic
Variáveis de ambiente
Para evitar introduzir a palavra-passe manualmente em cada operação, usar RESTIC_PASSWORD_FILE ou RESTIC_PASSWORD:
# Ficheiro seguro (perms 600)
echo "minha-palavra-passe-forte" > /root/.restic-pass
chmod 600 /root/.restic-pass
export RESTIC_REPOSITORY="s3:s3.eu-west-1.amazonaws.com/bucket/restic"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="secret..."
⚠ Não perder a palavra-passe
O Restic não tem mecanismo de recuperação. Sem a palavra-passe, os backups são irrecuperáveis. Guardar cópia offline em local físico separado (cofre, papel).
Backups Incrementais
O comando restic backup cria um snapshot. Cada snapshot é um ponto completo de restauração, mas internamente o Restic só armazena blocos novos (deduplicação content-defined chunking). A primeira execução envia todos os dados; as subsequentes transferem apenas o que mudou.
# Backup de um directório
restic backup /home/duarte /etc /var/www
# Com tags e descrição
restic backup /var/www --tag web --tag producao --host srv-kbase
# Ver todos os snapshots
restic snapshots
# Ver ficheiros dentro de um snapshot
restic ls latest
restic ls <snapshot-id>
Excluir ficheiros
Para PME, é comum excluir caches, logs temporários e ficheiros grandes irrelevantes. O Restic suporta padrões --exclude e ficheiros .gitignore-style:
restic backup /home/duarte \
--exclude "*.tmp" \
--exclude ".cache/**" \
--exclude "node_modules/**" \
--exclude-file /etc/restic/excludes.txt
Exemplo de /etc/restic/excludes.txt:
# Caches e temporários
.cache/
.tmp/
*.log
*.swp
# Virtualizadores
*.vmdk
*.vdi
*.qcow2
# Aplicações
node_modules/
__pycache__/
.venv/
Restaurar dados
A restauração extrai um snapshot completo ou parcial. O --target define o destino; sem ele, restaura para o caminho original.
# Restaurar snapshot completo
restic restore latest --target /tmp/restore
# Restaurar apenas um ficheiro
restic restore latest --target /tmp/restore \
--include /home/duarte/projeto/importante.sql
# Montar snapshot como filesystem (FUSE)
restic mount /mnt/restic-snapshots
Política de retenção (forget + prune)
Para manter o repositório controlado, usar forget com política GFS (Grandfather-Father-Son) e --prune para libertar espaço:
# Manter: 7 diários, 4 semanais, 6 mensais, 2 anuais
restic forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--keep-yearly 2 \
--prune \
--group-by host,paths
✓ Automação com cron
Colocar as variáveis de ambiente em /etc/restic/env (perms 600) e criar um script em /etc/cron.daily/restic-backup. Ver exemplos completos na documentação oficial.
Backends (S3/B2/local/SFTP)
O Restic suporta múltiplos backends de armazenamento, cada um com casos de uso específicos. A escolha depende do orçamento, da necessidade de offsite e da infraestrutura existente. Para PME, recomenda-se a regra 3-2-1: três cópias, em dois meios diferentes, com uma offsite.
Local (disco USB/NAS)
O backend mais simples. Ideal como primeira cópia rápida para restauração imediata. Sem custos recorrentes, mas sem protecção offsite contra roubo ou incêndio.
restic init --repo /mnt/usb-backup/restic
restic backup /home/duarte --repo /mnt/usb-backup/restic
SFTP (servidor remoto)
Usa SSH para transferência encriptada. Ideal quando já existe um servidor ou VPS com espaço disponível. Requer configuração de chaves SSH para automatização.
# Configurar chave SSH sem passphrase
ssh-keygen -t ed25519 -f /root/.ssh/restic_key -N ""
ssh-copy-id -i /root/.ssh/restic_key user@backup-server
# Inicializar e usar
restic init --repo sftp:user@backup-server:/data/restic
restic backup /home/duarte --repo sftp:user@backup-server:/data/restic
Amazon S3
Para offsite verdadeiro, o S3 oferece durabilidade de 99.999999999% e disponibilidade elevada. O custo depende da classe de armazenamento: Standard (~0.023 €/GB/mês), Glacier (~0.004 €/GB/mês, restauração lenta) ou Glacier Deep Archive (~0.00099 €/GB/mês, restauração em horas).
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/..."
export RESTIC_REPOSITORY="s3:s3.eu-west-1.amazonaws.com/kbase-backups/restic"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
restic init
restic backup /home/duarte /var/www /etc
Backblaze B2
O B2 é a alternativa mais económica ao S3 para backups: 0.006 €/GB/mês de armazenamento, sem taxas de egress. Para 500 GB, custa ~3 €/mês no B2 vs ~11.50 € no S3 Standard. O Restic suporta B2 nativamente através do endpoint S3-compatible do B2.
export B2_ACCOUNT_ID="001234567890"
export B2_ACCOUNT_KEY="K001234567890abcdef..."
export RESTIC_REPOSITORY="b2:kbase-backups:restic"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
restic init
restic backup /home/duarte /var/www
💡 Dica: combinar backends
Para PME, a configuração ideal é dois repositórios: um local (USB/NAS) para restauração rápida e um B2/S3 para offsite. O comando restic copy permite replicar snapshots entre repositórios sem re-encriptar nem reenviar todos os dados.
Erros Comuns
Os erros mais frequentes com Restic em ambientes PME, suas causas e resoluções. A maioria está documentada na FAQ oficial.
| Erro | Causa | Solução |
|---|---|---|
wrong password ou unable to open repo |
Palavra-passe incorrecta ou variável RESTIC_PASSWORD não definida no ambiente |
Verificar echo $RESTIC_PASSWORD ou conteúdo do ficheiro referenciado em RESTIC_PASSWORD_FILE |
repository version 2 not supported |
Restic antigo a aceder repositório criado por versão mais recente | Actualizar Restic com restic self-update em todas as máquinas que acedem o repositório |
Fatal: unable to open S3 backend |
Credenciais AWS/B2 incorrectas, bucket inexistente ou endpoint errado | Confirmar AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY; verificar nome do bucket e região no URL |
pack X: wrong size ou error loading index |
Corrupção do repositório (disco com badblocks, transferência interrompida) | Executar restic check --read-data para diagnosticar; se necessário, restic rebuild-index seguido de restic prune |
lock refresh failed ou stale lock detected |
Processo de backup interrompido abruptamente (kill -9, power loss) | Remover locks stale com restic unlock (apenas quando nenhum backup está a correr) |
| Backup lento / grande consumo de RAM | Directórios com milhões de ficheiros pequenos ou cache de índice cheia | Ajustar --pack-size para 64 ou 128 MB; limpar cache com restic cache --cleanup |
sftp: handshake failed |
Chave SSH não configurada ou servidor SFTP sem chave pública autorizada | Confirmar ssh user@server funciona sem prompts; adicionar chave a ~/.ssh/authorized_keys do destino |
B2: bucket not found |
Nome do bucket incorrecto ou B2_ACCOUNT_ID/B2_ACCOUNT_KEY trocados |
Verificar credenciais no painel B2; confirmar que o bucket existe e tem permissões de escrita |