Tarsnap

Es gilt wie immer folgender Spruch: Kein Backup - kein Mitleid!

Ich habe mich deshalb für Tarsnap entschieden.

Nachdem man sich auf der Webseite ein Konto angelegt hat, wird auf dem Host der offizielle Client installiert:

cd /usr/ports/sysutils/tarsnap
make install clean

Danach wird ein Blick in die /usr/local/etc/tarsnap.conf geworfen, und sichergestellt das der Ort für das keyfile und des cachedirs passt.

Und nun sollte man sich ein keyfile erstellen:

tarsnap-keygen \
    --keyfile /root/tarsnap-machine.key \
    --user user@example.org \
    --machine machine
Backup vom Backup!

Diesen Key sollte man sich unbedingt irgendwo anders speichern, sonst kommt man nicht mehr an das Backup ran!

Ausdrucken, USB-Stick im Bankschließfach, irgendwas anderes kreatives …

Sollte man in der Firewall den ausgehenden Traffic filtern, so muss man sich dazu ein Loch bohren:

  • Outbound TCP Traffic auf Port 9279 erlauben

Die Netzwerk Dokumentation hat genaueres dazu.

Grundlegende Befehle

Archiv erzeugen:

tarsnap -c \
    -f name-$(date "+%Y-%m-%d_%H-%M-%S") \
    /what/to/backup

Vorhandene Archive einsehen:

tarsnap --list-archives | sort

Ein Archiv löschen:

tarsnap -d \
    -f name-YYYY-mm-dd_HH-MM-SS

Inhalt eines Archivs anzeigen lassen:

tarsnap -tv \
    -f name-YYYY-mm-dd_HH-MM-SS

Ein Archiv wiederherstellen:

mkdir -p /tmp/restore
cd /tmp/restore

tarsnap -x \
    -f name-YYYY-mm-dd_HH-MM-SS

Who needs backups, if you can have restore?

Tarsnapper

Meine Motivation auf Dauer eine ganze Menge wirrer Shell-Scripte zu pflegen ist recht gering. Einfache Dinge gehen noch, aber dann noch ein Generationenprinzip zu implementieren ist mir zu aufwändig.

Nach ein länglicher Recherche und Querlesen von Code habe ich mich für Tarsnapper entschieden.

Das gibt es in den Ports - solange Python 2 noch die Standard Version auf FreeBSD ist nutze ich diese (gibt auch einen Port für Python 3):

cd /usr/ports/sysutils/py-tarsnapper
make install clean

Die Konfiguration dazu habe ich unter /usr/local/etc/tarsnapper.yaml abgelegt und schaut in etwa so aus:

deltas: 1d 7d 30d

target: /machine/$name-$date

jobs:

  etc:
    sources:
      - /etc
      - /usr/local/etc
    excludes:
      - /etc/defaults

  fixed:
    source: /tmp/tarsnap-fixed
    exec_before: |
      /bin/mkdir -p             /tmp/tarsnap-fixed;
      /bin/cat /etc/fstab >     /tmp/tarsnap-fixed/fstab;
      /sbin/dmesg >             /tmp/tarsnap-fixed/dmesg;
      /sbin/gpart show >        /tmp/tarsnap-fixed/gpart_show;
      /sbin/zfs list >          /tmp/tarsnap-fixed/zfs_list;
      /sbin/zfs mount >         /tmp/tarsnap-fixed/zfs_mount;
      /sbin/zpool list >        /tmp/tarsnap-fixed/zpool_status;
    exec_after: /bin/rm -rf     /tmp/tarsnap-fixed;

  db-jail:
    source: /tmp/tarsnap-db-jail
    exec_before: |
      /bin/mkdir -p             /tmp/tarsnap-db-jail;
      /usr/sbin/jexec -U postgres database pg_dumpall > \
                                /tmp/tarsnap-db-jail/dump-jail.sql;
    exec_after: /bin/rm -rf     /tmp/tarsnap-db-jail;

Ist ein Serviervorschlag, und kann nach Belieben angepasst werden.

  • etc Job: Einfach nur die Konfigurationen - Nothing special there

  • fixed Job: Die FreeBSD Handbuchseite zu Backups empfiehlt, ein paar grundlegende Daten zur Recovery bereit zu halten:

    • Partitionslayout
    • Mountpoints
    • Genutzte Treiber
    • … alles was hilfreich zur Systemwiederherstellung ist

    Die exec_before und exec_after Direktiven werden laut Quellcode direkt an eine Shell weitergeleitet. Damit alles lesbar bleibt nutze ich einen Block Skalar (|).

    Ich habe konsequent volle Pfade für die Befehle genutzt, damit es keine Probleme gibt, wenn das ganze in der Crontab läuft.

  • db-jail Job: Habe PostgreSQL innerhalb einer Jail am laufen. Ein Backup von Datenbanken im Betrieb empfiehlt sich nicht, also nutze ich pg_dumpall um alles zu exportieren.

    Um von außen an die Jail ranzukommen nutze ich jexec.

Als letzten Schritt wird das ganze noch in die Crontab geworfen:

23 5 * * * /usr/local/bin/tarsnapper -c /usr/local/etc/tarsnapper.yaml -q - make