艁adowanie

YunoHost – kopia zapasowa

馃嚞馃嚙 Go to english version of this post / Przejd藕 do angielskiej wersji tego wpisu

W poprzednich wpisach opisa艂em jak zainstalowa膰 艣rodowisko YunoHost oraz jak uruchomi膰 na nim pierwsz膮 aplikacji – instancj臋 WriteFreely. Nast臋pnym naturalnym krokiem jaki wykona艂by ka偶dy rozs膮dny admin jest stworzenie systemu, kt贸ry po pierwsze b臋dzie tworzy艂 kopie zapasowe uruchomionej infrastruktury, a po drugie zabezpieczy te kopie na wypadek, gdyby serwer, na kt贸rym jest to wszystko uruchomione, nagle stwierdzi艂, 偶e to dobry moment na sprawienie problem贸w.

Na pocz膮tek dla u艂atwienia zdefiniujmy sobie robocze nazewnictwo dla dw贸ch maszyn, kt贸rych b臋d臋 u偶ywa艂 w tym wpisie:

  • serwer z YunoHost – maszyna, na kt贸rej zainstalowany jest YunoHost i kt贸rej kopi臋 zapasow膮 b臋dziemy robi膰,
  • serwer do backup’贸w – dowolna inna maszyna z Linuxem, mo偶e to by膰 komputer, serwer domowy lub VPS, na kt贸rym b臋dziemy przechowywa膰 stworzone kopie zapasowe.

Zadania do wykonania na serwerze z YunoHost

Zacznijmy od po艂膮czenia si臋 przez SSH do serwera z YunoHost. Teraz stworzymy zadanie cykliczne, kt贸re w spos贸b zautomatyzowany b臋dzie wykonywa艂o dwie kopie dziennie. Jedna z nich b臋dzie powsta艂a o 5:00, a druga o 15:00. Zadanie tworzenia kopii zapasowej musi by膰 wykonywane z uprawnieniami root, wi臋c w pierwszej kolejno艣ci musimy prze艂膮czy膰 si臋 w艂a艣nie na roota.

sudo su

Zostaniemy poproszeni o podanie has艂a do naszego konta administratora YunoHost. Otwieramy tablic臋 zada艅 Cron, a raczej tworzymy j膮, bo je偶eli wcze艣niej nie by艂a u偶ywana to domy艣lnie nie istnieje:

crontab -e

Pojawi si臋 kr贸tki konfigurator, w kt贸rym musimy okre艣li膰 jakiego edytora tekstu chcemy u偶y膰. Dla mnie domy艣lnym jest nano, wi臋c wybieram opcj臋 1. /bin/nano, czyli wciskam 1 i ENTER. Zostanie otwarta nasza tablica, na kt贸rej pocz膮tku b臋dzie do艣膰 d艂ugi komentarz. Mo偶emy ca艂kowicie usun膮膰 ten tekst lub po prostu go pomin膮膰 i przej艣膰 na koniec pliku. Tablica crontab dzia艂a tak, 偶e jedno zadanie to jedna linijka, kt贸ra sk艂ada si臋 z formu艂y definiuj膮cej interwa艂 (cz臋stotliwo艣膰) uruchamiania oraz polecenia, programu lub 艣cie偶ki do skryptu, kt贸re maj膮 zosta膰 wykonane. Notacja formu艂y interwa艂u sk艂ada si臋 z pi臋ciu cz臋艣ci, kolejno 鈥 minuta, godzina, dzie艅 miesi膮ca, miesi膮c, dzie艅 tygodnia. Bardzo pomocna tutaj jest strona Crontab Guru. Dla naszego zadania polecenie w tablicy zada艅 Cron powinno wygl膮da膰 tak:

0 5,15 * * * yunohost backup create

Taka notacja oznacza, 偶e polecenie yunohost backup create (wbudowane w YunoHost gotowe polecenie do wywo艂ania tworzenia kopii zapasowej) b臋dzie wykonywane w minucie 0, godzin 5 i 15, ka偶dego dnia, ka偶dego miesi膮ca, bez wzgl臋du jaki to dzie艅 tygodnia. Tablic臋 zamykamy tak samo jak zawsze wychodzimy z edytora tekstowego nano (ctrl+x, y, ENTER).

Super istotne jest, aby na obu serwerach mie膰 zsynchronizowane strefy czasowe, dlatego dla pewno艣ci ustawmy stref臋 odpowiedni膮 dla Polski:

timedatectl set-timezone Europe/Warsaw

Dodatkowo, po ka偶dej zmianie w tablicy zada艅 Cron nale偶y pami臋ta膰, aby przebudowa膰 proces i tym samym wprowadzi膰 zmiany w 偶ycie:

service cron reload

Na serwerze z YunoHost pozostaje nam jeszcze w艂膮czy膰 logowanie przy u偶yciu kluczy SSH, bo bez tego ci臋偶ko b臋dzie nam po艂膮czy膰 si臋 z poziomu serwera do backup’贸w. Jak to zrobi膰 opisa艂em tutaj.

To wszystko co mamy tutaj do zrobienia. Pora przej艣膰 na maszyn臋, kt贸ra b臋dzie nasz膮 przestrzeni膮 do przechowywania stworzonych kopii zapasowych.

Zadania do wykonania na serwerze do backup’贸w

Teraz prze艂膮czamy si臋 na serwer do backup’贸w. W pierwszej kolejno艣ci ustawmy r贸wnie偶 i tutaj stref臋 czasow膮 odpowiedni膮 dla Polski:

timedatectl set-timezone Europe/Warsaw

Skonfigurujmy teraz po艂膮czenie przez SSH do serwera z YunoHost. W tym celu w folderze /home/$USER/.ssh/ stw贸rzmy plik yunohost i wklei膰 do niego prywatny klucz SSH do serwera z YunoHost:

nano /home/$USER/.ssh/yunohost

Plik zapisujemy i wychodzimy z niego. Nadajmy mu odpowiednie uprawnienia:

chmod 600 /home/$USER/.ssh/yunohost

Dodajmy ten klucz prywatny do naszego „p臋ku” kluczy:

ssh-add /home/$USER/.ssh/yunohost

Od tego momentu powinni艣my by膰 w stanie z poziomu serwera do backup’贸w po艂膮czy膰 si臋 przez SSH do serwera z YunoHost, wi臋c sprawd藕my to u偶ywaj膮c poni偶szego polecenia sformatowanego odpowiednio do swoich potrzeb:

ssh <nazwa_admina>@<ip_serwera_z_yunohost>

Je偶eli wszystko zrobili艣my prawid艂owo to nie powinni艣my zosta膰 poproszeni o has艂o i bez problemu uzyska膰 dost臋p do pow艂oki serwera z YunoHost. Przerwijmy po艂膮czenie SSH i wr贸膰my z powrotem na serwer do backup’贸w u偶ywaj膮c polecenia:

exit

Do pobierania kopii zapasowych z serwera z YunoHost i przerzucania ich na serwer do backup’贸w u偶yjemy narz臋dzia scp, kt贸rego rozwini臋cie nazwy to Secure Copy (z ang. bezpieczne kopiowanie). Pozwala ono na proste i bezpieczne przenoszenie danych pomi臋dzy serwerami. Sk艂adnia scp dla naszego zastosowania jest nast臋puj膮ca:

scp <nazwa_admina>@<ip_serwera_z_yunohost>:<co_skopiowa膰> <gdzie_skopiowa膰>

Znamy ju偶 mechanizm pozyskiwania plik贸w z jednego serwera na drugi. Teraz trzeba zastanowi膰 si臋 nad strategi膮 jak zamierzamy to robi膰. Przypomnijmy sobie, 偶e na serwerze z YunoHost mamy uruchomione zadanie tworzenia kopii zapasowej ka偶dego dnia o godzinie 5:00 i 15:00. Tworzenie kopii zajmuje raczej mniej ni偶 minut臋, ale wraz ze wzrostem naszego 艣rodowiska YunoHost ten czas mo偶e ulec wyd艂u偶eniu, a wi臋c dla bezpiecze艅stwa przyjmijmy, 偶e kopi臋 zapasow膮 b臋dziemy pobiera膰 godzin臋 po jej wykonaniu, czyli o 6:00 i 16:00.

Nale偶y teraz zrozumie膰 jak YunoHost zarz膮dza kopiami zapasowymi. Do tworzenia kopii z poziomu terminala tw贸rcy udost臋pnili gotowe polecenie:

yunohost backup create

Polecenie to musi zosta膰 wykonane przez uprawnieniami administratora, a wi臋c albo bezpo艣rednio z poziomu u偶ytkownika root albo poprzedzone fraz膮 sudo. Taka sk艂adnia polecenia sprawi, 偶e zostan膮 u偶yte domy艣lne ustawienia tego narz臋dzia, a wi臋c zostanie stworzona kopia wszystkiego (konfiguracja systemu, dane u偶ytkownik贸w, aplikacje…), kt贸ra zostanie zapisana w folderze:

/home/yunohost.backup/archives/

Nazwa pod jak膮 zostanie zapisana dana kopia ma nast臋puj膮cy format:

<rok><miesi膮c><dzie艅><godzina><minuta><sekunda>.tar

Zatem je偶eli kopia powstanie 8 lipca 2023 o godzinie 12:34:56 to b臋dzie mia艂a ona nazw臋 20230708-123456.tar. Dlaczego skupiam si臋 na tym tak bardzo? Jest to istotne w kontek艣cie tego jak b臋dziemy okre艣la膰, kt贸ry plik ma zosta膰 pobrany, a wi臋c kt贸ra kopia jest najnowsz膮 i powinna zosta膰 pozyskana, aby zaj膮膰 miejsce obok ju偶 wcze艣niej pobranych kopii na serwer do backup’贸w. Zauwa偶, 偶e robi膮c dwie kopie dziennie b臋d臋 ka偶dego dnia mia艂 dwa pliki, kt贸rych cz臋艣膰 nazwy przed my艣lnikiem b臋dzie taka sama, bo to data. W takim razie mo偶na je rozr贸偶ni膰 tylko po drugiej cz臋艣ci nazwy (tej po my艣lniku), czyli na podstawie godziny utworzenia. Zauwa偶, 偶e celowo robi臋 dwie kopie, z kt贸rych pierwsza jest z 5:00, a wi臋c po my艣lniku w nazwie b臋dzie mia艂a 0 (zero), a druga jest z 15:00, a wi臋c po my艣lniku w nazwie b臋dzie mia艂a 1 (jedynk臋). W ten spos贸b kopia o nazwie 20230708-0* jest kopi膮 porann膮 zrobion膮 8 lipca 2023, a kopia o nazwie 20230708-1* jest kopi膮 popo艂udniow膮. U偶ycie znaku * w bash’u oznacza, 偶e pozosta艂a cz臋艣膰 nazwy mo偶e by膰 dowolna.

Skoro mamy ju偶 wszystko zaplanowane to w takim razie przyst膮pmy do dzia艂ania. Zacznijmy od utworzenia na serwerze do backup’贸w miejsca (folderu), w kt贸rym b臋dziemy przechowywa膰 pobrane kopie zapasowe.

mkdir /home/$USER/yunohost_backups

Teraz otw贸rzmy (lub utw贸rzmy je偶eli jeszcze nie istnieje) tablic臋 zada艅 Cron na tym serwerze:

crontab -e

Na ko艅cu otwartego pliku tekstowego wstawmy takie dwie linijki:

0 6 * * * scp admin@AAA.BBB.CCC.DDD:/home/yunohost.backup/archives/$(date +"%Y%m%d")-0* /home/$USER/yunohost_backups/
0 16 * * * scp admin@AAA.BBB.CCC.DDD:/home/yunohost.backup/archives/$(date +"%Y%m%d")-1* /home/$USER/yunohost_backups/

Pami臋taj tylko, aby fraz臋 admin zamieni膰 na nazw臋 swojego administratora YunoHost, a fraz臋 AAA.BBB.CCC.DDD na adres serwera z YunoHost. Plik zapisujemy i wychodzimy z niego. Powy偶sze dwie linijki wykonuj膮 prawie to samo tylko odpalaj膮 si臋 o dw贸ch r贸偶nych porach (codziennie o 6:00 i 16:00). W przypadku obu nast臋puje po艂膮czenie przez scp z serwerem z YunoHost, znalezienie pliku, kt贸rego nazwa zaczyna si臋 od dzisiejszej daty, nast臋pnie my艣lnika i w przypadku pierwszej linijki (odpalenie o 6:00) dalej mamy 0* (zero i dowolne inne znaki), a w przypadku drugiej linijki (odpalenie o 16:00) dalej mamy 1* (jedynka i dowolne inne znaki). Na ko艅cu ka偶dej z linijek jest jeszcze wskazanie 艣cie偶ki do folderu z kopiami zapasowymi na serwerze do backup’贸w.

Tak samo jak wcze艣niej musimy po modyfikacji zada艅 Cron prze艂adowa膰 t膮 us艂ug臋:

service cron reload

Jak zwykle czasem co艣 nie dzia艂a…

W moim przypadku jako serwer do backup鈥櫭硍 wybra艂em Mikrusa i natrafi艂em na ciekawy problem. Po jakim艣 czasie Mikrus ca艂kowicie zapomina m贸j klucz prywatny do serwera z YunoHost. I 偶eby tego by艂o ma艂o to jeszcze, gdy chcia艂em doda膰 go ponownie poleceniem ssh-add to otrzymywa艂em komunikat:

Could not open a connection to your authentication agent.

To znany problem, gdy pr贸buje si臋 u偶y膰 ssh-add, gdy ssh-agent nie dzia艂a jako proces. Wychodzi na to, 偶e proces ssh-agent jest z jakiego艣 powodu ubijany po pewnym czasie przez m贸j serwer鈥 Czy jest to problem nie do rozwi膮zania? Ale偶 sk膮d! Trzeba jednak nieco zmodyfikowa膰 przedstawione przeze mnie dzia艂ania.

W pierwszej kolejno艣ci musz臋 napisa膰 dwa skrypty, kt贸re zast膮pi膮 mi te dwa zadania z tablicy zada艅 Crona. Te skrypty b臋d膮:

  1. uruchamia艂y ssh-agent’a,
  2. dodawa艂y m贸j klucz prywatny do serwera z Yunohost do p臋ku kluczy,
  3. wykonywa艂y polecenie kopiuj膮ce plik z kopi膮 zapasow膮 przy u偶yciu scp tak jak to by艂o wcze艣niej.

Najpierw tworzymy pierwszy skrypt, kt贸ry b臋dzie cyklicznie uruchamiany o 6:00:

nano /home/$USER/yunohost_backup1.sh

Wklejmy do niego nast臋puj膮c膮 tre艣膰 (pami臋taj oczywi艣cie, aby zmodyfikowa膰 odpowiednio pod siebie frazy admin i AAA.BBB.CCC.DDD):

#!/bin/bash
eval "$(ssh-agent)"
ssh-add /home/$USER/.ssh/yunohost
scp admin@AAA.BBB.CCC.DDD:/home/yunohost.backup/archives/$(date +"%Y%m%d")-0* /home/$USER/yunohost_backups/

Nast臋pnie tworzymy drugi skrypt:

nano /home/$USER/yunohost_backup2.sh

Wklejmy do niego nast臋puj膮c膮 tre艣膰 (pami臋taj oczywi艣cie, aby zmodyfikowa膰 odpowiednio pod siebie frazy admin i AAA.BBB.CCC.DDD):

#!/bin/bash
eval "$(ssh-agent)"
ssh-add /home/$USER/.ssh/yunohost
scp admin@AAA.BBB.CCC.DDD:/home/yunohost.backup/archives/$(date +"%Y%m%d")-1* /home/$USER/yunohost_backups/

Teraz musimy uczyni膰 oba skrypty wykonywalnymi (nada膰 im uprawnienia do wykonywania si臋):

sudo chmod +x /home/$USER/yunohost_backup1.sh /home/$USER/yunohost_backup2.sh

Na koniec musimy zmodyfikowa膰 jeszcze tablic臋 zada艅 Cron:

crontab -e

Zamiast wcze艣niej ustawionych dw贸ch linijek wklejamy takie:

0 6 * * * /home/$USER/yunohost_backup1.sh
0 16 * * * /home/$USER/yunohost_backup2.sh

Tak zmodyfikowany spos贸b dzia艂ania rozwi膮zuje problem z ssh-agent’em.

Alternatywne rozwi膮zania

Trzeba przyzna膰, 偶e przedstawione przeze mnie rozwi膮zanie na pewno nie nale偶y do najbardziej wykwintnych. Pokazuje ono jednak, 偶e istnieje wiele sposob贸w jakimi mo偶na doj艣膰 do tego samego efektu. Je偶eli kto艣 szuka innego sposobu to YunoHost w swojej dokumentacji wspomina o trzech aplikacjach, z kt贸rych mo偶na skorzysta膰: BorgBackup, Restic i Archivist. Pr贸bowa艂em skorzysta膰 z tej ostatniej, ale zdaje si臋, 偶e aktualnie jest ona uszkodzona i po prostu nie dzia艂a… Mi臋dzyinnymi dlatego postanowi艂em wszystko ustawi膰 od pocz膮tku do ko艅ca po swojemu, bez polegania na aplikacjach zewn臋trznych. Polecam jednak zapozna膰 si臋 z dokumentacj膮 YunoHost i samemu zdecydowa膰, kt贸ra opcja dla Ciebie, drogi Czytelniku, wydaje si臋 najlepsza.


Je偶eli podoba艂 Ci si臋 ten wpis to mo偶esz mnie wesprze膰! 馃檪

Tomasz Dunia

馃嚨馃嚤 Z wykszta艂cenia Mechatronik. Z zawodu G艂贸wny Konstruktor w PAK-PCE Polski Autobus Wodorowy (Neso Bus). Po pracy Ojciec Roku. W nocy Wannabe Programista. Wszystko to daje przepis na zwyk艂ego nerda :) 馃嚞馃嚙 Mechatronics by education. By profession Chief Constructor in PAK-PCE Polish Hydrogen Bus (Neso Bus). After work Father of the Year. At night Wannabe Programmer. All this gives a recipe for an ordinary nerd :)

svg

Co my艣lisz?

Poka偶 komentarze / Napisz komentarz

5 komentarzy

  • Ch艂op Marcin :fediverse:

    10 maja, 2023 / at 12:57 pmsvgOdpowiedz

    @to3k Robisz naprawd臋 艣wietn膮 robot臋 tymi swoimi poradnikami! Dzi臋kuj臋! 馃憣

  • Grzegorz Cichocki

    10 maja, 2023 / at 2:44 pmsvgOdpowiedz

    @to3k@blog.tomaszdunia.pl @to3k@tomaszdunia.pl a co ze starymi backupami? Zapewne kilka ostatnich ma warto艣膰, a reszta mo偶e trafi膰 spokojnie do kosza. Tym bardziej przy dw贸ch backupach dziennie pami臋膰 zar贸wno na jednej, jak i drugiej maszynie zapcha si臋 i to szybko, wi臋c trzeba te stare archiwa usuwa膰. Problem ten rozwi膮za艂em u siebie: https://github.com/cichy1173/yh-backup usuwaj膮c starsze backupy oraz symlinki do nich w /home/yunohost.backup/archives. 1/2

  • MorganMLG

    10 maja, 2023 / at 3:45 pmsvgOdpowiedz

    @to3k Nie chc臋 si臋 za bardzo czepia膰, ale widz臋, 偶e pomin膮艂e艣 w swoim wpisie kilka dosy膰 istotnych element贸w. Ustawianie na sztywno czasu, po kt贸rym backup ma zosta膰 przekopiowany na drugi serwer to bardzo prosta i szybka droga, 偶eby w momencie, gdy b臋dziemy potrzebowa膰 odzyska膰 backup zwyczajnie go nie mie膰. Ju偶 t艂umacz臋. Twoje rozwi膮zanie zadzia艂a, ale ma powa偶n膮 wad臋, gdy ju偶 skonfigurujemy tworzenie i kopiowanie backup贸w, to wszystko si臋 艂adnie utworzy i przekopiuje o wyznaczonym czasie. U偶ytkownik szcz臋艣liwy ze swojego sukcesu jeszcze mo偶e sprawdzi po dniu, dw贸ch, tygodniu czy backupy s膮 tworzone, a p贸藕niej o tym zapomni. Gdy danych na serwerze b臋dzie przybywa膰, czas wykonania backupu b臋dzie co raz wi臋kszy. Gdy czas wykonania backupu b臋dzie d艂u偶szy ni偶 1 godzina, wtedy skrypt kopiuj膮cy backup na drugi serwer, prawdopodobnie skopiuje uszkodzone archiwum tar, albo nie skopiuje nic (nie mam jak teraz sprawdzi膰 jak zachowa si臋 scp). Kolejne kopie backup贸w, je偶eli czas backupu b臋dzie wi臋kszy ni偶 1 godzina, zwyczajnie b臋d膮 do wyrzucenia. Obecnie posiadam dwa serwery i czas tworzenia backup贸w na jednym z nich to oko艂o 45 minut , a na drugim ju偶 grubo ponad 1 godzina. Nie u偶ywam YH ale skoro, backupy s膮 zapisywane w formacie "<rok><miesi膮c><dzie艅>鈥<godzina><minuta><sekunda>.tar" to wystarczy zwyk艂e "ls | tail -1", 偶eby pobra膰 ostatnio utworzony backup. Wtedy wystarczy zwyk艂y "lsof | grep <to co zwr贸ci ls>" 偶eby sprawdzi膰 czy plik jest aktualnie otwarty. Je偶eli nie jest to 艣mia艂o mo偶emy go kopiowa膰 na drugi serwer. Doda膰 do tego sprawdzenie czy taki plik ju偶 istnieje na drugim serwerze i wtedy czas uruchomienia kopiowania backup贸w nie ma 偶adnego znaczenia i mo偶e by膰 uruchamiany spokojnie co godzin臋.

    • Tomasz Dunia

      10 maja, 2023 / at 4:05 pmsvgOdpowiedz

      @morganmlg@101010.pl O dzi臋ki za podpowiedzi! S膮 dla mnie bardzo cenne, bo nie b臋d臋 udawa艂, 偶e jestem ekspertem, a jedynie hobbistycznie zajmuj臋 si臋 takimi rzeczami i jak si臋 czego艣 naucz臋 to wtedy o tym publikuj臋 馃槈 Zbadam i przemy艣l臋 temat i wprowadz臋 modyfikacje we wpisie lub utworz臋 zupe艂nie nowy 馃槈

Odpowiedz

svg
Szybka nawigacja
  • 01

    YunoHost – kopia zapasowa