Skapa säkerhetskopior med objektlagring och Restic

Introduktion

I dagens digitala samhälle är data en av våra mest värdefulla tillgångar, både för den enskilda individen och företaget. Vi vet alla hur viktigt det är med säkerhetskopiering, men trots det saknas det ofta en säker och tillförlitlig backup-lösning. En del har kanske externa hårddiskar eller en liten NAS hemma – men vad spelar det för roll vid stöld eller brand?

In kommer Restic, ett modernt backup-verktyg, som låter oss göra krypterade säkerhetskopior. Programmet som är helt gratis och bygger på öppen källkod, använder även en teknik som kallas deduplicering, vilket innebär att endast unik data kommer att lagras i säkerhetskopian. Detta hjälper oss att hålla nere storleken på säkerhetskopiorna. Sedan version 0.14.0 har Restic även stöd för komprimering. Dessutom får vi full historik över arkivet. Varje ny säkerhetskopia blir en ny snapshot. Det innebär att vi kan återskapa vår data som den såg ut för tre månader sen – eller kanske hela två år sedan.

Låt oss nu komma igång!

Förutsättningar


Vi behöver någonstans att lagra datan och i den här guiden har vi valt att använda GleSYS Objektlagring. Då får vi en säkerhetskopia som lagras off-site. Att använda Restic tillsammans med GleSYS och deras S3-kompatibla tjänst höjer säkerheten och GDPR-efterlevnaden ytterligare då ingen data lämnar Sverige. Dessutom behöver vi inte oroa oss för höga överföringskostnader när vi behöver återskapa våra filer från säkerhetskopian. Tjänsten har fri dataöverföring, fria API-anrop och vi betalar endast för lagringen. Aktuella lagringspriser finns i tjänstebeskrivningen här.

Installera Restic i Linux och macOS


Installationsförfarandet är detsamma för Linux och macOS.

Vi börjar med att ladda hem rätt utgåva av Restic från GitHub. Den senaste versionen listas överst. Under rubriken Assets väljer vi den utgåva som är för vår dator och operativsystem. Om vi exempelvis har en Intel-baserad Mac väljer vi filen vars namn slutar med darwin_amd64.bz2. Har vi istället en M1- eller M2-baserad Mac väljer vi darwin_arm64.bz2. För de flesta Linuxdistributioner som körs på en vanlig PC väljer vi filen vars namn slutar med linux_amd64.bz2. Vi laddar hem filen till Downloads-katalogen på datorn via webbläsaren.

Därefter behöver vi packa upp filen och placera den i rätt katalog på datorn. Det gör vi med följande kommandon. I exemplet nedan har vi laddat hem version 0.15.2 av Restic för Linux för vanliga PCs.

$ cd ~/Downloads
$ bunzip2 restic_0.15.2_linux_amd64.bz2
$ sudo mkdir -p /usr/local/bin
$ sudo mv restic_0.15.2_linux_amd64 /usr/local/bin/restic
$ sudo chmod +x /usr/local/bin/restic

Nu kan vi testa så att Restic fungerar:

$ restic version
restic 0.15.2 compiled with go1.20.3 on linux/amd64

Skapa en objektlagringsinstans


Nu när vi har förberett Restic behöver vi skapa en objektlagringsinstans och en bucket hos GleSYS.

I GleSYS kontrollpanel under Infrastruktur, välj Objektlagring. Klicka sedan på Skapa ny instans. Nu öppnas en ny dialogruta där vi väljer i vilket datacenter som instansen ska placeras i. Här väljer vi Falkenberg. Vi behöver också ge instansen en beskrivning. Låt Skapa en initial bucket vara ikryssat. Det är i en bucket vi lagrar vår data.

Skapa ny instans

När vi klickar på knappen Skapa ny instans kommer alla uppgifterna för vår bucket att visas. Skriv ner alla uppgifterna, framförallt bucket, åtkomstnyckel och hemlig nyckel. Dessa uppgifterna kommer inte att visas igen.

Uppgifter om bucket

Initialisera ett Restic-arkiv


Nu är det dags att skapa och initialisera ett Restic-arkiv. Detta momentet skapar en katalogstruktur tillsammans med krypteringsnycklar och andra filer som behövs i vår bucket hos GleSYS.

När vi arbetar med Restic-arkiv är det enklast att sätta alla inställningar som miljövariabler. Då behöver vi inte skriva in dem upprepade gånger. Miljövariablerna gör det också enklare för oss senare när vi ska automatisera säkerhetskopieringen. Här börjar vi med att avaktivera historiken i skalet för att inte vår nyckel ska synas i history-filen.

$ unset HISTFILE
$ export RESTIC_REPOSITORY="s3:https://objects.dc-fbg1.glesys.net/cool-recipe"
$ export AWS_ACCESS_KEY_ID="xxxxxx"  
$ export AWS_SECRET_ACCESS_KEY="zzzzzz"  
$ export RESTIC_PASSWORD="debit4scotland3hillock3tillage"

RESTIC_REPOSITORY är där säkerhetskopian ska sparas. Vi inleder med s3 eftersom GleSYS Objektlagring är S3-kompatibel. Därefter följer https://objects.dc-fbg1.glesys.net/ (dc-fbg1 är Falkenbergs datacenter). Detta är adressen som visades när vi skapade vår objektlagringsinstans. Efter det sista snedstrecket lägger vi till namnet på vår bucket, som här är cool-recipe.

AWS_ACCESS_KEY_ID är nyckeln som visades under Åtkomstnyckel när vi skapade lagringsinstansen.

AWS_SECRET_ACCESS_KEY är den hemliga nyckeln som visades när vi skapade lagringsinstansen.

RESTIC_PASSWORD är krypteringslösenordet för Restic-arkivet. Det är viktigt att komma ihåg detta lösenordet; utan det kan vi aldrig komma åt säkerhetskopian igen. Det är också viktigt att välja ett långt lösenordet med många olika tecken.

Nu när alla uppgifterna är redo kan vi initialisera arkivet med kommandot restic init.

$ restic init
created restic repository 930a936a8d at s3:https://objects.dc-fbg1.glesys.net/cool-recipe

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

Göra säkerhetskopior och arbeta med ett arkiv


Nu har vi förberett allting som behövs för att börja säkerhetskopiera våra filer. I det här exemplet kommer vi göra en säkerhetskopia på katalogen Dokument i användarens hemkatalog.

$ restic backup ~/Dokument
repository 930a936a opened (version 2, compression level auto)
created new cache in /home/jake/.cache/restic
no parent snapshot found, will read all files

Files:          11 new,     0 changed,     0 unmodified
Dirs:            3 new,     0 changed,     0 unmodified
Added to the repository: 12.834 MiB (12.298 MiB stored)

processed 11 files, 37.326 MiB in 0:03
snapshot bbad22da saved

Nu är säkerhetskopian klar. Här ser vi också att komprimeringen och dedupliceringen fungerade. Filerna i säkerhetskopian upptar 12,8 MiB, trots att filerna på disken är totalt 37,3 MiB.

Vi kan kontrollera så att allt ser rätt ut innan vi går vidare. Vi börjar med att lista alla snapshots som vårt Restic-arkiv innehåller:

$ restic snapshots
repository 930a936a opened (version 2, compression level auto)  
ID        Time                 Host                  Tags        Paths  
------------------------------------------------------------------------------------  
bbad22da  2023-05-30 10:53:51  red-dwarf.nixnet.jke              /home/jake/Dokument  
------------------------------------------------------------------------------------  
1 snapshots

Varje snapshot märks med datorn som säkerhetskopian kommer ifrån (här red-dwarf.nixnet.jke) samt katalogen som vi gjorde säkerhetskopian av.

Vi kan även lista filerna som en viss snapshot innehåller. Vi använder då ID-numret, vilket i det här fallet är bbad22da (det syns under kolumnen ID i utdatan från kommandot ovan).

$ restic ls bbad22da
repository 930a936a opened (version 2, compression level auto)
snapshot bbad22da of [/home/jake/Dokument] filtered by [] at 2023-05-30 10:53:51.670098007 +0200 CEST):
/home
/home/jake
/home/jake/Dokument
/home/jake/Dokument/cat1.jpg
/home/jake/Dokument/cat2.jpg
/home/jake/Dokument/cat3.jpg
/home/jake/Dokument/coding.mp4
/home/jake/Dokument/glitch.mp4
/home/jake/Dokument/lorem-ipsum1.txt
/home/jake/Dokument/lorem-ipsum2.txt
/home/jake/Dokument/pet-rat.jpg
/home/jake/Dokument/pet-rat2.jpg
/home/jake/Dokument/pet-rat3.jpg
/home/jake/Dokument/test.data

Om vi ändrar en fil, till exempel lorem-ipsum1.txt, och därefter gör en ny säkerhetskopia kommer endast den filen – och endast ändringarna – att överföras för att spara lagringsutrymme. Den föregående snapshoten kommer att användas för de filer som inte är ändrade.

$ echo "Och nu var sagan slut" >> ~/Dokument/lorem-ipsum1.txt
$ restic backup ~/Dokument  
repository 930a936a opened (version 2, compression level auto)  
using parent snapshot bbad22da  

Files:           0 new,     1 changed,    10 unmodified  
Dirs:            0 new,     3 changed,     0 unmodified  
Added to the repository: 10.239 KiB (2.913 KiB stored)  

processed 11 files, 37.326 MiB in 0:01  
snapshot 5f80356f saved

Här ser vi att en fil är ändrad och tio är oförändrade. Denna snapshoten upptar bara tre KiB.

Nu har vi två snapshots i arkivet:

$ restic snapshots  
repository 930a936a opened (version 2, compression level auto)  
ID        Time                 Host                  Tags        Paths  
------------------------------------------------------------------------------------  
bbad22da  2023-05-30 10:53:51  red-dwarf.nixnet.jke              /home/jake/Dokument  
5f80356f  2023-05-30 11:36:00  red-dwarf.nixnet.jke              /home/jake/Dokument  
------------------------------------------------------------------------------------  
2 snapshots

Listar vi filerna för den nya snapshoten kommer vi se alla filerna, även de oförändrade:

$ restic ls 5f80356f
repository 930a936a opened (version 2, compression level auto)
snapshot 5f80356f of [/home/jake/Dokument] filtered by [] at 2023-05-30 11:36:00.525541336 +0200 CEST):
/home
/home/jake
/home/jake/Dokument
/home/jake/Dokument/cat1.jpg
/home/jake/Dokument/cat2.jpg
/home/jake/Dokument/cat3.jpg
/home/jake/Dokument/coding.mp4
/home/jake/Dokument/glitch.mp4
/home/jake/Dokument/lorem-ipsum1.txt
/home/jake/Dokument/lorem-ipsum2.txt
/home/jake/Dokument/pet-rat.jpg
/home/jake/Dokument/pet-rat2.jpg
/home/jake/Dokument/pet-rat3.jpg
/home/jake/Dokument/test.data

Återställa filer från en säkerhetskopia


Nu ska vi testa att återställa katalogen Dokument till en tillfällig katalog. Vi återställer filerna från den senaste snapshoten, vilket i detta exemplet är 5f80356f som vi såg i förra stycket. Vi återställer säkerhetskopian till katalogen /tmp/restic-labb.

$ restic restore --target /tmp/restic-labb 5f80356f  
repository 930a936a opened (version 2, compression level auto)  
restoring <Snapshot 5f80356f of [/home/jake/Dokument] at 2023-05-30 11:36:00.525541336 +0200 CEST by jake@red-dwarf.nixnet.jke> to /tmp/restic-labb

Katalogen home/jake/Dokument återställdes nu under /tmp/restic-labb/. Vi listar filerna så att allt ser rätt ut:

$ ls -l /tmp/restic-labb/home/jake/Dokument/  
total 38240  
-rw-r--r-- 1 jake jake   320729 maj 28 18:47 cat1.jpg  
-rw-r--r-- 1 jake jake   291208 maj 28 18:47 cat2.jpg  
-rw-r--r-- 1 jake jake   150735 maj 28 18:47 cat3.jpg  
-rw-r--r-- 1 jake jake  6467086 maj 30 10:48 coding.mp4  
-rw-r--r-- 1 jake jake  5073064 maj 30 10:48 glitch.mp4  
-rw-r--r-- 1 jake jake     1781 maj 30 11:35 lorem-ipsum1.txt  
-rw-r--r-- 1 jake jake     1822 maj 28 18:44 lorem-ipsum2.txt  
-rw-r--r-- 1 jake jake   331545 maj 28 18:46 pet-rat2.jpg  
-rw-r--r-- 1 jake jake   123126 maj 28 18:46 pet-rat3.jpg  
-rw-r--r-- 1 jake jake   163475 maj 28 18:46 pet-rat.jpg  
-rw-r--r-- 1 jake jake 26214400 maj 30 10:50 test.data

Den nya raden vi lade till i lorem-ipsum1.txt finns också med:

$ tail -n 3 /tmp/restic-labb/home/jake/Dokument/lorem-ipsum1.txt     
atque ex accusantium dolore ut quis minus sit aliquam fugit est mollitia autem!  

Och nu var sagan slut

Återställa enbart enstaka filer

Det går också att återställa enstaka filer från en snapshot. Det gör vi med flaggan --include. Här återställer vi filen lorem-ipsum1.txt från den första snapshoten – innan vi lade till den nya raden – till katalogen /tmp/ny-restic-labb, som då hamnar under /tmp/ny-restic-labb/home/jake/Dokument/lorem-ipsum1.txt.

$ restic restore --target /tmp/ny-restic-labb --include /home/jake/Dokument/lorem-ipsum1.txt bbad22da
$ ls -l /tmp/ny-restic-labb/home/jake/Dokument/
total 4
-rw-r--r-- 1 jake jake 1759 maj 28 18:44 lorem-ipsum1.txt

$ tail -n 2 /tmp/ny-restic-labb/home/jake/Dokument/lorem-ipsum1.txt
atque ex accusantium dolore ut quis minus sit aliquam fugit est mollitia autem!

Automatisera säkerhetskopieringen


Restic är byggt för att vara enkelt att skripta och automatisera, vilket också märks. Här ska vi skapa ett enkelt Bash-skript för att göra säkerhetskopior av dokument-katalogen som vi har laborerat med tidigare. Därefter lägger vi till skriptet i användarens crontab så att katalogen säkerhetskopieras automatiskt varje dygn.

Skapa en fil med namnet dokument-backup.sh i din hemkatalog med följande innehåll. Ändra variabler och sökvägar med dina egna uppgifter. Variablerna är desamma som vi använde tidigare.

#!/bin/bash
export RESTIC_REPOSITORY="s3:https://objects.dc-fbg1.glesys.net/cool-recipe"
export AWS_ACCESS_KEY_ID="xxxxxx"
export AWS_SECRET_ACCESS_KEY="zzzzzz"
export RESTIC_PASSWORD="debit4scotland3hillock3tillage"

/usr/local/bin/restic backup /home/jake/Dokument

Därefter ändrar vi filens rättigheter så att den blir körbar. Vi ändrar också så att endast vår egen användare kan läsa och skriva filen för att skydda nycklarna och lösenordet:

$ chmod 700 dokument-backup.sh

Nu kan vi testköra skriptet:

$ ./dokument-backup.sh    
repository 930a936a opened (version 2, compression level auto)  
using parent snapshot 5f80356f  

Files:           0 new,     0 changed,    11 unmodified  
Dirs:            0 new,     2 changed,     1 unmodified  
Added to the repository: 734 B (583 B stored)  

processed 11 files, 37.326 MiB in 0:02  
snapshot e640c72f saved

Allt fungerade, och inga filer har ändrats sedan den förra snapshoten. Nu kan vi lägga till skriptet i användarens crontab:

$ crontab -e

Nu öppnas en texteditor, mest troligen nano eller vi. Lägg till följande rad men ändra sökvägen för din användare. Avsluta och spara sedan filen.

5 21 * * * /home/jake/dokument-backup.sh

Nu kommer dokument-katalogen automatiskt att säkerhetskopieras varje kväll klockan 21:05.

Lägg till en loggfil


Om vår dator eller server har e-post aktiverad kommer vi även få ett mejl med all utdata från körningen i crontab. På så sätt kan vi kontrollera att allting fungerade som tänkt. Vill vi istället logga den senaste körningen till en fil kan vi ändra crontab-raden så att den istället ser ut så här:

5 21 * * * /home/jake/dokument-backup.sh > /home/jake/restic-run.log 2>&1

Efter klockan 21:05 kan vi se den senaste körningens utdata i filen restic-run.log:

$ cat restic-run.log    
using parent snapshot e197a21f  

Files:           0 new,     0 changed,    11 unmodified  
Dirs:            0 new,     2 changed,     1 unmodified  
Added to the repository: 734 B (583 B stored)  

processed 11 files, 37.326 MiB in 0:01  
snapshot ba27b049 saved

Några avslutande ord om dedupliceringen


Beroende på vad för typ av data man säkerhetskopierar kan dedupliceringen i Restic vara mycket effektivt. Jag gjorde nyligen en säkerhetskopia av fyra stycken virtuella maskiners diskar. Samtliga VMs var Debian 11. Sammanlagt tog dessa fyra diskar 122 GiB utrymme på den lokala disken. Säkerhetskopian i Restic tog däremot bara 17,7 GiB. Eftersom alla VMs var så lika varandra fanns det mycket redundant data som dedupliceringen kunde bortse från.

Relaterade artiklar

Hittar du inte det du söker?

Kontakta oss gärna för mer information. Vi hjälper dig att komma fram till den bästa lösningen för dina behov.

Skicka e-post Ring 0200-23 88 00