Automatizando backups BTRFS, com notificações (tutorial)

A um tempo atrás mostrei como automatizar a montagem de uma partição criptografada usando um pendrive como chave:

Uma utilidade para partições assim é a realização de backups, vou mostrar como automatizar o processo e como receber notificações de falhas. Vamos:

  • fazer backups diários da partição / para a partição /mnt/HDD, com as seguintes regras de retenção:
    • manter no mínimo 4 snapshots diários em /
    • manter no máximo 7 snapshots diários em /
    • Manter 7 backups diários 4 backups semanais e 3 mensais de / em /mnt/HDD.
  • ser notificado se o backup falhar, via notificações do sistema e notificações no celular.

OBS: Apesar deste tutorial ser para partições BTRFS não vejo porque não poderia ser adaptado para qualquer sistema de arquivos ou padrões de organização de partições BTRFS de distros como Ubuntu, SUSE, etc, assim como outros apps como Snapper e TimeShift, rsync ou afins.

Vamos usar

  • btrbk para fazer os backups
  • systemd para automatizar os processos
  • notify-send para gerar notificações no sistema
  • IFTTT para enviar push notifications para seu celular

recomendação de organização das partições:

# convencione nomear snapshots como @...
/ -> subvolume @sistema
└─ @ -> subvolume raiz
   ├─ @distro -> subvolume padrão (vai montar como /)
   └─ @snapshots -> subvolume onde armazenar snapshots
      ├─ daily
      |  └─ ...
      └─ hourly
         └─ ...

/mnt/HDD
└─ @ -> subvolume raiz
   ├─ @HDD -> subvolume padrão (vai montar como /mnt/HDD)
   ├─ @snapshots -> subvolume onde armazenar backups
      ├─  ...
      └─ backups
         └─ distro

Configurando o btrbk

Em /etc/btrbk/btrbk.conf

# create snapshots daily of /

transaction_log       /var/log/btrbk.log
preserve_day_of_week  sunday

stream_buffer         500m

snapshot_dir          @snapshots/daily
snapshot_create       onchange
snapshot_preserve_min 4d
snapshot_preserve     7d

volume /@
  subvolume @distro
    target send-receive /mnt/HDD/@/@snapshots/backups/distro
      target_preserve     7d 8w 3m
      target_preserve_min no    

automatizando a criação de snapshots via systemd

Vamos criar o serviço btrbk-distro-daily.service para realizar os backups para nós e um timer btrbk-distro-daily.timer

$ sudo systemctl edit --full  "btrbk-distro-daily.service"

conteúdo

[Unit]
Description=btrbk /@/@distro daily backup
[email protected]%N.service

[Service]
Type=oneshot
ExecStart=bash -c 'nice -n 19 ionice -c3 /usr/sbin/btrbk run -c /etc/btrbk/btrbk.conf'
$ sudo systemctl edit --full  "btrbk-distro-daily.timer"

conteúdo

[Unit]
Description=btrbk daily backup of /@/@distro

[Timer]
OnCalendar=daily
AccuracySec=5min
Persistent=true

[Install]
WantedBy=multi-user.target

automatizando notificações em caso de falha

Vamos criar o serviço instanciável [email protected] para nos notificar caso o serviço btrbk-distro-daily.service falhe. Subistitua o termo %USER% pelo nome do seu usuário

$ sudo systemctl edit --full  "[email protected]"

conteúdo

[Unit]
Description= notify failures in %i.


[Service]
User=%USER%
Group=%USER%
Environment= "DISPLAY=:0" "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus" "XAUTHORITY=/home/%USER%/.Xauthority"
ExecStart=/usr/bin/notify-failure %i

OBS: Você pode tornar esse serviço mais elegante criando o mesmo em userspace. systemctl edit --user ... ou systemctl edit --global ... e specifiers %u e %g, mais detalhes na documentação das unidades systemd.

conteúdo de /usr/bin/notify-failure

#!/bin/bash

/usr/bin/notify-send -t 10000 "$1 FAILED" "Check journalctl -u $1.service"

curl -X POST -H "Content-Type: application/json" -d \
      '{"value1": "'$1' FAILED", "value2": "Check journalctl -u '$1'.service"}' \
        https://maker.ifttt.com/trigger/notify/with/key/SUA_KEY

configurando IFTTT

  1. Crie uma conta em https://ifttt.com/ e instale o app indicado durante a criação da conta e logue em seu celular na mesma conta pelo app.
  2. No topo da página clique em create.
  3. Em if this procure e selecione webhooks.
  4. Selecione Receive a web request e em Event Name, coloque notify.
  5. Clique em Create trigger.
  6. Em Then That procure e selecione Notification
  7. Selecione Sent a notification from the IFTTT app.
  8. em Message coloque
{{Value1}} - {{OccurredAt}}
{{Value2}}
  1. Clique em Create action
  2. Clique em Continue e de o nome que quiser ao applet
  3. Clique em Finish e pronto.

Você consegue sua key para a URL em https://ifttt.com/maker_webhooks clicando em Documentation.

5 curtidas