Zaraz po zainstalowaniu Home Assistanta jedną z najważniejszych czynności, jaką należy wykonać, jest zaprojektowanie systemu kopii zapasowych. Backup to podstawa podczas pracy z danymi cyfrowymi i nie inaczej jest w przypadku platform Smart Home. Jak zadbać o backup w przypadku Home Assistanta?
Tworzenie kopii zapasowych jest istotne ze względu na zapewnienie bezpieczeństwa danych w przypadku awarii sprzętu, ataku złośliwego oprogramowania lub ludzkiego błędu. Kopie zapasowe umożliwiają szybkie i skuteczne odtworzenie utraconych lub uszkodzonych danych. W przypadku Home Assistanta kopia zapasowa może przydać się w wielu scenariuszach, na przykład po nieudanej aktualizacji, w przypadku uszkodzenia nośnika komputera działającego jako serwer czy po wykonaniu błędnych modyfikacji systemu operacyjnego.
Home Assistant jako usługa self-hostowana (to znaczy: jest zarządzana w pełni lokalnie) i otwarta daje nam wiele sposobów tworzenia backupów. Co więcej, sama w sobie platforma ma też specjalny moduł do tworzenia kopii zapasowych. W tym poradniku utworzymy zasady tworzenia kopii zapasowych dla obydwóch omawianych w poprzednim poradniku metod instalacji:
Co więcej, sprawimy, że kopie zapasowe będą tworzone automatycznie, co znacznie ułatwi nam sprawę i ukróci kłopoty.
Podchodząc jeszcze czysto teoretycznie, tworzenie backupów to przede wszystkim zasada trzech kopii (3-2-1) – dwóch lokalnie i jednej „na zewnątrz”, czyli w naszym przypadku poza domem. Przedstawione rady spokojnie będziemy mogli wykorzystać do tworzenia kopii na wielu nośnikach i w różnych lokalizacjach.
Zanim jeszcze zaczniemy tworzyć kopie zapasowe, to warto się nieco przygotować. Moim zdaniem należy tworzyć kopię zapasową przede wszystkim na nośnik bezpośrednio wpięty do komputera, ale nie na ten sam dysk, na którym jest zainstalowany system. Chcąc zachować kompaktowe wymiary (wszak możliwe, że Home Assistant zainstalowaliście na Single Board Computer) do tego zadania może przydać się pendrive SanDisk Extreme Pro. Cechuje się on wysokimi prędkościami, stabilnością oraz dużą pojemnością. Jak go przygotować do tworzenia kopii zapasowych?
Wpinamy pendrive SanDisk do portu USB w komputerze i przygotowujemy go do pracy – jest to możliwe za pomocą dostępu do konsoli poprzez SSH lub bezpośrednio, podpinając monitor i klawiaturę. Aby sprawdzić czy pendrive został wykryty oraz jakie ma oznaczenie wpisujemy:
lsblk
Wynik będzie podobny do poniższego.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 93.3M 1 loop /snap/core/16204
loop1 7:1 0 49.1M 1 loop /snap/core18/2810
loop2 7:2 0 20K 1 loop /snap/hello-world/29
loop3 7:3 0 1.1M 1 loop /snap/mosquitto/877
loop4 7:4 0 93M 1 loop /snap/core/16578
sda 8:0 1 59.8G 0 disk
mmcblk1 179:0 0 14.6G 0 disk
└─mmcblk1p1 179:1 0 14.4G 0 part /var/log.hdd
/
zram0 252:0 0 492.1M 0 disk [SWAP]
zram1 252:1 0 50M 0 disk /var/log
zram2 252:2 0 0B 0 disk
Odnajdujemy nośnik o rozmiarze pendrive’a (w naszym przypadku rozmiar będzie wynosić około 64 GB, czyli tutaj 59.8G) i sprawdzamy jakie ma oznaczenie, prawdopodobnie będzie to sda
lub sdb
. Następnie musimy na nim utworzyć partycję (uwaga: usunie to wszystkie dane z pendrive’a). Wpisujemy poniższą komendę.
sudo fdisk /dev/sdX
X to oznaczenie, które sprawdziliśmy poprzednio. W programie wpisujemy najpierw n
, następnie wybieramy p
i klikamy enter dla zatwierdzenia procesu. Na samym końcu zapisujemy zmiany za pomocą w
i wpisujemy q
żeby wyjść z programu fdisk. Możemy wpisać ponownie lsblk
, aby potwierdzić utworzenie partycji, np. jako sda1
.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 93.3M 1 loop /snap/core/16204
loop1 7:1 0 49.1M 1 loop /snap/core18/2810
loop2 7:2 0 20K 1 loop /snap/hello-world/29
loop3 7:3 0 1.1M 1 loop /snap/mosquitto/877
loop4 7:4 0 93M 1 loop /snap/core/16578
sda 8:0 1 59.8G 0 disk
└─sda1 8:1 1 59.8G 0 part
mmcblk1 179:0 0 14.6G 0 disk
└─mmcblk1p1 179:1 0 14.4G 0 part /var/log.hdd
/
zram0 252:0 0 492.1M 0 disk [SWAP]
zram1 252:1 0 50M 0 disk /var/log
zram2 252:2 0 0B 0 disk
Teraz utworzoną partycję musimy sformatować do odpowiedniego systemu plików dla Linuksa, w tym przypadku jest to ext4.
sudo mkfs.ext4 /dev/sdXY
Gdzie X
jest literą odpowiadającą nośnikowi SanDisk, a Y
numerem partycji. W tym momencie możemy go zamontować w systemie plików.
sudo mkdir /mnt/sandisk
sudo mount /dev/sdXY /mnt/sandisk/
Wpisując komendę df -h
pendrive powinien zostać nie tylko wykryty, ale też wskazany jako zamontowany w wybranym katalogu.
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 99M 13M 86M 14% /run
/dev/mmcblk1p1 15G 7.8G 6.5G 55% /
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 493M 0 493M 0% /tmp
/dev/zram1 47M 1008K 43M 3% /var/log
tmpfs 99M 4.0K 99M 1% /run/user/1001
/dev/sda1 59G 24K 56G 1% /mnt/sandisk
Żeby nie musieć powtarzać komendy mount
przy każdym ponownym uruchomieniu komputera, warto stworzyć odpowiednią automatyzację, która zrobi to za nas. Tutaj skorzystamy z podstawowego narzędzia w systemach Linux, czyli Crona/Crontaba. Cron jest narzędziem w systemach operacyjnych Unix, które pozwala użytkownikom planować i harmonogramować wykonywanie zadań automatycznych w określonych interwałach czasowych.
Jeszcze jednak zanim skorzystamy z Crontaba, musimy ustalić sztywny numer identyfikacyjny dla pendrive’a. Jest to potrzebne, aby w razie podłączenia drugiego pendrive’a lub innego nośnika system „nie pomylił” pendrive’ów i nie zamontował ich w złych katalogach. Dlatego wpisujemy komendę sudo blkid
, która wyświetli identyfikator UUID dla partycji.
$ sudo blkid
/dev/mmcblk1p1: UUID="5e468073-a25c-4048-be42-7f5cfc36ce25" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="263fbbb8-01"
/dev/sda1: UUID="00ad5e27-93a8-44a6-8cef-ff9908060a14" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="78fa2c26-01"
Jak widać, na liście jest /dev/sda1
. Kopiujemy jej UUID i zapisujemy sobie. Następnie wpisujemy poniższe komendy.
sudo su
crontab -e
Crontab uruchomi się w formacie do edycji. Przechodzimy na sam koniec pliku i wpisujemy poniższą linię.
@reboot mount UUID=00ad5e27-93a8-44a6-8cef-ff9908060a14 /mnt/sandisk
Najtrudniejszą część (przynajmniej moim zdaniem) mamy za sobą.
Jak wspomniałem w poradniku instalacji Home Assistanta, wykorzystanie narzędzia docker-compose
znacznie uprości nam backupowanie całej usługi. Teraz dostrzegamy tego zalety, ponieważ, aby wykonać kopię zapasową wystarczy utworzyć archiwum z plikiem compose.yaml
i katalogiem zawierającym dane platformy.
Żeby jednak to jakoś uporządkować to przygotujemy sobie skrypt, który wszystko dokładnie utworzy, nada odpowiednią nazwę oraz wykona zapis na wpiętym pendrive. Ten skrypt natomiast będzie uruchamiać się codziennie, aby zachować jak najbardziej świeżą kopię.
Aby rozpocząć, wpisujemy poniższe komendy.
sudo su
cd ~
mkdir home-assistant-backup-script
cd home-assistant-backup-script
nano script.sh
Otworzy się edytor tekstu, w którym to wklejamy poniższy skrypt.
#!/bin/bash
sandisk="/mnt/sandisk/"
DISC="/dev/sda1"
BACKUP_DIRECTORY="/mnt/sandisk/backup/"
CURRENT_DATE=$(date "+%Y%m%d-%H%M")
HOME_ASSISTANT_PWD="~/Docker/Home-Assistant"
# checking that $sandisk have files
isDriveMounted=$(ls $sandisk | wc -l)
FAIL_STRING=$(echo "mount: /mnt: special device $DISC does not exist.")
if [ 1 -gt $isDriveMounted ]
then
#mounting sandisk
echo "sandisk is NOT mounted"
isReallyMounted=$(mount $DISC $sandisk) #if empty, drive is mounted
isDriveAvailable=$(echo $isReallyMounted)
if [[ $FAIL_STRING == $isDriveAvailable ]]
then
#sandisk is not connected to computer
echo "Drive is not connected. Breaking!"
exit 0
fi
fi
# for deleting old files, older than 15 days
find $BACKUP_DIRECTORY -mtime +15 -type f -delete
#creating new directory for the backup
mkdir $BACKUP_DIRECTORY$CURRENT_DATE
# Creating backup
echo "Creating backup"
tar -czvf $BACKUP_DIRECTORY$CURRENT_DATE/backup.tar.gz $HOME_ASSISTANT_PWD
echo "Backup created"
Okej, mamy skrypt, więc możemy go zapisać (Ctrl+S) oraz wyjść z edytora (Ctrl+X). Następnie nadajemy mu prawa uruchamiania i wchodzimy znowu do Crontaba.
chmod u+x script.sh
crontab -e
Schodzimy na sam dół zawartości pliku i dodajemy poniższą regułę.
0 3 * * * bash ~/home-assistant-backup-script/script.sh >/dev/null 2>&1
Ta instrukcja sprawi, że codziennie będzie wykonywał się skrypt tworzący kopię zapasową. Sam skrypt natomiast najpierw sprawdza czy pendrive jest zamontowany, jeśli nie to spróbuje go zamontować. Brak pendrive’a przerwie wykonywanie skryptu. Następnie usuwa stare kopie, starsze niż 15 dni i tworzy nową.
Uwaga: skrypt jest bardzo prosty i nieodporny na błędy, warto więc raz na kilka dni sprawdzić poprawność tworzenia kopii, a także, zgodnie z poprzednio wspomnianą zasadą, replikować te kopie również do innych miejsc. Ponadto, warto zweryfikować poprawność podanych ścieżek, ponieważ możliwe, że przechowujecie pliki Home Assistanta w innym miejscu.
I to koniec! Kopię zapasową przywrócimy natychmiastowo postępując zgodnie z instrukcją instalacji Home Assistanta w wersji Docker, którą znajdziecie >>tutaj<<. Różnicą będzie fakt, że po uruchomieniu ujrzymy już znaną nam konfigurację.
Podobnie jak w przypadku instalacji, tak i w temacie tworzenia kopii zapasowych Snap ponownie (choć tylko lekko) góruje nad Dockerem – a przynajmniej w kontekście prostoty. Otóż Snap oferuje wbudowaną funkcję do tworzenia backupów ukrytą pod komendą snap save
. Dlatego też wpisując poniższe polecenie wykonacie snapshot instalacji Home Assistanta.
sudo snap save home-assistant-snap
Co się dzieje po wykonaniu tego polecenia? W katalogu /var/lib/snapd/snapshots
utworzy się archiwum ZIP zawierające dane użytkownika. Można ten fakt łatwo wykorzystać i to na wiele sposobów. Ja powiem o dwóch.
Pierwszy z nich nieco ingeruje w powyższe informacje dotyczące montowania pendrive’a. Otóż zamontujemy go w tej ścieżce, gdzie zapisywane są kopie zapasowe. To pozwoli na tworzenie snapshotów od razu docelowo na pendrive’a SanDisk.
Jeśli pendrive jest zamontowany, to musimy go odmontować:
sudo umount /dev/sdXY
gdzie X, to litera odpowiadająca pendrive’owi, a Y cyfrze utworzonej partycji. Następnie montujemy go w powyższej ścieżce tak jak wskazuje komenda poniżej.
sudo mount /dev/sdXY /var/lib/snapd/snapshots/
Można też wykorzystać identyfikator UUID, a także zmodyfikować wcześniej stworzone reguły cron zmieniając po prostu ścieżkę.
Teraz ponownie wykorzystamy Crontaba do tworzenia backupów, tym razem jednak skrypt nie będzie potrzebny. Uruchamiamy więc Crontaba w trybie edycji:
sudo su
crontab -e
A następnie wpisujemy poniższą regułę.
0 3 * * * sudo snap save home-assistant-snap
I to już. Kopie będą wykonywać się automatycznie, bezpośrednio na pendrive’a.
Jeśli jednak nie chcecie montować pendrive’a w katalogu /var/lib/snapd/snapshots/
, to potrzebny będzie skrypt, który najpierw wykona kopię, a następnie ją przekopiuje na pendrive’a. Ze względu na brak kontroli nazwy archiwów ZIP, jest to nieco trudniejsze i albo wymaga utworzenia wyrażenia regularnego, albo skorzystania z narzędzia rsync
. Jest to znacznie bardziej zaawansowana czynność, która utrudnia nam działania zgodnie z zasadą KISS (keep it simple stupid), a przynajmniej w tym przypadku.
Przywrócenie kopii zapasowej jest bajecznie proste. Służy do tego komenda sudo snap restore
. Wystarczy, np. na nowym komputerze czy systemie zainstalować Home Assistanta Snapem (zgodnie z naszym poradnikiem), skopiować utworzone wcześniej archiwa do /var/lib/snapd/snapshots/
, wyświetlić listę zapisanych kopii sudo snap saved
i wybrać dogodny snapshot poniższą komendą.
sudo snap restore <ID>
Gdzie <ID>
to liczba z początku nazwy utworzonego archiwum ZIP. Czyli jeśli chcemy przywrócić kopię o nazwie 5_home-assistant-snap_2024.1.6_592.zip
to wpisujemy sudo snap restore 5
.
Oczywiście, że Home Assistanta możemy backupować na wiele innych sposobów i – tak jak można było dostrzec na bazie przedstawionych metod – głównie zależy to od drogi instalacji. Co ciekawe, sam Home Assistant ma wbudowany moduł do tworzenia kopii zapasowych, ale jest on bardzo prosty, ogranicza się do pojedynczego kliknięcia i opcji pobrania archiwum. Przywrócenie tej kopii jest też nieco uciążliwe.
Wyjątkiem jest jednak Home Assistant OS, gdzie mamy możliwość zamontowania zewnętrznych dysków (również sieciowych) z poziomu interfejsu graficznego, a następnie wybór tych nośników do tworzenia kopii. To znacznie rozbudowuje proces i daje wiele możliwości. Warto tutaj posiłkować się >>tym poradnikiem<<.
Jak już jesteśmy w temacie innych platform, to nie można nie wspomnieć o YunoHost. Tak jak już zostało wyjaśnione w poprzednich wpisach, jest to cały system operacyjny do self-hostingu i ma on wbudowany moduł do tworzenia kopii zapasowych. Można je wykonać zarówno w interfejsie graficznym, jak i w terminalu. Opcja terminalowa pozwala również na utworzenie automatyzacji analogicznych jak w przypadku naszego poradnika do wersji Docker.
W tym poradniku poznaliśmy dwie metody tworzenia kopii zapasowych Home Assistanta od strony systemu operacyjnego. Zaletą tych rozwiązań jest „pełny backup” pozwalający na szybkie przywrócenie aplikacji w wersji niezmienionej. Ponadto, kopie tworzą się regularnie i automatycznie, bez naszej ingerencji. Warto jednak testować tworzone kopie zapasowe, aby wiedzieć jak z nimi obchodzić się w razie potrzeby skorzystania.
Metodę kopiowania można wykorzystać do trzymania się zasady 3-2-1. Do komputera możemy podłączyć drugi nośnik (np. inny pendrive lub dysk przenośny) i również na niego kopiować dane. Za pomocą narzędzi takich jak rclone
można zalogować się do chmury, np. Google Drive czy pCloud, aby przechowywać kopie zapasowe poza domem. Narzędzie to można również wykorzystać do kopiowania danych na domowy serwer plików, tzw. NAS. Jednakże tutaj proces konfiguracji głównie zależy od usługi, z której zamierzacie skorzystać.
Sprawdź katalog sklepu TECHWISH, aby wybrać idealny dla siebie nośnik danych!
Kategoria: Inspiracje technologiczne