Ferramentas

Borg como solução de backup.

Launchd para criação de backups periódicos

Passos

  • Criar um repositório do Borg: Será armazenado nesse diretório todos os backups feitos e seus snapshots incrementais.
    • borg init -e=repokey ~/home-backup
  • (opcional) Exclusão / Inclusão de arquivos no backup: Pode-se criar um arquivo para incluir ou excluir arquivos ou diretórios do backup.
  • Comando para criar os backups:
    • borg create --progress --stats --patterns-from ~/borg-backup-home.lst ~/home-backup::'{now}'
  • Listando os backups:
    • borg list ~/home-backup
  • Compactando os backups: Rode o seguinte comando para compactar os backups eliminando segmentos não utilizados.
    • borg compact /Users/my-user/home-backup
  • Prune os backups: Para limpeza dos backups antigos ou repetidos, pode-se usar o comando prune:
    • borg prune --keep-within=2d --keep-daily=7 --keep-weekly=8 --keep-monthly=12 --keep-yearly=3 ~/home-backup
    • A explicação desse comando pode ser vista em Explicação do comando prune
  • (opcional) Sync do backup para um bucket: Para enviar para a nuvem, pode usar um serviço do tipo “Google Drive” / “Dropbox” ou subir em um bucket. Exemplo:
    • gsutil rsync -d ~/home-backup gs://my-bucket
  • Automatizar backup e sync: No OsX (Mac), pode-se usar o Launchd para realizar o backup periodicamente. Para isso

Outros

Shell para backup

Pode-se guarda-lo em ~/borg-home-backup.sh

#!/usr/bin/env bash
 
BORG_PASSPHRASE='my-passprase' /opt/homebrew/bin/borg create --progress --stats --patterns-from /Users/my-user/borg-backup-home.lst /Users/my-user/home-backup::'{now}'
BORG_PASSPHRASE='my-passprase' /opt/homebrew/bin/borg prune --keep-daily=5 --keep-weekly=14 --keep-monthly=4 --keep-yearly=12 /Users/my-user/home-backup
BORG_PASSPHRASE='my-passprase' /opt/homebrew/bin/borg compact /Users/my-user/home-backup
 
echo "Syncing to GCP Bucket"
 
/Users/my-user/google-cloud-sdk/bin/gsutil rsync -d ~/home-backup gs://my-backup-bucket

Arquivo launchd para macosx

Crie o arquivo abaixo que periodicamente o shell ~/borg-home-backup.sh

Este serviço é programado para iniciar em quatro momentos diferentes no decorrer do dia, especificamente às 10:00, 13:00, 18:00 e 20:00.

Além disso, qualquer saída padrão ou erro gerado pelo serviço será redirecionado para dois arquivos diferentes localizados no diretório “/tmp”, nomeados como “com.alisson.borg.out” e “com.alisson.borg.err”, respectivamente.

Pode-se guarda-lo em ~/Library/LaunchAgents/com.alisson.borg.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.alisson.borg</string>
 
        <key>ProgramArguments</key>
        <array>
            <string>/Users/my-user/borg-home-backup.sh</string>
        </array>
 
        <key>StartCalendarInterval</key>
        <array>
            <dict>
                <key>Hour</key>
                <integer>10</integer>
                <key>Minute</key>
                <integer>0</integer>
            </dict>
            <dict>
                <key>Hour</key>
                <integer>13</integer>
                <key>Minute</key>
                <integer>0</integer>
            </dict>
            <dict>
                <key>Hour</key>
                <integer>18</integer>
                <key>Minute</key>
                <integer>0</integer>
            </dict>
            <dict>
                <key>Hour</key>
                <integer>20</integer>
                <key>Minute</key>
                <integer>0</integer>
            </dict>
        </array>
 
        <key>StandardOutPath</key>
        <string>/tmp/com.alisson.borg.out</string>
        <key>StandardErrorPath</key>
        <string>/tmp/com.alisson.borg.err</string>
    </dict>
</plist>
 

Arquivo para exclusão / inclusão

Pode-se guarda-lo em ~/borg-backup-home.lst

R /Users/my-user/

# Any inside dir...
- **/cache
- **/cache-chat
- **/.git
- **/node_modules

# Emacs temp
- **/*~
- **/\#*

# borg backup script (it has passphrase)
- /Users/my-user/borg-home-backup.sh

# Dirs from home
- /Users/my-user/.docker
- /Users/my-user/.pyenv
- /Users/my-user/.nuget
- /Users/my-user/.nvm
- /Users/my-user/.npm
- /Users/my-user/.vscode
- /Users/my-user/.local

- /Users/my-user/Applications
- /Users/my-user/javasharedresources
- /Users/my-user/nltk_data
- /Users/my-user/google-cloud-sdk
- /Users/my-user/go
- /Users/my-user/confluent
- /Users/my-user/home-backup # backup itself
- /Users/my-user/Library

# Personal workspace temp dir (trash things...)
- /Users/my-user/wo/personal/temp

# dirs with data from kafka (messages in files)
- **/kafka-consumer/data-*

Explicação do comando prune

Exemplo: borg prune --keep-within=2d --keep-daily=7 --keep-weekly=8 --keep-monthly=12 --keep-yearly=3 ~/home-backup

Explicação:

Este comando é usado para podar (ou seja, excluir) backups antigos.

Aqui está o que cada opção faz:

--keep-within=2d: Mantém todos os backups feitos dentro dos últimos 2 dias (48h). --keep-daily=7: Mantém um backup diário pelos últimos 7 dias. --keep-weekly=8: Mantém um backup semanal pelas últimas 8 semanas. --keep-monthly=12: Mantém um backup mensal pelos últimos 12 meses. --keep-yearly=3: Mantém um backup anual pelos últimos 3 anos.

O último argumento ~/home-backup é o diretório que contém os backups.

Portanto, este comando irá excluir todos os backups que não se enquadrem nessas regras.