Skip to main content

Backup com restic + rclone

Vamos configurar uma solução de backup utilizando restic e rclone.

Restic é uma ferramenta de backup super bacana, que tem como principais recursos a encriptação - o que significa que mesmo que seu backup caia nas mãos erradas, somente com a sua senha será possível decriptá-lo. Além disso, ele é eficiente: a cada backup, somente os dados que realmente mudaram precisam ser armazenados - arquivos que não mudaram, não precisam ser reenviados.

Instalando as ferramentas

Vamos antes de mais nada, certificar que temos as 3 ferramentas para esse tutorial instaladas:

  • restic: uma ferramenta de backup rápida e segura
  • rclone: uma ferramenta de linha de comando para gerenciamento de arquivos na nuvem.
  • libsecret-tools: uma ferramenta para armazenar e recuperar senhas.

Se você está utilizando Ubuntu, basta rodar esse comando:

sudo apt install restic rclone libsecret-tools

Criando a API Key

Acesse a lista de api keys e crie uma caso ainda não tenha, ou escolha uma API key apropriada.

Você vai precisar do id e do secret nos próximos passos.

Configurando o rclone

Siga as instruções disponíveis para configurar um remote no rclone.

Para esse tutorial, vamos assumir que foi configurado um remote chamado mgc. Certifique-se de que ele está funcionando rodando o seguinte comando:

rclone lsd mgc:

Isso deve listar os buckets que você tem, se já tiver algum criado. Caso ainda não tenha nenhum bucket, não vai aparecer nada, mas se nenhuma mensagem de erro aparecer, está tudo certo.

Caso ainda não tenha criado um via o console web, vamos agora criar o bucket que vai armazenar o nosso backup. Por exemplo:

rclone mkdir mgc:meu-bucket-de-backup

Troque o meu-bucket-de-backup por um nome que você achar apropriado. O comando acima não exibe nenhum output, mas é possível usar o comando lsd mostrado anteriormente para verificar que o bucket foi criado.

O nome do bucket precisa respeitar as regras de nomes de buckets, então escolha um que seja bem diferente, uma vez que a API de object storage não permite nomes duplicados. As chances de alguém já ter escolhido backup são grandes.

Nota: embora seja possível utilizar o restic diretamente com a API S3, sem precisar do rclone, estamos escolhendo utilizá-lo pois assim, não é necessário configurar variáveis de ambiente com as API keys, o que pode causar problemas com outras ferramentas em casos de uso mais complexos.

Configurando o Secret Manager

O próximo passo é definirmos uma senha para nosso repositório. Para não precisarmos digitar a senha a cada backup realizado, vamos configurar o gnome Keyring para salvar a senha para nós.

Armazene a senha no gnome Keyring com o seguinte comando:

secret-tool store --label='Password for: restic - Backups done right!' type password application net.restic.restic

E na sequência, informe a senha.

Agora, vamos configurar o restic para utilizar o gnome keyring. Fazemos isso exportando uma variável:

export RESTIC_PASSWORD_COMMAND="secret-tool lookup type password application net.restic.restic"

Pronto, agora o restic está pronto para ser utilizado. Lembre-se de salvar essas variáveis de ambiente no arquivo de configuração do seu shell ou profile.

Configurando o Restic

Agora que o secret manager está configurado, vamos configurar o restic.

Embora seja possível utilizar o restic informando os parâmetros de algumas maneiras diferentes, estamos escolhendo um caminho para que a sua execução seja o mais simples possível. Com isso, vamos configurar duas variáveis de ambiente específicas, para que não precisemos ficar informando o repositório (termo utilizado pelo restic - que no fundo é o nosso bucket), nem a senha do repositório a cada backup executado.

A variável é composta em 3 partes:

  • rclone: estamos indicando para o restic que queremos usar um backend configurado com o rclone.
  • mgc: esse é o nome do remote que configuramos no rclone no passo anterior.
  • meu-bucket-de-backup: Esse é o nome do bucket que será utilizado para armazenar os dados.

Configurando as variáveis de ambiente

No Linux, execute os comandos:

export RESTIC_REPOSITORY="rclone:mgc:meu-bucket-de-backup"
export RESTIC_PASSWORD_COMMAND="secret-tool lookup type password application net.restic.restic"

Pronto, agora o restic está pronto para ser utilizado.

Criando um novo repositório

Esse talvez seja o passo mais simples até agora. Basta rodar o seguinte comando:

restic init

Rapidinho ele vai terminar e exibir uma mensagem similar a essa:

created restic repository 5192661248 at rclone:mgc:meu-bucket-de-backup

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

Pronto. Era isso. Agora, vamos partir para nosso primeiro backup.

Fazendo o primeiro backup

Se chegamos até aqui, é porque você realmente tem algum dado importante que quer fazer backup. Para esse exemplo, vamos fazer o backup da nossa pasta de documentos. Note que em cada computador, a pasta pode ter um nome diferente, então certifique-se de digitar o nome correto no comando a seguir:

No Linux:

restic backup ~/Documents

Agora o restic vai fazer a mágica dele, enquanto ele está processando os dados e fazendo o upload, o progresso será exibido. Algo parecido com isso:

repository 51926612 opened (version 2, compression level auto)
no parent snapshot found, will read all files
[0:00] 0 index files loaded
[0:03] 0.67% 73 files 115.854 MiB, total 42004 files 16.911 GiB, 0 errors ETA 1:12:34

[Alguns momentos depois - Imagem do bob esponja]

Note que nesse exemplo, o diretório tem 16GB de dados para serem processados, e é exibido uma estimativa de que irá demorar pouco mais de uma hora para terminar o backup (ETA), mas não se preocupe, esse tempo provavelmente vai ser menor. Nesse caso, levou 27 minutos:

Files:       42004 new,     0 changed,     0 unmodified
Dirs: 9004 new, 0 changed, 0 unmodified
Added to the repository: 15.382 GiB (10.470 GiB stored)

processed 42004 files, 16.911 GiB in 27:56
snapshot d33c4cbc saved

Note que apesar do diretório ter praticamente 17GiB de dados, somente 10 GiB foram adicionados ao repositório. Isso é por que o restic faz compactação e de-duplicação de arquivos. Se por acaso tiver arquivos repetidos, eles não são armazenados duas vezes.

Fazendo um segundo backup

Sei que acabamos de fazer um backup, então não faz sentido fazer um novamente exatamente nesse instante, mas por curiosidade, vamos fazer mesmo assim.

restic backup ~/Documents

Opa. Dessa vez foi bem mais rápido (assumindo que você não jogou um monte de arquivo novo no diretório)

repository 51926612 opened (version 2, compression level auto)
using parent snapshot d33c4cbc
[0:00] 66.67% 2 / 3 index files loaded

Files: 0 new, 0 changed, 42004 unmodified
Dirs: 0 new, 0 changed, 9004 unmodified
Added to the repository: 0 B (0 B stored)

processed 42004 files, 16.911 GiB in 0:02
snapshot 57a760c7 saved

E aqui vemos uma das coisas mais legais do restic. Arquivos que não foram modificados, não precisam ser enviados novamente: eles já estão salvos no backup.

Restaurando

Nenhum backup é backup de verdade, se não conseguirmos restaurar quando necessário.

Vamos agora ensaiar um cenário de desastre e precisamos recuperar todo o nosso diretório que foi feito o backup.

Primeiro, vamos ver todos os snapshots criados:

restic snapshots

Se você executou tudo conforme indicado até agora, terá 2 snapshots. Algo similar a isso:

repository 51926612 opened (version 2, compression level auto)
ID Time Host Tags Paths
-----------------------------------------------------------------------------
d33c4cbc 2024-05-17 11:10:44 stoqws-16 /home/romaia/Documents
57a760c7 2024-05-17 13:31:40 stoqws-16 /home/romaia/Documents
-----------------------------------------------------------------------------
2 snapshots

Nessa listagem, temos o id do snapshot (que utilizaremos para restaurar), a hora em que foi feito o backup, o hostname do computador onde esse backup foi feito, tags (que não inserimos nenhuma) e o diretório que foi salvo nesse snapshot.

Note por essa listagem, que é possível, em um mesmo repositório, fazer backups de diretórios e computadores diferentes.

Para restaurarmos, então, vamos executar:

restic restore --target /tmp/documentos-restaurados 57a760c7

Isso vai criar o diretório /tmp/documentos-restaurados e restaurar todos os arquivos presentes no snapshot informado (57a760c7).

Caso precise restaurar apenas um ou alguns poucos arquivos, é possível também criar um "ponto de montagem" do seu backup: é como se você espetasse um pendrive com o backup no computador.

Primeiro, crie um diretório que é onde o sistema de arquivos será montado:

mkdir /tmp/restic-mount

restic mount /tmp/restic-mount

Pronto. A ferramenta ficará em execução, mas em um outro terminal ou navegador de arquivos, é possível navegar pelos snapshots e arquivos, e com isso, copiar o arquivo que precisar restaurar.

Quando concluir, basta voltar no terminal que rodou o restic mount e apertar Ctrl + C.

Este guia detalhado abrange desde a instalação das ferramentas necessárias até a configuração de backups periódicos, oferecendo soluções tanto para ambientes Ubuntu quanto Windows. Seguindo os passos aqui apresentados, você será capaz de implementar uma robusta estratégia de backup usando restic e rclone, garantindo a segurança e a disponibilidade dos seus dados importantes. Lembre-se sempre de testar os procedimentos de restauração periodicamente para garantir que tudo está funcionando como esperado.

Nesse ponto que chegamos, já podemos fazer nosso backup sempre que acharmos necessário, mas uma boa prática pode ser realizar o backup periodicamente.

Configurando um backup periódico

Uma maneira muito simples de fazer isso, é utilizando o crontab.

Em um terminal, basta digitar:

crontab -e

Isso vai abrir um editor para configurarmos um cron job que será executado com o nosso usuário. (Dica: você pode alterar o editor que é aberto exportando uma variável EDITOR com o seu editor de preferência)

Um ponto importante do crontab, é que as variáveis de ambiente definidas no seu terminal não estarão presentes ao executar o job, então vamos precisar defini-las no crontab também.

RESTIC_REPOSITORY="rclone:mgc:meu-bucket-de-backup"
RESTIC_PASSWORD_COMMAND="secret-tool lookup type password application net.restic.restic"

0 13 * * * run-one restic backup ~/Documents

O exemplo acima configura o backup para ser feito todo dia as 13 horas. São poucas as pessoas que sabem a especificação de um cronjob de cabeça, então se precisar de ajuda para definir a periodicidade, um bom site é o crontab.guru

Nesse exemplo, utilizamos o run-one para garantir que, caso o nosso backup leve mais tempo do que 24 horas para concluir, quando chegar o horário da próxima execução, ele não vai iniciar novamente, uma vez que o processo anterior ainda está rodando. Embora seja pouco provável que isso aconteça, é sempre uma boa prática utilizar o run-one em cronjobs, especialmente quando a frequência de execução for mais rápida.