Backups mit Restic

Veröffentlicht von

Update 2019-05-07: Ein Beispiel für ein automatisiertes Backup mit systemd habe ich im Beitrag Restic Backup Nachtrag – Homedir beschrieben.

Seit einiger Zeit benutze ich Restic als Backuplösung. Restic bietet viele Features und ist dabei auch noch sehr einfach zu bedienen:

Beispiel Workflow

Backup Repository initialisieren

restic -r /mnt/restic-repo init
enter password for new backend:
enter password again:

created restic backend a46dddb5 at /mnt/restic-repo

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

Aktuellen Ordner zum Backup hinzufügen

restic -r /mnt/restic-repo backup .
enter password for repository:
[…]snapshot saved

Vorhandene Snapshots anzeigen

restic -r /mnt/restic-repo snapshots
enter password for repository:
repository a46dddb5 opened successfully, password is correct
ID        Time                 Host        Tags        Paths
------------------------------------------------------------------------------------------------------------
752a729c  2018-11-30 23:21:38  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
5bd4e669  2018-12-01 01:00:01  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
cda075c4  2018-12-02 01:00:01  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
f30a7535  2018-12-03 01:00:01  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
------------------------------------------------------------------------------------------------------------
4 snapshots

Statistiken ausgeben

restic -r /mnt/restic-repo stats
enter password for repository:
repository a46dddb5 opened successfully, password is correct
scanning...
Stats for all snapshots in restore-size mode:
  Total File Count:   85177
        Total Size:   2.265 GiB

Wichtig ist hier die Erklärung restore-size mode. Denn auf der Platte werden Dank De-duplikation keine 2.2 GB belegt, sondern in meinem Fall nur 1.3 GB.

root@vps06:/mnt/restic-repo# du -sh
1.3G    .
1.3G    total

Automatisieren

Mit Hilfe von weiteren Übergabeparametern oder Environment Variablen lässt sich das Ganze in einen Cron Job verpacken.

0 1 * * * root /usr/local/bin/restic -r /mnt/restic-repo backup /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5 --password-file /root/.resticpwd
10 1 * * * root /usr/local/bin/restic -r /mnt/restic-repo forget --keep-daily 7 --keep-weekly 2 --prune --password-file /root/.resticpwd

Der erste Cron Job erstellt um 01 Uhr ein Backup und der zweite Cron Job löscht um 01:10 Uhr alle ausser die mit --keep-* angegeben Backups. Das Passwort ist im --password-file hinterlegt und nur für den Benutzer root lesbar. Weitere Lösch-Policies sind möglich und werden in der dazugehörigen Doku umfangreich erklärt.

Der alltägliche Umgang lässt sich mit Environment Variablen vereinfachen.

export RESTIC_PASSWORD_FILE=/root/.resticpwd
export RESTIC_REPOSITORY=/mnt/restic-repo

Damit wird die Nachfrage des Passworts und Angabe des Repositories nicht mehr benötigt. Weitere Environment Variablen wie AWS oder Google Access Keys sind ebenfalls möglich und in der Doku gut erklärt.

Zentrales Backup

Anstatt das Backup lokal aufzubewahren, lässt es sich zu einem Server pushen. Dafür stehen verschiedene Backends wie Amazon S3, SFTP oder der restic eigene rest-server zur Verfügung. Auch beim rest-server muss das Repository erst mal initialisiert werden. Der einzige Unterschied zu den vorherigen Befehlen ist die Angabe des Repositories mit rest:$HTTP-Pfad/$REPONAME.

restic -r rest:http://192.168.1.10:8000/central init

Der Endpoint ist hier zwar mit http angegeben, jedoch werden die Daten, noch bevor sie auf Leitung gehen, verschlüsselt.

Backups Wiederherstellen

Es gibt zwei favorisierte Methoden, um ein Backup wiederherzustellen. Entweder das gesamte Repository wird mit Fuse im Dateisystem gemounted und man holt sich die Dateien aus dem Mountpoint raus oder stellt einen Snapshot wieder her.

Repository mounten

root@vps06:# restic -r /mnt/restic-repo mount /mnt/restic-restore
repository a46dddb5 opened successfully, password is correct
Now serving the repository at /mnt/restic-restore
Don't forget to umount after quitting!

Die Konsole wird an dem Punkt stehen bleiben und keine weitere Interaktion ermöglichen. Solange man jetzt kein Strg+C drückt, bleibt der Mountpoint erhalten. Ansonsten wird das Repository wieder aus dem Dateisystem gehangen. Eine zweite (SSH)-Session ermöglicht ein Stöbern in den Dateien und Ordnern.

root@vps06:~# tree -L 3 /mnt/restic-restore/
/mnt/restic-restore/
├── hosts
│   └── vps06
│       ├── 2018-11-30T23:21:38+01:00
│       ├── 2018-12-01T01:00:01+01:00
│       ├── 2018-12-02T01:00:01+01:00
│       ├── 2018-12-03T01:00:01+01:00
│       └── latest 2018-12-03T01:00:01+01:00
├── ids
│   ├── 5bd4e669
│   │   └── srv
│   ├── 752a729c
│   │   └── srv
│   ├── cda075c4
│   │   └── srv
│   └── f30a7535
│       └── srv
├── snapshots
│   ├── 2018-11-30T23:21:38+01:00
│   │   └── srv
│   ├── 2018-12-01T01:00:01+01:00
│   │   └── srv
│   ├── 2018-12-02T01:00:01+01:00
│   │   └── srv
│   ├── 2018-12-03T01:00:01+01:00
│   │   └── srv
│   └── latest 2018-12-03T01:00:01+01:00
└── tags
27 directories, 0 files

Snapshot wiederherstellen

Es lassen sich entweder bestimmte Snapshot IDs oder der latest Snapshot wiederherstellen.

restic -r /mnt/restic-repo snapshots
repository a46dddb5 opened successfully, password is correct
ID        Time                 Host        Tags        Paths
------------------------------------------------------------------------------------------------------------
752a729c  2018-11-30 23:21:38  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
5bd4e669  2018-12-01 01:00:01  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
cda075c4  2018-12-02 01:00:01  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
f30a7535  2018-12-03 01:00:01  vps06                   /srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5
------------------------------------------------------------------------------------------------------------
4 snapshots
restic -r /mnt/restic-repo restore 752a729c --target /tmp/restore
repository a46dddb5 opened successfully, password is correct
restoring Snapshot 752a729c of [/srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5] at 2018-11-30 23:21:38.856986592 +0100 CET by root@vps06 to /tmp/restore
restic -r /mnt/restic-repo restore latest --target /tmp/restore-latest
repository a46dddb5 opened successfully, password is correct
restoring Snapshot f30a7535 of [/srv/daemon-data/599bca04-e11d-4fb0-934a-f4ba1722adf5] at 2018-12-03 01:00:01.36941374 +0100 CET by @vps06 to /tmp/restore-latest

Fazit

Restic bietet mir mit wenigen Befehlen eine ungemeine Flexibilität und nimmt mir dabei viel Arbeit ab, weil es von sich aus schon Einiges macht. Ich kann entweder lokale Snapshots erstellen und sie später in einen S3 Bucket schieben, oder direkt rein schreiben lassen, oder ich benutze eines der anderen unterstützten Backends als z.B. zentralen Storage für all meine Server.

Mit Restic kann mein Backup auch ruhig auf dem Storage eines Freundes liegen, weil die Übertragung und Datenablage verschlüsselt statt findet und ohne einen passenden Key kein Zugriff möglich ist.

Ideal wäre jetzt noch Kompression (z.B. LZ4) um die Backupgröße nochmals zu reduzieren. Dazu gibt es auch schon ein viel diskutiertes Ticket in dem der Entwickler bekundet hat, sich Gedanken über die Implementierung zu machen.

Teile diesen Beitrag

2 Kommentare

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert