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:
- Einfaches Wiederherstellen von Dateien
- Tags
- Snapshots
- De-duplication
- Mounten von Backup Repositories
- Lösch-Policies
- AES-256 verschlüsselte Übertragung und Speicherung
- Verschiedene Storage Backends (z.B. SFTP, Amazon S3, Google Cloud Storage)
- "Inkrementelle" Backups via Contend Defined Chunking
- Ausführliche Dokumentation (nicht zu unterschätzen)
- Verfügbar für Linux (auch ARM), Mac, BSD und Windows
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.
Restic nutzt keine Hardlinks zu Deduplikation 😛
Du hast natürlich recht. Ich habe das gestrichen. Hätte mir beim Format des Repositories auch auffallen können ?