Temat: Cloudbackup
Niektóre sprawy są tak oczywiste, że aż czasami trudno sobie uświadomić że należało by je opisać.
W wątku na forum został poruszony temat ponownej instalacji pakietów instalowanych przez użytkownika po wykonaniu aktualizacji systemu. Wszystko jest dobrze dopóki mamy faktycznie listę pakietów które chcemy odtworzyć. A teraz wyobraźmy sobie taki scenariusz: padł nam soft, zrobiliśmy błąd konfiguracyjny, wyłożył się router lub cokolwiek innego co zmusza nas do ponownej instalacji czystego obrazu. I co wtedy z konfiguracją i pakietami?
System OpenWrt umożliwia robienie backupów plików konfiguracyjnych ale co jak tego backupu nie mamy przy sobie? I tu przychodzi na myśl tytuł tego tematu czyli backup konfiguracji w chmurze. Chmura nie jest już chwytliwym słowem używanym do przerażenia zwykłego użytkownika, jest już rzeczą na porządku dziennym którą większość z nas używa i nawet już nie myśli o tym jako o "chmurze".
Więc - czy OpenWrt może mieć backup w chmurze? Na czystym obrazie - nie. Tak, jeżeli to sobie oprogramujemy. Jak to zrobić? Zanim przedstawię prawie-że-gotowe rozwiązanie to najpierw prześledźmy jak taki przykładowy mechanizm działa.
Na działającym systemie musimy mieć zainstalowane pakiety:
* ekooneplstat (mój pakiet do statystyk), będzie potrzebny do uzyskania unikalnego tokenu urządzenia, którym będzie się "identyfikował" w chmurze
* backupandrestore (mój pakiet do instalacji pakietów użytkownika który pojawił się ostatnio w moim repo, opis jest we wcześniejszym linku) - będzie służył do ponownej instalacji pakietów użytkownika
* curl, niezbędny do wysłania backupu do chmury (curla można zastąpić wbudowanym uclient-fetch, o ile jest w dość aktualnej wersji)
* openssl, niezbędny do zapewnienia sobie prywatności i zaszyfrowania backupu
Uruchamiamy skrypt który po kolei:
- robi backup listy pakietów zainstalowanych przez użytkownika
- robi backup plików konfiguracyjnych przy pomocy standardowego programu sysupgrade (polecam poradnik https://eko.one.pl/?p=openwrt-backup )
- szyfruje ten backup podanym przez nas hasłem (w backupie są hasła do wifi, certyfikaty do openvpn, klucze do wiregaurd itp. więc dobrze by było żeby to nie wyciekło. Ponadto nie wiadomo gdzie będą siedziały pliki i kto je będzie oglądał po drugiej stronie)
- wysyła backup do chmury przy pomocy curl'a
Jak w praktyce takie coś wygląda? Przykładowa sesja z backupowaniem konfiguracji.
root@OpenWrt:~# cloudbackup.sh
Podaj hasło do backupu
root@OpenWrt:~#
Nie podaliśmy hasła i nic nie zrobi. Więc trzeba podać jakieś skomplikowane:
root@OpenWrt:~# cloudbackup.sh jas1malGOSI@
Sat Aug 26 16:28:37 CEST 2023 upgrade: Saving config files...
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
Backup został utworzony
root@OpenWrt:~#
Backup został utworzony, zaszyfrowany określonym algorytmem (akurat u mnie chacha20) i wysłany do chmury.
Proste i szybkie. I teraz - tracimy konfig, instalujemy system na czysto i nie mamy nic. Jak odzyskać konfigurację? Musimy mieć w obrazie (lub zainstalować) elementy podane powyżej, a później po prostu uruchamiamy skrypt który odczyta nam z chmury backup i zaktualizuje system:
root@OpenWrt:~# cloudrestore.sh
Podaj hasło do backupu
root@OpenWrt:
Znów bez hasła. Zobaczmy co będzie jak hasło będzie złe:
root@OpenWrt:~# cloudrestore.sh 1234
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 16240 100 16240 0 0 74525 0 --:--:-- --:--:-- --:--:-- 74495
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
Błąd odszyfrowania backupu. Może to było złe hasło?
root@OpenWrt:
Podajmy w końcu dobre hasło:
root@OpenWrt:~# cloudrestore.sh jas1malGOSI@
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 16219 100 16219 0 0 71041 0 --:--:-- --:--:-- --:--:-- 71449
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
Sat Aug 26 16:02:39 CEST 2023 upgrade: Restoring config files...
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/base/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_base
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/base/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_luci
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/luci/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_packages
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/packages/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_routing
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/routing/Packages.sig
Signature check passed.
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/openwrt_telephony
Downloading https://downloads.openwrt.org/releases/23.05-SNAPSHOT/packages/x86_64/telephony/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/targets/x86/64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_core
Downloading https://dl.eko.one.pl/openwrt-23.05/targets/x86/64/packages/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/base/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_base
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/base/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/luci/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_luci
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/luci/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/packages/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_packages
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/packages/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/routing/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_routing
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/routing/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/telephony/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_telephony
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/telephony/Packages.sig
Signature check passed.
Downloading https://dl.eko.one.pl/openwrt-23.05/targets/x86/64/kmods-5.15.127/Packages.gz
Updated list of available packages in /var/opkg-lists/eko1_kmods
Downloading https://dl.eko.one.pl/openwrt-23.05/targets/x86/64/kmods-5.15.127/Packages.sig
Signature check passed.
Package curl (8.2.1-1) installed in root is up to date.
Installing easyconfig (20230421) to root...
Downloading https://dl.eko.one.pl/openwrt-23.05/packages/x86_64/base/easyconfig_20230421_all.ipk
Configuring easyconfig.
Package libcurl4 (8.2.1-1) installed in root is up to date.
Package libnghttp2-14 (1.51.0-1) installed in root is up to date.
Backup został przywrócony
root@OpenWrt:~#
I teraz ew wykonujemy restart urządzenia i mamy ponownie gotowy i skonfigurowany system.
Czyli tak naprawdę uruchamiamy jeden skrypt z hasłem i to jest całe odtwarzanie systemu.
Skrypt ten:
* pobiera backup z chmury
* próbuje odszyfrować jego zawartość wykorzystując podaje hasło
* przywraca backup korzystając z systemowego sysupgrade
* i na koniec odczytuje listę pakietów użytkownika i instaluje je ponownie
Przykładowe pliki implementujące backup w chmurze, cloudbackup.sh i cloudrestore.sh można znaleźć u mnie w przykładowych projektach: https://dl.eko.one.pl/projekty/cloudbackup/ . Nie traktujcie tego jako ostatecznie rozwiązanie, raczej jako przykład do samodzielnej rozbudowy o dalsze elementy.
W tym opisie kilka razy padło słowo "chmura". Fizycznie dla w/w skryptów jest to obecnie moje dl.eko.one.pl które potrafi obsłużyć takie żądania. Ale nie przyzwyczajajcie się do dl.eko.one.pl, nie mam w planach prowadzić publicznego serwera do przechowywania backupów. Natomiast jeżeli ktoś chciałby korzystać z takiego rozwiązania to należy sobie takie serwer do obsługi chmury napisać samodzielnie lub zamiast curla wykorzystać dowolny inny element który umożliwia przesłanie gdzieś pliku - np. jakieś serwer w internecie do którego możemy uploadować pliki przez php czy przez scp. Tutaj już jest pełna dowolność rozwiązania.