Automatisk backup i Ubuntu (för t.ex. Home Assistant)

Unix
Du har förmodligen lagt en hel del tid på din installation så se till att vara rädd om den! Här får du lära dig både att ta backup och att återställa den.

Visningar:

244

Betyg:

3.3
(3)

Svårighetsgrad:

Enkelt

Tidsåtgång:

15-20min

För den här guiden behöver du

  • Docker
  • Nätverkslagring (NAS eller motsvarande)




OBS! Jag upptäckte ikväll (2019-02-21) att gamla backupfiler inte rensas så som de ska enligt guiden. Jag kommer att gräva vidare i detta och uppdatera guiden därefter. Notering om eventuella förändringar kommer att göras längst ner. OBS!

Inledning

Till att börja med, JA – jag är fullt medveten om att Hass.io har stöd för automatiska backuper, men eftersom jag har mer än bara Hass.io installerat på min Ubuntuserver så passar den lösningen helt enkelt inte mig.

Jag har letat länge efter en backuplösning som uppfyller mina krav:

  • Full automatik
  • Kunna ta backup på alla programvaror jag har på Ubuntuservern (ex. Home Assistant, UniFi och Apache)
  • Versionshantering för konfigurationsfiler
  • Enkel återställning
  • Backup till Dropbox
  • Viktigast av allt – det ska vara gratis!

Alla jag hittade brast på någon punkt (eller okej, jag hittade en som faktiskt kändes perfekt. Men efter att ha lagt ner flera dagar på att installera, konfigurera och testat så hittade jag en liten notering att de kommer sluta utveckla programmet inom två månader), och till sist så insåg jag att jag var tvungen att banta ner kravlistan lite. Efter att ha grävt fram min gamla NAS ur förrådet kunde jag stryka Dropbox ifrån listan.

Efter månader av sökande, efterforskningar och tester har jag nu hittat en lösning som jag känner mig bekväm och nöjd med. Jag kör nu Restic och sparar backupen på min NAS. Det täcker visserligen inte versionshanteringen för konfigurationsfilerna, men det har jag löst via Dropbox – men det kommer en guide kring det senare!

Ett tips från coachen, spara ner den här instruktionen lokalt på din dator. Det vore ju ganska tråkigt om du, den dagen du sitter där gråtandes och försöker återställa din backup, upptäcker att ”nähä, sieri.se fanns tydligen inte kvar nu år 2039!”.

Anslut Ubuntu till din NAS

Är du ovan att arbeta i Unixbaserade operativsystem kan det vara klokt att läsa igenom wikiartikeln ”Några enkla grunder i Unix” innan du börjar!

Självklart går det lika bra att placera backupen på en annan dator i nätverket, däremot kan jag inte svara på vad som händer den dagen din dator inte är igång och Ubuntu tappar anslutningen.

Först behöver vi skapa katalogen som din nätverkslagring ska monteras i, det gör du genom att skriva följande kommando i konsollen på Ubuntu:

sudo mkdir /mnt/backup-nas

Sen ska vi redigera en konfigurationsfil på din Ubuntumaskin för att den ska ansluta emot din nätverkslagring:

sudo vim /etc/fstab

Längst ner i filen lägger du till en ny rad med texten nedan
OBS! Du måste byta ut alla delar med [ ] emot dina egna värden

//[IP-NUMRET FÖR DIN NAS]/[KATALOG PÅ DIN NAS] /mnt/backup-nas cifs credentials=/etc/samba/naslogin,iocharset=utf8,file_mode=0777,dir_mode=0777,uid=[DITT ANVÄNDARNAMN I UBUNTU],gid=[DITT ANVÄNDARNAMN I UBUNTU],nofail 0 0

I mitt fall blir det alltså:

//192.168.1.110/ubuntu /mnt/backup-nas cifs vers=1.0,credentials=/etc/samba/naslogin,iocharset=utf8,file_mode=0777,dir_mode=0777,uid=sieri,gid=sieri,nofail 0 0

Den observanta ser även att jag har med ”vers=1.0,” i min text, detta är för att min NAS tillverkades ungefär samma år som dinosaurierna försvann och därför bara har stöd för SMBv1 – jag måste alltså styra Ubuntu att ansluta över SMBv1 vilket jag gör med ”vers=1.0,”. Hur vet du då ifall det även gäller för din NAS? På en modern och uppdaterad Windows 10-dator är SMBv1 avstängt och därför kan den inte ansluta emot en NAS som använder SMBv1, så testa helt enkelt med din Windows 10-dator.
OBS! SMBv1 är över 10år gammalt, fullt av säkerhetshål och avstängt i de flesta system, det bör INTE användas om det inte är absolut nödvändigt! OBS!

Nästa steg är att skapa en fil med användarnamn och lösenord för att komma åt din nätverksdisk, alltså den filen som du säkert la märke till att vi hänvisade till i förra steget. (Om nätverksdisken finns på din dator ska du ange dina inloggningsuppgifter som du använder när du loggar in på datorn)

sudo vim /etc/samba/passwd_file

Filen ska innehålla:

username=[DITT ANVÄNDARNAMN]
password=[DITT LÖSENORD]

Nu är det dags att ansluta emot nätverksdisken, det gör du genom att ange detta kommando:

sudo mount -a

Här tyckte jag att det var jättespännande att starta om min Ubuntumaskin för att se så att den fortfarande var ansluten, vilket den såklart var.

Ladda hem och installera Restic

Börja med att skapa en katalog för att återställa backupen till, inför den dagen ingen vill uppleva – när man faktiskt behöver det som finns i backupen.

sudo mkdir usr/share/backup_restore

Ett enda kommando laddar hem Docker-imagen, startar containern och konfigurerar backuperna:
Observera att du måste anpassa kommandot så att det passar just din installation!

docker run -d \
    --name restic_backup_server \
    --hostname [DIN UBUNTUSERVERS DATORNAMN] \
    --restart=unless-stopped \
    -v /usr/share/hassio:/data/usr_share_hassio:ro \
    -v /mnt/backup-nas:/mnt/restic \
    -v /usr/share/backup_restore:/mnt/backup_restore \
    -e "BACKUP_CRON=0 */24 * * *" \
    -e "RESTIC_FORGET_ARGS=--prune --keep-last 3" \
    -e "RESTIC_PASSWORD=[LÖSENORD FÖR ATT KRYPTERA DIN BACKUP]" \
    lobaro/restic-backup-docker:v1.0

Förklaring av kommandot:

Containerns namn

--name restic_backup_server \

Bestämmer namnet för din Docker-container

Datornamn

--hostname [DIN UBUNTUSERVERS DATORNAMN] \

Restic sparar datornamnet tillsammans med varje backup, och eftersom vi kör Restic i en Docker-container så sparas istället Docker-containerns id. Därför ställer vi in Ubuntuserverns datornamn här så att rätt datornamn sparas med backuperna.

Omstartsbeteende

--restart=unless-stopped \

Anger att containern ska startas automatiskt vid problem eller omstart av servern.

Kataloger att säkerhetskopiera (Källa)

-v /usr/share/hassio:/data/usr_share_hassio:ro \

Anger att katalogen /usr/share/hassio ska monteras i containerns /data/-katalog i read-only-läge. Allt innehåll i katalogen /data/ kommer att säkerhetskopieras och därför monterar vi datakatalogen för Hass.io här. Ska du ta backup på flera kataloger lägger du till en rad för varje källa.

Hass.io / Home Assistant
Om du installerat Hass.io enligt min guide använder du denna rad för att inkludera hassio i din säkerhetskopia:

-v /usr/share/hassio:/data/usr_share_hassio:ro \

UniFi
Om du installerat UniFi enligt min guide använder du denna rad för att inkludera det i din säkerhetskopia:

-v /var/unifi/unifi:/data/var_unifi_unifi:ro \

deCONZ / ConBee
Om du installerat deCONZ enligt min guide (publiceras inom de närmsta dagarna) använder du denna rad för att inkludera det i din säkerhetskopia:

-v /opt/deconz:/data/opt_deconz:ro \

Katalog att spara säkerhetskopiorna i (Mål)

-v /mnt/backup-nas:/mnt/restic \

Anger att katalogen /mnt/backup-nas (den katalog vi tidigare anslöt till NAS’en) ska monteras i containerns katalog /mnt/restic.

Katalog att återskapa backupen till

-v /usr/share/backup_restore:/mnt/backup_restore \

Anger att katalogen /usr/share/backup_restore ska monteras i containerns katalog /mnt/backup_restore.

Backupschema

-e "BACKUP_CRON=0 */24 * * *" \

Anger att backupen ska gå var 24e timme med start kl 00:00.
Vill du att backupen ska gå t.ex. var 6e timme med start kl 00:00 byter du ut 24 emot 6.

Antal versioner som ska sparas

-e "RESTIC_FORGET_ARGS=--prune --keep-last 3" \

Det finns ju ingen vits med att spara varenda backup som tagits, därför anger vi att den bara ska spara de senaste 3.

Kryptering

-e "RESTIC_PASSWORD=[LÖSENORD FÖR ATT KRYPTERA DIN BACKUP]" \

Här ställer vi in en krypteringsnyckel för att förhindra att någon får tag på din backup och packar upp den. (Med tanke på att vi tar backup på Home Assistant så innehåller backupen förmodligen en hel del lösenord, dessa vill vi ju inte att någon kommer över)

Image-fil

lobaro/restic-backup-docker:v1.0

Anger vilken image-fil som ska användas för att bygga upp containern. Ifall den inte finns lokalt kommer den automatiskt att laddas hem.

Det var faktiskt allt, nu har du automatisk backup som körs vid midnatt varje dygn!

Återställa backup

Låt oss hoppas att du slipper använda det här, men det kan ändå vara trevligt att känna till hur man gör!
Om du förlorat hela ditt system börjar du med att följa de guiderna du en gång i tiden använde för att installera alltihopa (även den här guiden), och inte förrän det är klart återställer du din backup.

Börja med att gå in i din restic-container, det kan du göra antingen via Portainer eller genom att skriva följande kommando:

docker exec -ti restic_backup_server /bin/sh

Nu ska du ta reda på ID’t för den snapshot (backup) du vill återställa. Vi kör detta kommando för att lista alla snapshots:

restic snapshots
ID        Date                 Host        Tags        Directory
----------------------------------------------------------------------
d84a4f83  2019-02-14 00:00:09  hostname                /data
fd570d33  2019-02-15 00:00:07  hostname                /data
dbe31f9e  2019-02-16 00:00:03  hostname                /data

Nu är det dags för själva återställningen, det gör du med följande kommando:

restic restore -t /mnt/backup_restore dbe31f9e

När återställningen är färdig måste du manuellt flytta filerna till de platser de ska vara på:
(Observera att du måste byta ut ”/usr/share/backup_restore/data/usr_share_hassio/” emot platsen du vill flytta FRÅN och ”/usr/share/hassio” emot platsen du vill flytta TILL)

sudo mv "/usr/share/backup_restore/data/usr_share_hassio/" "/usr/share/hassio"

Backup av MySQL-databaser

Ifall du har MySQL installerat på din Ubuntuserver vill du självklart ha backup av den med – häng med!

Installera 7zip

De arkiveringsprogram som finns med som standard stödjer inte lösenordsskydd, därför installerar vi 7zip som gör det. (Du bör vara medveten om att filen inte krypteras utan endast lösenordsskyddas och är förmodligen inte att ses som oknäckbar).

sudo apt install p7zip-full

Skapa backupscript

Nu är det dags att skapa ett script som exporterar alla databaser och sedan packar ihop det med lösenordsskydd och placerar på valfri destination, i mitt fall har jag valt samma NAS som jag lägger övrig backup på.

Här måste jag nog ge varning nummer två, scriptet kommer att behöva innehålla rootlösenordet till din MySQL – OCH – lösenordet för zip-filerna. Om någon kommer över din scriptfil kommer de alltså kunna läsa dina lösenord i klartext! Det finns förmodligen bättre lösningar för ändamålet, men jag känner att det här duger för mig.

sudo vim /usr/share/mysqldump.sh

Filen ska innehålla detta:
(Observera att du som vanligt måste byta ut allt inom [] OCH sökvägen till där du vill lagra filen, i mitt fall /mnt/backup-nas/)

mysqldump -u root -p'[DITT ROOTLÖSENORD]' --all-databases | 7z a -si -p'[LÖSENORD FÖR ZIPFILERNA]' /mnt/backup-nas/mysqldb.sql.7z

Gör sedan scriptet exekverbart med detta kommando:

sudo chmod +x /usr/share/mysqldump.sh

Schemaläggning

I Unix använder man ”cron-jobb” för att schemalägga aktiviteter, dessa redigerar man genom att skriva:

sudo crontab -e

Tryck 2 för att välja VIM som din redigerare.

Längst ner i filen lägger du till detta:

30 23 * * * /usr/share/mysqldump.sh

Backupen kommer nu att köras kl 23:30 varje dag.

Hur bra var den här guiden?

Klicka på en stjärna för att betygsätta

Betyg 3.3 / 5. Antal röster 3

Bli först med att betygsätta denna guide!

Eftersom du tyckte den här guiden var bra...

Följ oss på sociala medier, så missar du inte nästa guide!

Jag beklagar att du inte var nöjd med guiden!

Hjälp mig att göra bättre guider i framtiden.

Vad saknades / vad var fel?

Lämna ett svar