anteriormente nomeado Restic-Systemd-Automatic-backup
incluindo estes principais colaboradores:
O Restic é uma ferramenta de linha de comando para fazer backups, da maneira certa. Verifique o site oficial para obter uma explicação do recurso. Como back -end de armazenamento, recomendo o BackBlaze B2, pois o Restic funciona bem com ele, e é (no momento da redação) muito acessível para o hacker hobby! (Anedotal: pago pelos meus backups de sistemas completos a cada mês, normalmente <1 USD).
Infelizmente, o Restic não vem pré-configurado com uma maneira de executar backups automatizados, digamos todos os dias. No entanto, é possível configurar isso você mesmo usando ferramentas embutidas no seu sistema operacional e em alguns invólucros. Para o Linux com o Systemd, é conveniente usar o SystemD Timers. Para os sistemas MacOS, podemos usar o Launchagents interno. Para o Windows, podemos usar asks Scheduled. Qualquer sistema operacional com algo parecido com Cron também funcionará!
Aqui segue um tutorial de passo a passo sobre como configurá-lo, com meu script de amostra e configurações que você pode modificar para atender às suas necessidades.
Observe que você pode usar os back -ends de armazenamento suportados de qualquer Restic. A configuração deve ser semelhante, mas você precisará usar outras variáveis de configuração para corresponder ao seu back -end.
ATUALIZAÇÃO: Este projeto está completo (consulte o raciocínio abaixo). Somente as correções de bug serão aceitas. Sinta -se à vontade para garfo se quiser adicionar mais recursos; Ser uma base de bifurcação foi o escopo inicial deste projeto!
O escopo para isso não deve ser uma super solução completa que resolva todos os problemas e todas as configurações possíveis. O objetivo é ser uma base de código hackable para você começar a costurar a solução de backup perfeita que atende às suas necessidades!
No entanto, o projeto deve funcionar fora da caixa, ser mínimo, mas ainda abrir as portas para configuração e extensões dos usuários.
Para usar um back -end de armazenamento diferente do B2, você deve precisar apenas ajustar algumas variáveis de configurações no perfil de backup, bem como alguns argumentos Restic dentro restic_backup.sh .
☝ Observe que a configuração do Linux aqui assumirá uma instalação para / .
Hoje em dia, muitas distribuições Linux usam o Systemd, que apresenta um bom suporte para serviços de execução e trabalhos programados. Se a sua distribuição não estiver no SystemD, consulte a configuração do CRON.
Tl; dr configuração
make : $ sudo make install-systemd$ yay -S restic-automatic-backup-scheduler/etc/restic .restic(1) . Todos os comandos depois disso pressupõem que o perfil seja fornecido no shell atual. # source /etc/restic/default.env.sh
# restic initOnCalendar em /usr/lib/systemd/system/[email protected] .# systemctl enable --now [email protected]# journalctl -f --lines=50 -u restic-backup@default# restic snapshots# systemctl enable --now [email protected]default.env.sh e usar o nome do perfil definido no lugar do default para executar backups ou habilitar temporizadores. Observe que o valor após @ funciona como um parâmetro. # systemctl enable restic-backup@other_profile.timer ☝ Observe que a configuração do MacOS aqui assumirá uma instalação de cervejas domésticas no local padrão recomendado. Este é $HOMEBREW_PREFIX ( brew --prefix ), que é /usr/local no Intel Macs e /opt/homebrew no Apple Silicon.
Launchd é o moderno agendador de serviços interno no macOS. Possui suporte para serviços de execução como root (daemon) ou como usuário normal (agente). Aqui, configuramos um LaunchAgent para ser executado como seu usuário normal para iniciar backups regulares.
Tl; dr configuração
$ brew install erikw/tap/restic-automatic-backup-schedulermake : $ make PREFIX=$(brew --prefix) install-launchagent$(brew --prefix)/etc/restic .restic(1) . Todos os comandos depois disso pressupõem que o perfil seja fornecido no shell atual. $ source $(brew --prefix)/etc/restic/default.env.sh
$ restic initOnCalendar em~/Library/LaunchAgents/homebrew.mxcl.restic-automatic-backup-scheduler.plist .make instalar: ~/Library/LaunchAgents/com.github.erikw.restic-backup.plist .$ brew services start restic-automatic-backup-schedulermake a instalação: $ launchctl bootstrap gui/ $UID ~ /Library/LaunchAgents/com.github.erikw.restic-backup.plist
$ launchctl enable gui/ $UID /com.github.erikw.restic-backup
$ launchctl kickstart -p gui/ $UID /com.github.erikw.restic-backup$ make activate-launchagent-backup .$ tail -f ~ /Library/Logs/restic/backup *$ restic snapshots$ brew services start restic-automatic-backup-scheduler-checkmake a instalação: $ launchctl bootstrap gui/ $UID ~ /Library/LaunchAgents/com.github.erikw.restic-check.plist
$ launchctl enable gui/ $UID /com.github.erikw.restic-check
$ launchctl kickstart -p gui/ $UID /com.github.erikw.restic-check$ make activate-launchagent-check .Em seguida, controle o serviço com Homebrew:
$ brew services start restic-automatic-backup-scheduler
$ brew services restart restic-automatic-backup-scheduler
$ brew services stop restic-automatic-backup-scheduler Se services start falhar, pode ser devido à versão anterior instalada. Nesse caso, remova a versão existente e tente novamente:
$ launchctl bootout gui/ $UID /com.github.erikw.restic-backup
$ brew services start restic-automatic-backup-scheduler Use o comando disable para pausar temporariamente o agente ou bootout para desinstalá -lo.
$ launchctl disable gui/$UID/com.github.erikw.restic-backup
$ launchctl bootout gui/$UID/com.github.erikw.restic-backup
Se você atualizou o arquivo .plist , precisará emitir o bootout seguido pelo bootrstrap e enable os subcomandos do launchctl . Isso garantirá que o arquivo seja recarregado corretamente.
O Windows vem com um agendador de tarefas embutido chamado ScheduledTask. O aplicativo front -end é "Agendador de tarefas" ( taskschd.msc ) e podemos usar comandos PowerShell para instalar uma nova tarefa agendada.
Eu descrevo aqui uma das maneiras de maio que você pode obter restos e esse script de backup funcionando no Windows. Aqui eu escolhi trabalhar com scoop e git-bash .
Tl; dr configuração
pwsh deve ser instalado para poder executar o PowerShell em scripts de Shebang. powershell> scoop install restic make git pwsh powershell> git-bash
git-bash$ mkdir ~/src && cd ~/src/
git-bash$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $(basename "$_" .git) git-bash$ make install-schedtask/etc/restic . git-bash$ vim /etc/restic/*default.env.sh você poderia ter export RESTIC_BACKUP_PATHS= ' /c/Users/<username>/My Documents 'restic(1) . Todos os comandos depois disso pressupõem que o perfil seja fornecido no shell atual. git-bash$ source /etc/restic/default.env.sh
git-bash$ restic init git-bash$ restic_backup.sh git-bash$ restic snapshotstaskschd.msc )restic_backup e clique em "Executar".make install-schedtask : basta fechar e iniciá-lo novamente para atualizar.restic_backup.sh , e na próxima vez que o cronograma configurado acertar! Com taskschd.msc você pode iniciar, parar, excluir e configurar as tarefas programadas para o seu gosto:
☝ Observe que existem muitas implementações diferentes do CRON por aí e todas elas funcionam um pouco diferentes.
Qualquer sistema que possua um sistema semelhante ao cron também pode configurar facilmente backups Restic. No entanto, se você suportar uma das configurações anteriores, elas são recomendadas sobre o Cron, pois fornecem mais recursos e confiabilidade para seus backups.
Tl; dr configuração
$ sudo make install-cron/etc/cron.d/ . Se não for esse o caso, basta copiar o conteúdo relevante do /etc/cron.d/restic instalado para o seu /etc/crontab . # grep " ^@.*restic_ " /etc/cron.d/restic >> /etc/crontab/etc/restic .restic(1) . Todos os comandos depois disso pressupõem que o perfil seja fornecido no shell atual. # source /etc/restic/default.env.sh
# restic init # restic_backup.sh# restic snapshots/etc/cron.d/restic (ou /etc/crontab ).
Esta é uma explicação mais detalhada do que as seções TL; DR acima que lhe darão mais compreensão na configuração. Esta seção é mais geral, mas usa o Linux + Systemd como a configuração de exemplo.
$ git clone https://github.com/erikw/restic-automatic-backup-scheduler.git && cd $( basename " $_ " .git )Faça uma rápida pesquisa e substituição nos arquivos de origem:
$ find bin etc usr Library ScheduledTask -type f -exec sed -i.bak -e ' s|{{ INSTALL_PREFIX }}||g ' {} ; -exec rm {}.bak ;E agora você deve ver que todos os arquivos foram alterados como por exemplo
- export RESTIC_PASSWORD_FILE="{{ INSTALL_PREFIX }}/etc/restic/pw.txt"
+ export RESTIC_PASSWORD_FILE="/etc/restic/pw.txt" Por que? O TL específico do SO; as configurações de DR, acima de tudo, usam o Makefile ou um gerenciador de pacotes para instalar esses arquivos. A sequência de espaço reservado {{ INSTALL_PREFIX }} está nos arquivos de origem por motivos de portabilidade, para que o Makefile possa suportar todos os diferentes sistemas operacionais. make os usuários podem definir um $PREFIX diferente ao instalar como PREFIX=/usr/local make install-systemd .
Nesta configuração manual detalhada, copiaremos todos os arquivos manualmente para /etc e /bin . Assim, precisamos remover a sequência de espaço reservado {{ INSTALL_PREFIX }} nos arquivos de origem como uma primeira etapa.
Resumidamente:
Primeiro, consulte este tutorial oficial do BackBlaze sobre Restic e siga as instruções ("Crie uma conta backblaze com B2 ativado") sobre como criar um novo balde B2. Em geral, você deseja um balde privado, sem criptografia B2 (Restic faz o lado do cliente de criptografia para nós) e sem o recurso de bloqueio do objeto.
Para que o Restic possa se conectar ao seu balde, você deseja nas configurações B2, crie um par de KeyId e ApplicationKey. É uma boa ideia criar um par separado de ID e chave para cada balde que você usará, com acesso limitado a leitura e gravação apenas a esse balde.
Coloque esses arquivos em /etc/restic/ :
_global.env.sh : Preencha este arquivo com suas configurações globais, incluindo B2 KeyId & ApplicationKey.default.env.sh : Este é o perfil padrão. Preencha isso com o nome do balde, caminhos de backup e política de retenção. Este arquivo fontes _global.env.sh e, portanto, é independente e pode ser adquirido no shell quando você deseja emitir alguns comandos restic manuais. Por exemplo: $ source /etc/restic/default.env.sh
$ restic snapshots # You don't have to supply all parameters like --repo, as they are now in your environment!pw.txt : Este arquivo deve conter a senha Restic (linha única) usada para criptografar o repositório. Esta é uma nova senha o que em breve será usado ao inicializar o novo repositório. Deve ser exclusivo para este repositório de backup Restic e é necessário para restaurar dele. Não reutilize sua senha de login B2, isso deve ser diferente. Por exemplo, você pode gerar uma senha de 128 caracteres (deve estar em uma linha) com: $ openssl rand -base64 128 | tr -d ' n ' > /etc/restic/pw.txtbackup_exclude.txt : lista de padrões de arquivo a serem ignorados. Isso reduzirá o tamanho do seu backup e a velocidade do backup quando for feito corretamente! Agora devemos inicializar o repositório na extremidade remota:
$ sudo -i
# source /etc/restic/default.env.sh
# restic init Coloque este arquivo em /bin :
restic_backup.sh : um script que define como executar o backup. A intenção é que você não precise editar esse script, mas ser capaz de controlar tudo a partir dos perfis *.env.sh . Restic Support exclui arquivos. Eles listam caminhos de padrões de arquivo para excluir de seus backups, arquivos que apenas ocupam espaço de armazenamento, tempo de backup, rede e dinheiro. restic_backup.sh permite alguns arquivos de exclusão diferentes.
/etc/restic/backup_exclude.txt - Lista de exclusão global. Você pode usar apenas este se sua configuração for fácil. Isso é definido em _global.env.sh . Se você precisar de um arquivo diferente para outro perfil, poderá substituir o ENVVAR RESTIC_BACKUP_EXCLUDE_FILE neste perfil..backup_exclude.txt por caminho de backup. Se você tiver por exemplo, um disco USB montado em/mnt/mídia e esse caminho estiver incluído no $RESTIC_BACKUP_PATHS , você pode colocar um arquivo /mnt/media/.backup_exclude.txt e ele será retomado automaticamente. O bom sobre isso é que os caminhos de backup são independentes em termos do que eles excluem! Agora veja se o backup em si funciona, executando como raiz
# source /etc/restic/default.env.sh
# /bin/restic_backup.sh Como o default.env.sh já é adquirido no seu shell de raiz, agora você pode listar o instantâneo
# restic snapshots Como alternativa, você pode montar os instantâneos Restic em um conjunto de diretórios /mnt/restic
# restic mount /mnt/restic
# ls /mnt/restic Todas as configurações do sistema operacional diferem em que agendador de tarefas eles usam. Como demonstração, vejamos como podemos fazer isso com o Systemd Under Linux aqui.
Coloque esses arquivos em /etc/systemd/system (observe que o Makefile é instalado como pacote para /usr/lib/systemd/system )
[email protected] : um serviço que chama o script de backup com o perfil especificado. O perfil é especificado pelo valor após @ ao executá -lo (veja abaixo).[email protected] : um temporizador que inicia o backup anterior todos os dias (o mesmo sobre o perfil aqui).OnCalendar no arquivo.Agora simplesmente habilite o cronômetro com:
# systemctl enable --now [email protected]Você pode ver quando seu próximo backup está programado para executar com
# systemctl list-timers | grep resticE veja o status de um backup atualmente em execução com:
# systemctl status restic-backupOu inicie um backup manualmente:
$ systemctl start restic-backup@defaultVocê pode acompanhar a saída de backup ao vivo à medida que o backup está sendo executado:
$ journalctl -f -u [email protected] (Pule -f para ver todos os backups que foram executados)
De vez em quando, pode ser bom fazer uma verificação de saúde do repositório remoto, para garantir que não esteja sendo corrompido. Isso pode ser feito com $ restic check .
Existem scripts complementares, serviço e temporizador ( *check* ) para restic-backup.sh que verifica o backup Restic para erros; Procure no repositório em usr/lib/systemd/system/ e bin/ e copie o que você precisa nos locais correspondentes.
# systemctl enable --now [email protected] 
Para ter trabalhos de backup diferentes com por exemplo, baldes diferentes, caminho de backup do cronograma, basta fazer uma cópia do default.env.sh e usar o nome de perfil definido no lugar do default nas etapas anteriores.
Para criar um backup e uso diferente, você pode fazer:
# cp /etc/restic/default.env.sh /etc/restic/other.env.sh
# vim /etc/restic/other.env.sh # Set backup path, bucket etc.
# source /etc/restic/other.env.sh
# restic_backup.sh Quando ativado, ele gravará em um arquivo de log CSV as estatísticas após cada backup. Pode ser ativado por descomentar sua variável Env ( RESTIC_BACKUP_STATS_DIR ) no arquivo de ambiente global ou definindo -o em um perfil específico.
O log de estatísticas (e também) as notificações de desktop incorrem em uma série adicional de restic snapshots e restic diff . Essa execução é compartilhada com as notificações (sem execução extra).

É uma boa ideia estar no topo de seus backups para garantir que eles não aumentem muito em tamanho e incorrem altos custos. No entanto, é notoriamente complicado fazer as notificações da GUI corretamente a partir de um processo não usuário (por exemplo, raiz).
Portanto, este projeto fornece uma solução leve para notificações de desktop que funcionam assim: basicamente restic_backup.sh anexará uma linha de resumo do último backup a um arquivo de propriedade do usuário (o usuário que executa o ambiente de desktop do seu sistema operacional) de maneira incêndica e esquecida. Em seguida, o usuário possui um processo que lê isso e encaminhe cada linha como uma nova mensagem para o ambiente de desktop em uso.
Para definir notificações de desktop:
$ mkfifo /home/user/.cache/notification-queue/etc/restic/default.sh , set: RESTIC_BACKUP_NOTIFICATION_FILE=/home/user/.cache/notification-queueQueremos estar cientes de quando o backup automático falhar, para que possamos corrigi -lo. Como meu laptop não executa um servidor de email, fui uma solução para configurar meu laptop para poder enviar e -mails com o Postfix pelo meu Gmail. Siga as instruções ali.
Coloque este arquivo em /bin :
systemd-email : envia email usando sendmail (1). Esse script também apresenta tempo limite para não enviar spam para servidores do Gmail e ter minha conta bloqueada. Coloque este arquivo em /etc/systemd/system/ :
[email protected] : Um serviço que pode notificá-lo por e-mail quando um serviço Systemd falha. Edite o endereço de email de destino neste arquivo e substitua ou remova {{ INSTALL_PREFIX }} de acordo com a sua instalação. Agora edit /usr/lib/systemd/system/[email protected] e /usr/lib/systemd/system/[email protected] para chamar essa falha de serviço.
OnFailure=status-email-user@%n.service
Use bin/cron_mail : um invólucro para executar trabalhos de cron, que envia a saída do trabalho como um email usando o comando Mail (1). Isso pressupõe que o programa mail esteja configurado corretamente no sistema para enviar emails.
Para usar isso, envolva o comando Restic Script com ele em seu arquivo cron como:
- @midnight root . /etc/restic/default.sh && restic_backup.sh
+ @midnight root . /etc/restic/default.sh && cron_mail restic_backup.shPara um laptop, pode fazer sentido não fazer backups pesados quando você está em uma conexão medida como uma conexão compartilhada do seu telefone celular. Para resolver isso, podemos configurar um serviço Systemd que está no estado de sucesso somente quando uma conexão não é determinada. Então podemos dizer ao nosso serviço de backup para depender deste serviço simplesmente! Quando o serviço não medido detectar uma conexão não mediada, ele será destinado ao estado fracassado. Em seguida, nosso serviço de backup não será executado, pois exige que esse outro serviço seja no estado de sucesso.
[email protected] e [email protected] para exigir que o novo serviço esteja no estado de sucesso: Requires=nm-unmetered-connection.service
After=nm-unmetered-connection.service
/etc/systemd/system/ :nm-unmetered-connection.service : Um serviço que está no estado de sucesso somente se a conexão não for concluída./bin :nm-unmetered-connection.sh : detecta conexões medidas e retorna um código de erro se for detectado. Esses scripts exigem que o Gnome NetworkManager seja instalado (modifique esse script se o seu sistema tiver um gerenciador de rede diferente).# systemctl daemon-reload ☝ Dica : todas as etapas, exceto a primeira, podem ser feitas de uma só vez se você usar o Makefile. Defina $PREFIX conforme necessário ou deixe vazio para instalar / .
sudo bash -c ' export PREFIX=
make build/usr/lib/systemd/system/nm-unmetered-connection.service
install -m 0644 build/usr/lib/systemd/system/nm-unmetered-connection.service $PREFIX/etc/systemd/system
install -m 0555 bin/nm-unmetered-connection.sh /bin
systemctl daemon-reload
' Por conveniência, há um script de wrapper restic que torna os perfis de carregamento e a execução do Restic diretamente (ele precisa correr com o Sudo para ler o ambiente). Apenas corra:
sudo resticw WHATEVER (por exemplo, sudo resticw snapshots ) para usar o perfil padrão.resticw -p anotherprofile snapshots .restic Like --diff-latest Option.Comandos úteis:
| Comando | Descrição |
|---|---|
resticw snapshots | Liste instantâneos de backup |
resticw diff <snapshotId-1> <snapshotId-2> | Mostre as mudanças entre instantâneos de backup |
resticw stats / resticw stats snapshotId ... | Mostre as estatísticas para todo o repositório ou os instantâneos especificados |
resticw mount /mnt/restic | Monte seu repositório remoto |
resticw --diff-latest | Mostre as últimas alterações no instantâneo: executa restic diff depois de encontrar os 2 últimos instantâneos |
Existe um alvo make para remover todos os arquivos (scripts e configurações) que foram instalados pelo sudo make install-* . Apenas corra:
$ sudo make uninstall A melhor maneira de depurar o que está acontecendo é executar o script restic_backup.sh com a função de rastreamento de Bash. Você pode ativá -lo executando o script com bash -x :
$ source /etc/restic/default.env.sh
$ bash -x /bin/restic_backup.sh
Para depurar partes menores do script de backup, insira essas linhas na parte superior e inferior das partes relevantes do código, por exemplo:
set -x
exec 2> /tmp/restic-automatic-backup-scheduler.log
< code to debug >
set +xe depois inspecione os resultados como
$ less /tmp/restic-automatic-backup-scheduler.log
$ tail -f /tmp/restic-automatic-backup-scheduler.log # or follow output like this.Makefile , basta instalar para um $PREFIX como $ PREFIX=/tmp/restic-test make install-systemdresticw : se você atualizar o DOC de uso, precisará atualizar o analisador gerado automaticamente: $ pip install doctopt.sh
$ doctopt.sh usr/local/bin/resticwPara fazer um novo lançamento:
$ vi CHANGELOG.md && git commit -am " Update CHANGELOG.md "
$ git tag vX.Y.Z
$ git push && git push --tags