Direct naar de inhoud

Cookie-instellingen

Kies per soort welke cookies je toestaat. Je kunt je keuze altijd wijzigen via Cookie-instellingen onderaan elke pagina. Privacyverklaring

Noodzakelijk

Altijd aan

Nodig om in te loggen, je winkelwagen te bewaren en je keuzes te onthouden. Deze staan altijd aan.

Welke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: je sessie en ingelogd blijven
  • weboke_basket: je winkelwagen
  • wkBtwIncl: prijzen met of zonder btw tonen
  • wok_cookies: je cookiekeuze, 12 maanden

Meet welke advertentie tot een bezoek of bestelling leidt, zodat we niet betalen voor advertenties die niets doen.

Welke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), tot 90 dagen
  • OpenAI Ads, advertenties in ChatGPT
  • wok_aff: via welke partner je bij ons kwam (affiliateprogramma), 60 dagen

4,6

Land en taal

Elk land heeft zijn eigen site, met prijzen en btw van dat land.

Bekijken

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 saved

De 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 snapshots

Opruimen: 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 --prune

Zo 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
gelijk

latest 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 --prune

Een .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.
  • init maakt de repository, backup een snapshot, snapshots toont ze.
  • forget met --keep-* bepaalt wat je bewaart; pas prune (of --prune) ruimt de gegevens echt op. Probeer met --dry-run.
  • check (met --read-data-subset) controleert, restore --target zet terug naar een aparte map, mount laat je rondkijken.
  • Automatiseer met een timer en een melding, en houd minstens één repository buiten bereik van de server (append-only).

Quiz

1. Wat gebeurt er als je restic forget --keep-daily 7 uitvoert zonder --prune?



2. Je hebt het wachtwoord van je restic-repository alleen in /root/.restic-wachtwoord op de server staan. De server is verloren gegaan. Wat nu?



3. Waarom zet je een back-up terug naar /tmp/terug en niet meteen naar de oorspronkelijke plek?



4. Wat voegt restic check --read-data-subset=5% toe aan een gewone restic check?



5. Een aanvaller die je webserver overneemt, kan via het back-upscript ook restic forget --prune uitvoeren. Wat beschermt daartegen?



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 Z8.2: Wat blijft er over na forget?

Bestand bij deze opdracht: restic-snapshots.txt





Wat je invult en wat we vinden, slaan we niet op. Je browser onthoudt je antwoorden en of je de opdracht hebt gehaald. Ben je aangemeld, dan bewaren we alleen dat je de opdracht (bijna) goed had in Mijn cursussen; daar kun je het ook verwijderen.

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.




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

Even geduld…

Stel je domeinen in

Regel per domein de nameservers, de koppeling aan je hosting en wie de eigenaar wordt.

Je domeinen laden…