Restic: Backups Encriptados com Deduplicação para PME

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