Module 8 · 8.2
Back-ups met restic
Module 8: Back-ups en bewaking · Leestijd: 12 minuten
Leerdoel: Na deze les kun je met restic versleutelde back-ups maken naar opslag buiten je server, oude versies opruimen volgens een bewaarschema, de back-up controleren en bestanden terugzetten, en het geheel automatisch laten draaien.
Kernbegrippen: restic, repository, init, wachtwoord(bestand), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplicatie, append-only, systemd-timer
Waarom restic?
Er zijn veel back-upprogramma's. restic is een goede keus voor een eigen server, omdat het:
- alles versleutelt voordat het de server verlaat; de opslag ziet alleen onleesbare blokken;
- dedupliceert: een bestand dat niet veranderd is, wordt niet opnieuw opgeslagen, dus dagelijkse back-ups kosten weinig ruimte;
- veel soorten opslag kent: een map, een andere server via SFTP, S3-compatibele opslag, een eigen rest-server;
- één programma is, in de pakketbron van Debian en Ubuntu (
apt install restic).
Een alternatief met vergelijkbare eigenschappen is BorgBackup. De principes uit deze les gelden daar ook.
De begrippen
- Repository: de plek waar restic de back-ups opslaat. Altijd buiten de server die je back-upt.
- Snapshot: één back-up op één moment. (Let op: dat is een ander ding dan de snapshot van je aanbieder uit les 8.1.)
- Wachtwoord: elke repository heeft een wachtwoord waarmee alles versleuteld wordt. De documentatie van restic is daar duidelijk over: wie het wachtwoord kwijt is, is de gegevens onherroepelijk kwijt.
Een repository maken
Stel je hebt een opslagserver backup.example.net waar je via SFTP met een sleutel bij kunt, als gebruiker web1. Maak eerst een wachtwoordbestand op de server (en bewaar hetzelfde wachtwoord in je wachtwoordmanager, les 8.1):
root@web1:~# install -m 600 /dev/null /root/.restic-wachtwoord
root@web1:~# openssl rand -base64 32 > /root/.restic-wachtwoord
root@web1:~# export RESTIC_REPOSITORY=sftp:web1@backup.example.net:/srv/restic/web1
root@web1:~# export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
root@web1:~# restic init
created restic repository 5f1a9c2e3b at sftp:web1@backup.example.net:/srv/restic/web1
Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.Met de omgevingsvariabelen RESTIC_REPOSITORY en RESTIC_PASSWORD_FILE hoef je de opties -r en --password-file niet elke keer te typen.
Een back-up maken
Eerst de databasedump (les 8.1), dan de back-up:
root@web1:~# restic backup /etc /var/www /opt /var/backups/db \
--exclude /var/www/*/cache --tag dagelijks
repository 5f1a9c2e opened (version 2, compression level auto)
...
Files: 8421 new, 0 changed, 0 unmodified
Dirs: 1203 new, 0 changed, 0 unmodified
Added to the repository: 612.338 MiB (402.117 MiB stored)
processed 8421 files, 1.204 GiB in 0:41
snapshot 3c7e91d4 savedDe volgende dag is hij veel sneller: alleen wat veranderde, gaat mee.
root@web1:~# restic snapshots
ID Time Host Tags Paths
-----------------------------------------------------------------------
3c7e91d4 2026-11-08 03:10:02 web1 dagelijks /etc /opt /var/backups/db /var/www
a18f0b77 2026-11-09 03:10:05 web1 dagelijks /etc /opt /var/backups/db /var/www
-----------------------------------------------------------------------
2 snapshotsOpruimen: forget en prune
Elke dag een snapshot erbij betekent na een jaar 365 snapshots. Met forget bepaal je welke je bewaart, met een bewaarschema:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneZo werkt het schema:
--keep-daily 7: kijk naar de laatste zeven dagen waarop een snapshot is, en houd per dag de nieuwste;--keep-weekly 4: idem voor de laatste vier weken (maandag tot en met zondag);--keep-monthly 6: idem voor de laatste zes maanden.
Een snapshot blijft staan als hij aan minstens één van de regels voldoet. Alles wat aan geen enkele regel voldoet, wordt vergeten. Probeer een nieuw schema eerst met --dry-run: dan zie je wat er weg zou gaan zonder dat er iets verandert.
Belangrijk verschil: forget haalt alleen de verwijzing naar een snapshot weg. De gegevens blijven in de repository staan tot prune de blokken opruimt die door geen enkele snapshot meer gebruikt worden. De optie --prune bij forget doet dat in één keer. Prune kost tijd en vergrendelt de repository; plan het daarom niet tegelijk met je back-up.
Controleren: check
Een back-up die stil beschadigd raakt, merk je pas bij het terugzetten. Laat restic de repository regelmatig controleren:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Gewoon check controleert de structuur. Met --read-data-subset leest hij ook echt een deel van de gegevens terug en controleert hij de inhoud. Doe dat bijvoorbeeld wekelijks met een paar procent; zo is na een tijd alles een keer gelezen.
Terugzetten: restore en mount
Terugzetten naar een aparte map, nooit meteen over het origineel heen:
root@web1:~# restic restore latest --target /tmp/terug --include /etc/nginx
restoring snapshot a18f0b77 of [/etc /opt /var/backups/db /var/www] at 2026-11-09 03:10:05 ...
Summary: Restored 41 files/dirs (88.104 KiB) in 0:00
root@web1:~# diff -r /tmp/terug/etc/nginx /etc/nginx && echo gelijk
gelijklatest is de nieuwste snapshot; je kunt ook een ID gebruiken (restic restore 3c7e91d4 ...). Met restic mount /mnt/restic (vereist FUSE) zie je alle snapshots als mappen en kun je rondkijken en losse bestanden kopiëren. Stoppen met Ctrl+C.
Een database zet je terug door de dump terug te halen en te importeren, bijvoorbeeld gunzip < alles.sql.gz | mariadb.
Automatisch, elke nacht
Maak een script en een systemd-timer (les 6.3). Het script:
#!/bin/sh
# /usr/local/sbin/backup.sh
set -eu
export RESTIC_REPOSITORY=sftp:web1@backup.example.net:/srv/restic/web1
export RESTIC_PASSWORD_FILE=/root/.restic-wachtwoord
mariadb-dump --single-transaction --all-databases | gzip > /var/backups/db/alles.sql.gz
restic backup /etc /var/www /opt /var/backups/db --tag dagelijks
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneEen .service met Type=oneshot en ExecStart=/usr/local/sbin/backup.sh, en een .timer met OnCalendar=*-*-* 03:10:00 en Persistent=true. set -eu zorgt dat het script stopt bij de eerste fout, zodat systemd de run als mislukt ziet. Koppel er een melding aan (les 8.3), anders merk je een mislukte back-up niet.
Tegen ransomware: append-only
In het script hierboven kan de server zelf de back-up ook wissen (forget en prune). Neemt een aanvaller de server over, dan kan hij dat dus ook. Twee manieren om dat te voorkomen:
- rest-server in append-only-modus: op de opslagserver draai je restic's eigen rest-server met de optie
--append-only. De webserver kan dan wel back-ups toevoegen, maar niets wissen. Opruimen (forget --prune) doe je vanaf een andere, goed beveiligde machine met volledige rechten. - Opslag met versiebeheer of objectvergrendeling bij een S3-aanbieder, zodat verwijderde objecten nog een tijd terug te halen zijn.
Let op een fijne valkuil die de restic-documentatie zelf noemt: een aanvaller die nep-snapshots toevoegt, kan een schema als --keep-weekly ertoe verleiden echte snapshots te vergeten. Met --keep-within (bijvoorbeeld --keep-within 30d) blijft alles uit die periode staan, nep of echt.
Samenvatting
- restic versleutelt, dedupliceert en kan naar veel soorten opslag buiten je server; het wachtwoord kwijt is alles kwijt.
initmaakt de repository,backupeen snapshot,snapshotstoont ze.forgetmet--keep-*bepaalt wat je bewaart; pasprune(of--prune) ruimt de gegevens echt op. Probeer met--dry-run.check(met--read-data-subset) controleert,restore --targetzet terug naar een aparte map,mountlaat je rondkijken.- Automatiseer met een timer en een melding, en houd minstens één repository buiten bereik van de server (append-only).
Quiz
Opdracht
Opdracht Z8.2: Wat blijft er over na forget? In het voorbeeldbestand restic-snapshots.txt staat een lijst van snapshots en een bewaarschema. Bepaal welke snapshots overblijven na restic forget met dat schema. Het programma vergelijkt met de vaste sleutel.
Opdracht O8.2: Een terugzettest. Maak op je eigen server een restic-repository buiten de server, maak een back-up van /etc en je gegevens, en zet één map terug naar /tmp/terug. Vergelijk met diff, noteer hoe lang het duurde, en beantwoord waar je wachtwoord en je opslaggegevens buiten de server bewaard zijn.
Opdracht O8.2: Een terugzettest
Deze opdracht doe je zelf; niemand kijkt hem na. Vink af wat je gedaan hebt en markeer de opdracht als gedaan.
De repository staat bij een andere partij dan de server. diff toont geen verschillen, of alleen bestanden die na de back-up veranderden. Wachtwoord in de wachtwoordmanager en op papier; een append-only kopie beschermt tegen wissen door een indringer.
Je vinkjes en aantekeningen blijven alleen in deze browser; we sturen ze nergens heen. Ben je aangemeld, dan bewaren we in Mijn cursussen alleen dat je de opdracht gedaan hebt.
Verder lezen
- Back-upstrategie: de 3-2-1-regel voor je eigen bedrijf
- restic-documentatie, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- restic-documentatie, Removing backup snapshots (forget en prune): https://restic.readthedocs.io/en/stable/060_forget.html
- restic-documentatie, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
