Modul 8 · 8.2
Backup med restic
Modul 8: Backup og overvågning · Læsetid: 12 minutter
Læringsmål: Efter denne lektion kan du med restic tage krypterede backups til lager uden for din server, rydde gamle versioner op efter en opbevaringsplan, kontrollere backuppen og gendanne filer, og lade det hele køre automatisk.
Centrale begreber: restic, repository, init, adgangskode(fil), backend (sftp, S3, rest-server), backup, snapshots, forget, --keep-daily/--keep-weekly/--keep-monthly, prune, check, restore, mount, deduplikering, append-only, systemd-timer
Hvorfor restic?
Der findes mange backupprogrammer. restic er et godt valg til en egen server, fordi det:
- krypterer alt, før det forlader serveren; lageret ser kun ulæselige blokke;
- deduplikerer: en fil, der ikke er ændret, gemmes ikke igen, så daglige backups fylder meget lidt;
- kender mange slags lager: en mappe, en anden server via SFTP, S3-kompatibelt lager, en egen rest-server;
- er ét program, der findes i pakkekilderne til Debian og Ubuntu (
apt install restic).
Et alternativ med lignende egenskaber er BorgBackup. Principperne fra denne lektion gælder også der.
Begreberne
- Repository: stedet, hvor restic gemmer backupperne. Altid uden for den server, du tager backup af.
- Snapshot: én backup på ét tidspunkt. (Bemærk: det er noget andet end snapshottet hos din udbyder fra lektion 8.1.)
- Adgangskode: hvert repository har en adgangskode, som alt krypteres med. restic-dokumentationen er klar på det punkt: mister du adgangskoden, mister du dataene for altid.
Opret et repository
Lad os sige, at du har en lagerserver backup.example.net, som du kan nå via SFTP med en nøgle, som brugeren web1. Opret først en adgangskodefil på serveren (og gem den samme adgangskode i din adgangskodeadministrator, lektion 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.Med miljøvariablerne RESTIC_REPOSITORY og RESTIC_PASSWORD_FILE behøver du ikke skrive indstillingerne -r og --password-file hver gang.
Tag en backup
Først databasedumpet (lektion 8.1), derefter backuppen:
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 savedNæste dag går det meget hurtigere: kun det, der er ændret, kommer med.
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 snapshotsRyd op: forget og prune
Et nyt snapshot hver dag betyder 365 snapshots efter et år. Med forget bestemmer du, hvilke du beholder, med en opbevaringsplan:
root@web1:~# restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --pruneSådan virker planen:
--keep-daily 7: se på de seneste syv dage, hvor der findes et snapshot, og behold det nyeste for hver dag;--keep-weekly 4: det samme for de seneste fire uger (mandag til og med søndag);--keep-monthly 6: det samme for de seneste seks måneder.
Et snapshot bliver bevaret, hvis det opfylder mindst én af reglerne. Alt, der ikke opfylder nogen regel, bliver glemt. Prøv en ny plan først med --dry-run: så ser du, hvad der ville forsvinde, uden at noget ændres.
Vigtig forskel: forget fjerner kun henvisningen til et snapshot. Dataene bliver i repositoryet, indtil prune rydder de blokke op, som intet snapshot længere bruger. Indstillingen --prune til forget gør det i ét hug. Prune tager tid og låser repositoryet; planlæg det derfor ikke samtidig med din backup.
Kontrollér: check
En backup, der stille og roligt bliver beskadiget, opdager du først, når du skal gendanne. Lad restic kontrollere repositoryet jævnligt:
root@web1:~# restic check
...
no errors were found
root@web1:~# restic check --read-data-subset=5%Almindelig check kontrollerer strukturen. Med --read-data-subset læser den også rent faktisk en del af dataene tilbage og kontrollerer indholdet. Gør det for eksempel ugentligt med et par procent; så er alt efter et stykke tid blevet læst én gang.
Gendan: restore og mount
Gendan til en separat mappe, aldrig direkte oven i originalen:
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 er det nyeste snapshot; du kan også bruge et ID (restic restore 3c7e91d4 ...). Med restic mount /mnt/restic (kræver FUSE) ser du alle snapshots som mapper og kan kigge rundt og kopiere enkelte filer. Stop med Ctrl+C.
En database gendanner du ved at hente dumpet tilbage og importere det, for eksempel gunzip < alles.sql.gz | mariadb.
Automatisk, hver nat
Lav et script og en systemd-timer (lektion 6.3). Scriptet:
#!/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 --pruneEn .service med Type=oneshot og ExecStart=/usr/local/sbin/backup.sh, og en .timer med OnCalendar=*-*-* 03:10:00 og Persistent=true. set -eu sørger for, at scriptet stopper ved den første fejl, så systemd ser kørslen som mislykket. Knyt en notifikation til (lektion 8.3), ellers opdager du ikke en mislykket backup.
Mod ransomware: append-only
I scriptet ovenfor kan serveren selv også slette backuppen (forget og prune). Overtager en angriber serveren, kan han altså også det. To måder at forhindre det på:
- rest-server i append-only-tilstand: på lagerserveren kører du restics egen rest-server med indstillingen
--append-only. Webserveren kan så godt tilføje backups, men ikke slette noget. Oprydning (forget --prune) gør du fra en anden, godt sikret maskine med fulde rettigheder. - Lager med versionsstyring eller objektlåsning hos en S3-udbyder, så slettede objekter kan hentes tilbage i en periode.
Pas på en lumsk faldgrube, som restic-dokumentationen selv nævner: en angriber, der tilføjer falske snapshots, kan narre en plan som --keep-weekly til at glemme ægte snapshots. Med --keep-within (for eksempel --keep-within 30d) bliver alt fra den periode stående, falsk eller ægte.
Opsummering
- restic krypterer, deduplikerer og kan gemme til mange slags lager uden for din server; mister du adgangskoden, mister du alt.
initopretter repositoryet,backupet snapshot,snapshotsviser dem.forgetmed--keep-*bestemmer, hvad du beholder; førstprune(eller--prune) rydder dataene rigtigt op. Prøv med--dry-run.check(med--read-data-subset) kontrollerer,restore --targetgendanner til en separat mappe,mountlader dig kigge rundt.- Automatisér med en timer og en notifikation, og hold mindst ét repository uden for serverens rækkevidde (append-only).
Quiz
Opgave
Opgave Z8.2: Hvad er der tilbage efter forget? I eksempelfilen restic-snapshots.txt står en liste over snapshots og en opbevaringsplan. Find ud af, hvilke snapshots der er tilbage efter restic forget med den plan. Programmet sammenligner med den faste nøgle.
Opgave O8.2: En gendannelsestest. Opret på din egen server et restic-repository uden for serveren, tag en backup af /etc og dine data, og gendan én mappe til /tmp/terug. Sammenlign med diff, notér hvor lang tid det tog, og svar på, hvor din adgangskode og dine lageroplysninger er gemt uden for serveren.
Opgave O8.2: En gendannelsestest
Denne opgave laver du selv; ingen tjekker den. Afkryds hvad du har gjort, og markér opgaven som udført.
Repositoryet ligger hos en anden udbyder end serveren. diff viser ingen forskelle eller kun filer, der er ændret efter backuppen. Adgangskoden ligger i password manageren og på papir; en append-only-kopi beskytter mod sletning foretaget af en ubuden gæst.
Dine afkrydsninger og noter forbliver kun i denne browser; vi sender dem ingen steder hen. Er du logget ind, gemmer vi kun i Mine kurser, at du har udført opgaven.
Læs mere
- Backupstrategi: 3-2-1-reglen for din egen virksomhed
- restic-dokumentationen, Preparing a new repository: https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html
- restic-dokumentationen, Removing backup snapshots (forget og prune): https://restic.readthedocs.io/en/stable/060_forget.html
- restic-dokumentationen, Restoring from backup: https://restic.readthedocs.io/en/stable/050_restore.html
- rest-server (append-only): https://github.com/restic/rest-server
- Snapshots og backups af din VPS
- VPS: fra første login til sikker server 8.1: Backup med restic til et andet sted
- VPS: fra første login til sikker server 8.2: Sådan tager du databaser og Docker-volumes korrekt med i backuppen
