{"id":86904,"date":"2020-07-01T07:42:30","date_gmt":"2020-07-01T05:42:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud"},"modified":"2020-07-01T07:42:30","modified_gmt":"2020-07-01T05:42:30","slug":"kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","title":{"rendered":"Jak GitLab pomaga tworzy\u0107 kopie zapasowe du\u017cych zasob\u00f3w NextCloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107, Habr!<\/p>\n<p><\/p>\n<p>Dzi\u015b chc\u0119 opowiedzie\u0107 o naszym do\u015bwiadczeniu w automatyzacji tworzenia kopii zapasowych du\u017cych zasob\u00f3w danych w Nextcloud w r\u00f3\u017cnych konfiguracjach. Pracuj\u0119 jako CTO w \u201eMolnia AK\u201d, gdzie zajmujemy si\u0119 zarz\u0105dzaniem konfiguracj\u0105 system\u00f3w IT, a do przechowywania danych u\u017cywamy Nextcloud. W tym r\u00f3wnie\u017c z rozproszon\u0105 struktur\u0105 i z rezerwacj\u0105.<\/p>\n<p><\/p>\n<p>Problemy wynikaj\u0105ce z charakterystyki instalacji polegaj\u0105 na tym, \u017ce danych jest du\u017co. Wersjonowanie, kt\u00f3re oferuje Nextcloud, rezerwacja, subiektywne przyczyny i inne czynniki tworz\u0105 wiele duplikat\u00f3w.<\/p>\n<p><\/p>\n<h2 id=\"predystoriya\">T\u0142o<\/h2>\n<p><\/p>\n<p>Podczas administracji Nextcloud pojawia si\u0119 problem organizacji efektywnej kopii zapasowej, kt\u00f3r\u0105 nale\u017cy obowi\u0105zkowo szyfrowa\u0107, poniewa\u017c dane s\u0105 cenne.<\/p>\n<p><\/p>\n<p>Oferujemy warianty przechowywania kopii zapasowej u nas lub u klienta na jego oddzielnych maszynach od Nextcloud, co wymaga elastycznego zautomatyzowanego podej\u015bcia do administracji.<\/p>\n<p><\/p>\n<p>Mamy wielu klient\u00f3w, wszyscy maj\u0105 r\u00f3\u017cne konfiguracje, a tak\u017ce s\u0105 na swoich lokalizacjach z w\u0142asnymi szczeg\u00f3\u0142ami. Standardowa metoda, w kt\u00f3rej ca\u0142a lokalizacja nale\u017cy do Ciebie, i kopie zapasowe s\u0105 tworzone na podstawie crona, s\u0142abo pasuje.<\/p>\n<p><\/p>\n<p>Na pocz\u0105tek sp\u00f3jrzmy na dane wej\u015bciowe. Potrzebujemy:<\/p>\n<p><\/p>\n<ul>\n<li>Skalowalno\u015bci w przypadku jednej w\u0119z\u0142a lub kilku. Dla du\u017cych instalacji u\u017cywamy minio jako magazynu.<\/li>\n<li>Zidentyfikowa\u0107 problemy z realizacj\u0105 kopii zapasowych.<\/li>\n<li>Musimy przechowywa\u0107 kopie zapasowe u klient\u00f3w i\/lub u nas.<\/li>\n<li>Szybkie i \u0142atwe rozwi\u0105zywanie problem\u00f3w.<\/li>\n<li>Klienci i instalacje znacznie r\u00f3\u017cni\u0105 si\u0119 od siebie \u2014 trudno osi\u0105gn\u0105\u0107 jednorodno\u015b\u0107.<\/li>\n<li>Czas przywracania powinien by\u0107 minimalny w dw\u00f3ch scenariuszach: pe\u0142ne przywr\u00f3cenie (katastrofa) i jedna folder \u2014 usuni\u0119ty przez pomy\u0142k\u0119.<\/li>\n<li>Funkcja deduplikacji jest obowi\u0105zkowa.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jak GitLab pomaga tworzy\u0107 kopie zapasowe du\u017cych zasob\u00f3w NextCloud\" src=\"\/wp-content\/uploads\/2020\/07\/1a0048e3295fef94ddca28e50612e3cb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Do rozwi\u0105zania problemu zarz\u0105dzania kopiami zapasowymi pod\u0142\u0105czyli\u015bmy GitLab. Wi\u0119cej szczeg\u00f3\u0142\u00f3w w podsumowaniu. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Oczywi\u015bcie nie jeste\u015bmy pierwszymi, kt\u00f3rzy rozwi\u0105zuj\u0105 podobne zadanie, ale wydaje nam si\u0119, \u017ce nasze praktyczne do\u015bwiadczenie mo\u017ce by\u0107 interesuj\u0105ce i jeste\u015bmy gotowi si\u0119 nim podzieli\u0107.<\/p>\n<p><\/p>\n<p>Poniewa\u017c w naszej firmie przyj\u0119to polityk\u0119 open source, szukali\u015bmy rozwi\u0105zania z otwartym kodem \u017ar\u00f3d\u0142owym. Z naszej strony dzielimy si\u0119 swoimi rozwini\u0119ciami i publikujemy je. Na przyk\u0142ad, na GitHubie znajduje si\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/molnia-com\/nextcloud-safe-trash\">nasz plugin do Nextcloud<\/a><\/noindex>, kt\u00f3ry instalujemy u klient\u00f3w, wzmacniaj\u0105cy bezpiecze\u0144stwo danych na wypadek przypadkowego lub zamierzonego usuni\u0119cia.<\/p>\n<p><\/p>\n<h2 id=\"sredstva-bekapirovaniya\">Narz\u0119dzia do tworzenia kopii zapasowych<\/h2>\n<p><\/p>\n<p>Rozpocz\u0119li\u015bmy poszukiwania metod rozwi\u0105zania od wyboru narz\u0119dzia do tworzenia kopii zapasowych.<\/p>\n<p><\/p>\n<p>Tradycyjny tar + gzip dzia\u0142a s\u0142abo \u2014 dane si\u0119 powtarzaj\u0105. Inkremet cz\u0119sto zawiera bardzo ma\u0142o zmian w rzeczywisto\u015bci, a wi\u0119kszo\u015b\u0107 danych w jednym pliku si\u0119 powtarza.<br \/>\nJest jeszcze jeden problem \u2014 nadmiarowo\u015b\u0107 rozproszonego magazynu danych. U\u017cywamy minio, a jego dane generalnie s\u0105 nadmiarowe. Musieliby\u015bmy robi\u0107 kopi\u0119 zapasow\u0105 za pomoc\u0105 samego minio \u2014 obci\u0105\u017caj\u0105c je i korzystaj\u0105c ze wszystkich po\u0142\u0105cze\u0144 mi\u0119dzy systemem plik\u00f3w, a co nie mniej wa\u017cne, istnieje ryzyko zapomnienia o cz\u0119\u015bci wiader i metainformacji. Albo u\u017cy\u0107 deduplikacji.<\/p>\n<p><\/p>\n<p>Narz\u0119dzia do tworzenia kopii zapasowych z deduplikacj\u0105 s\u0105 dost\u0119pne w open source (na habrze by\u0142y <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/449282\/\">artyku\u0142u<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/420055\/\">na ten temat<\/a><\/noindex>) i naszymi finalistami zosta\u0142y <noindex><a rel=\"nofollow\" href=\"https:\/\/borgbackup.readthedocs.io\/en\/stable\/\">Borg<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/restic.net\/\">Restic<\/a><\/noindex>. O naszym por\u00f3wnaniu dw\u00f3ch aplikacji poni\u017cej, a teraz opowiemy, jak zorganizowali\u015bmy ca\u0142y schemat.<\/p>\n<p><\/p>\n<h2 id=\"upravlenie-sozdaniem-rezervnyh-kopiy\">Zarz\u0105dzanie tworzeniem kopii zapasowych<\/h2>\n<p><\/p>\n<p>Borg i Restic s\u0105 dobre, ale \u017caden z tych produkt\u00f3w nie ma scentralizowanego mechanizmu zarz\u0105dzania. Do zarz\u0105dzania i kontroli wybrali\u015bmy narz\u0119dzie, kt\u00f3re i tak mamy wdro\u017cone, bez kt\u00f3rego nie wyobra\u017camy sobie naszej pracy, w tym automatyzacji \u2014 to znany CI\/CD \u2013 GitLab.<\/p>\n<p><\/p>\n<p>Pomys\u0142 jest nast\u0119puj\u0105cy: na ka\u017cd\u0105 w\u0119ze\u0142 przechowuj\u0105cy dane Nextcloud instalujemy gitlab-runner. Runner uruchamia zgodnie z harmonogramem skrypt monitoruj\u0105cy proces tworzenia kopii zapasowych, kt\u00f3ry uruchamia Borg lub Restic.<\/p>\n<p><\/p>\n<p>Co osi\u0105gn\u0119li\u015bmy? Informacj\u0119 zwrotn\u0105 z wykonania, wygodn\u0105 kontrol\u0119 zmian, szczeg\u00f3\u0142y w przypadku b\u0142\u0119du.<\/p>\n<p><\/p>\n<p>Oto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/molnia-com\/backup-by-runner\">tutaj na GitHubie<\/a><\/noindex> opublikowali\u015bmy przyk\u0142ady skryptu do r\u00f3\u017cnych zada\u0144, a my ostatecznie przy\u0142\u0105czyli\u015bmy go do kopii zapasowej nie tylko Nextcloud, ale i wielu innych us\u0142ug. Tam jest r\u00f3wnie\u017c planista, je\u015bli nie chce si\u0119 go r\u0119cznie konfigurowa\u0107 (a nam si\u0119 nie chce) i .gitlab-ci.yml.<\/p>\n<p><\/p>\n<p>W API GitLaba na razie nie ma mo\u017cliwo\u015bci zmiany czasu ci\u0119cia CI\/CD, a on jest tam ma\u0142y. Nale\u017cy go zwi\u0119kszy\u0107, powiedzmy, do <code>1d<\/code>.<\/p>\n<p><\/p>\n<p>Na szcz\u0119\u015bcie GitLab potrafi uruchamia\u0107 nie tylko na podstawie commit\u00f3w, ale i zgodnie z harmonogramem, to dok\u0142adnie to, czego potrzebujemy.<\/p>\n<p><\/p>\n<p>Teraz o skrypcie opakowuj\u0105cym.<\/p>\n<p><\/p>\n<p>Postawili\u015bmy nast\u0119puj\u0105ce wymagania dla tego skryptu:<\/p>\n<p><\/p>\n<ul>\n<li>Musi si\u0119 uruchamia\u0107 zar\u00f3wno jako runner, jak i r\u0119cznie z konsoli z takim samym funkcjonalno\u015bci\u0105.<\/li>\n<li>Musi mie\u0107 obs\u0142ug\u0119 b\u0142\u0119d\u00f3w:<\/li>\n<li>kod powrotu.<\/li>\n<li>wyszukiwanie ci\u0105gu w logu. Przyk\u0142ad: dla nas b\u0142\u0119dem mo\u017ce by\u0107 komunikat, kt\u00f3ry program nie uznaje za krytyczny.<\/li>\n<li>Czas oczekiwania przetwarzania. Czas wykonania powinien by\u0107 rozs\u0105dny.<\/li>\n<li>Potrzebujemy szczeg\u00f3\u0142owego logu. Ale tylko w przypadku b\u0142\u0119du.<\/li>\n<li>Przeprowadza si\u0119 r\u00f3wnie\u017c szereg test\u00f3w przed rozpocz\u0119ciem.<\/li>\n<li>Kilka drobnych udogodnie\u0144, kt\u00f3re uznali\u015bmy za przydatne w procesie wsparcia:<\/li>\n<li>Uruchomienie i zako\u0144czenie jest rejestrowane w dzienniku lokalnej maszyny. Pomaga to powi\u0105za\u0107 b\u0142\u0119dy systemowe z dzia\u0142aniem kopii zapasowej.<\/li>\n<li>Cz\u0119\u015b\u0107 logu b\u0142\u0119d\u00f3w, gdy wyst\u0119puj\u0105, jest wydawana w stdout, ca\u0142y log zapisywany jest w osobnym pliku. Wygodnie jest od razu spojrze\u0107 w CI i oceni\u0107 b\u0142\u0105d, je\u015bli jest trywialny.<\/li>\n<li>Tryby debugowania.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pe\u0142ny log jest przechowywany jako artefakt w GitLab, je\u015bli nie ma b\u0142\u0119d\u00f3w, log jest usuwany. Skrypt piszemy w bashu.<\/p>\n<p><\/p>\n<p>B\u0119dziemy wdzi\u0119czni za wszelkie propozycje i uwagi dotycz\u0105ce open source \u2014 zapraszamy.<\/p>\n<p><\/p>\n<h2 id=\"kak-eto-rabotaet\">Jak to dzia\u0142a<\/h2>\n<p><\/p>\n<p>Na node, kt\u00f3ry jest kopii zapasowej, uruchamiany jest runner z wykonawc\u0105 w bashu. W schedulerze w specjalnym repozytorium uruchamiane jest job CI\/CD. Runner uruchamia skrypt jako uniwersaln\u0105 nak\u0142adk\u0119 dla takich zada\u0144, w nim przechodz\u0105 kontrole wa\u017cno\u015bci repozytorium kopii zapasowej, punkt\u00f3w montowania i wszystkiego, co zechcemy, nast\u0119pnie wykonywane jest tworzenie kopii zapasowej i oczyszczanie starego. Gotowa kopia zapasowa jest wysy\u0142ana na S3.<\/p>\n<p><\/p>\n<p>Dzia\u0142amy w ten spos\u00f3b \u2014 to zewn\u0119trzny dostawca AWS lub rosyjski odpowiednik (jest to szybsze i dane nie opuszczaj\u0105 RF). Albo instalujemy klientowi oddzielny klaster minio na jego terenie do tych cel\u00f3w. Zwykle tak robimy z powod\u00f3w bezpiecze\u0144stwa, gdy klient ca\u0142kowicie nie chce, aby dane opu\u015bci\u0142y ich kontur.<\/p>\n<p><\/p>\n<p>Nie skorzystali\u015bmy z funkcji wysy\u0142ania kopii zapasowej przez ssh. To nie zwi\u0119ksza bezpiecze\u0144stwa, a mo\u017cliwo\u015bci sieciowe dostawcy S3 s\u0105 znacznie wy\u017csze ni\u017c jednego naszego serwera ssh.<\/p>\n<p><\/p>\n<p>Aby zabezpieczy\u0107 si\u0119 przed hakerem na lokalnej maszynie \u2014 poniewa\u017c mo\u017ce on usun\u0105\u0107 dane na S3, konieczne jest w\u0142\u0105czenie wersjonowania.<br \/>\nKopia zapasowa jest zawsze szyfrowana.<\/p>\n<p><\/p>\n<p>Borg ma tryb bez szyfrowania. <code>none<\/code>, ale zdecydowanie nie zalecamy jego w\u0142\u0105czania. W tym trybie nie b\u0119dzie nie tylko szyfrowania, ale nie oblicza si\u0119 sumy kontrolnej tego, co jest zapisywane, a wi\u0119c integralno\u015b\u0107 mo\u017cna sprawdzi\u0107 tylko po\u015brednio, wed\u0142ug indeks\u00f3w.<\/p>\n<p><\/p>\n<p>Oddzielny scheduler przeprowadza kontrol\u0119 kopii zapasowych pod k\u0105tem integralno\u015bci indeks\u00f3w i zawarto\u015bci. Kontrola odbywa si\u0119 powoli i d\u0142ugo, dlatego uruchamiamy j\u0105 osobno raz w miesi\u0105cu. Mo\u017ce trwa\u0107 kilka dni.<\/p>\n<p><\/p>\n<h2 id=\"ridmi-na-russkom\">Readme w j\u0119zyku rosyjskim<\/h2>\n<p><\/p>\n<h3 id=\"osnovnye-funkcii\">G\u0142\u00f3wne funkcje<\/h3>\n<p><\/p>\n<ul>\n<li><code>prepare<\/code> przygotowanie<\/li>\n<li><code>testcheck<\/code> sprawdzanie gotowo\u015bci<\/li>\n<li><code>maincommand<\/code> g\u0142\u00f3wna komenda<\/li>\n<li><code>forcepostscript<\/code> funkcja, kt\u00f3ra jest wykonywana na ko\u0144cu lub w przypadku b\u0142\u0119du. U\u017cywamy jej, aby odmontowa\u0107 partycj\u0119.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"service-functions\">Funkcje serwisowe<\/h3>\n<p><\/p>\n<ul>\n<li><code>cleanup<\/code> rejestrujemy b\u0142\u0119dy lub usuwamy plik dziennika.<\/li>\n<li><code>checklog<\/code> parsujemy dziennik w poszukiwaniu b\u0142\u0119d\u00f3w.<\/li>\n<li><code>ret<\/code> mened\u017cer wyj\u015bcia.<\/li>\n<li><code>checktimeout<\/code> sprawdzanie czasu oczekiwania.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"environment\">\u015arodowisko<\/h3>\n<p><\/p>\n<ul>\n<li><code>VERBOSE=1<\/code> natychmiastowe wy\u015bwietlanie b\u0142\u0119d\u00f3w na ekranie (stdout).<\/li>\n<li><code>SAVELOGSONSUCCES=1<\/code> zapisujemy dziennik przy sukcesie.<\/li>\n<li><code>INIT_REPO_IF_NOT_EXIST=1<\/code> Tworzymy repozytorium, je\u015bli nie istnieje. Domy\u015blnie wy\u0142\u0105czone.<\/li>\n<li><code>TIMEOUT<\/code> maksymalny czas na g\u0142\u00f3wn\u0105 operacj\u0119. Mo\u017cesz ustawi\u0107 go jako &#8216;m&#8217;, &#8216;h&#8217; lub &#8216;d&#8217; na ko\u0144cu.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tryb przechowywania starych kopii. Domy\u015blnie:<\/p>\n<p><\/p>\n<ul>\n<li><code>KEEP_DAILY=7<\/code><\/li>\n<li><code>KEEP_WEEKLY=4<\/code><\/li>\n<li><code>KEEP_MONTHLY=6<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"peremennye-vnutri-skripta\">Zmienne wewn\u0105trz skryptu<\/h2>\n<p><\/p>\n<ul>\n<li><code>ERROR_STRING<\/code> \u2014 ci\u0105g do sprawdzenia w dzienniku pod k\u0105tem b\u0142\u0119du.<\/li>\n<li><code>EXTRACT_ERROR_STRING<\/code> \u2014 wyra\u017cenie pokazuj\u0105ce ci\u0105g w przypadku b\u0142\u0119du.<\/li>\n<li><code>KILL_TIMEOUT_SIGNAL<\/code> \u2014 sygna\u0142 do zabicia procesu, je\u015bli wyst\u0105pi\u0142 timeout.<\/li>\n<li><code>TAIL<\/code> \u2014 ile linii z b\u0142\u0119dami wy\u015bwietli\u0107 na ekranie.<\/li>\n<li><code>COLORMSG<\/code> \u2014 kolor wiadomo\u015bci (domy\u015blnie \u017c\u00f3\u0142ty).<\/li>\n<\/ul>\n<p><\/p>\n<p>Skrypt, nazywany roboczo wordpress, ma na celu r\u00f3wnie\u017c tworzenie kopii zapasowych bazy mysql. Oznacza to, \u017ce mo\u017cna go u\u017cywa\u0107 do jednorazowych instalacji Nexcloud, gdzie mo\u017cna tak\u017ce wykona\u0107 kopi\u0119 zapasow\u0105 bazy. Wygoda polega nie tylko na tym, \u017ce wszystko jest w jednym miejscu, ale tak\u017ce na tym, \u017ce zawarto\u015b\u0107 bazy jest zbli\u017cona do zawarto\u015bci plik\u00f3w, poniewa\u017c r\u00f3\u017cnica czasowa jest minimalna.<\/p>\n<p><\/p>\n<h2 id=\"restic-vs-borg\">Restic vs Borg<\/h2>\n<p><\/p>\n<p>Por\u00f3wnania Borg i Restic s\u0105 dost\u0119pne r\u00f3wnie\u017c <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/454734\/\">tutaj na Habrze<\/a><\/noindex>, a naszym celem nie by\u0142o stworzenie jeszcze jednego, ale swojego. Wa\u017cne by\u0142o dla nas, jak to b\u0119dzie wygl\u0105da\u0107 na naszych danych, z nasz\u0105 specyfik\u0105. Przedstawiamy je.<\/p>\n<p><\/p>\n<p>Nasze kryteria wyboru, opr\u00f3cz ju\u017c wspomnianych (deduplikacja, szybkie przywracanie itp.):<\/p>\n<p><\/p>\n<ul>\n<li>Odporno\u015b\u0107 na niedoko\u0144czon\u0105 prac\u0119. Sprawdzenie na kill -9.<\/li>\n<li>Rozmiar na dysku.<\/li>\n<li>Wymagania dotycz\u0105ce zasob\u00f3w (CPU, pami\u0119\u0107).<\/li>\n<li>Rozmiar przechowywanych blob\u00f3w.<\/li>\n<li>Praca z S3.<\/li>\n<li>Sprawdzanie integralno\u015bci.<\/li>\n<\/ul>\n<p><\/p>\n<p>Do test\u00f3w wzi\u0119li\u015bmy jednego klienta z rzeczywistymi danymi o \u0142\u0105cznej wielko\u015bci 1,6 TB.<br \/>\nWarunki.<\/p>\n<p><\/p>\n<p>Borg nie obs\u0142uguje bezpo\u015brednio pracy z S3, montowali\u015bmy jako dysk fuse, przez <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kahing\/goofys\">goofys<\/a><\/noindex>. Restic wysy\u0142a\u0142 dane do S3 samodzielnie.<\/p>\n<p><\/p>\n<p>Goofys dzia\u0142a bardzo szybko i dobrze, i ma <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kahing\/catfs\">modu\u0142 pami\u0119ci podr\u0119cznej na dysku<\/a><\/noindex>, co dodatkowo przyspiesza prac\u0119. Jest w fazie beta i, przyzna\u0107 trzeba, \u017ce w testach (innych) zdarza\u0142y si\u0119 awarie z utrat\u0105 danych. Wygoda polega na tym, \u017ce sama procedura tworzenia kopii zapasowej nie wymaga du\u017cego czytania, a g\u0142\u00f3wnie polega na zapisie, dlatego pami\u0119\u0107 podr\u0119czna u\u017cywamy tylko podczas sprawdzania integralno\u015bci.<\/p>\n<p><\/p>\n<p>Aby zminimalizowa\u0107 wp\u0142yw sieci, korzystali\u015bmy z lokalnego dostawcy \u2014 Yandex Cloud.<\/p>\n<p><\/p>\n<p>Wyniki testowania por\u00f3wnawczego.<\/p>\n<p><\/p>\n<ul>\n<li>Kill -9 z dalszym uruchomieniem obie przesz\u0142y pomy\u015blnie.<\/li>\n<li>Rozmiar na dysku. Borg potrafi kompresowa\u0107, dlatego wyniki s\u0105 przewidywalne.<\/li>\n<\/ul>\n<p><\/p>\n<p>Backuper<br \/>\nWymiary<\/p>\n<p>Borg<br \/>\n562Gb<\/p>\n<p>Restic<br \/>\n628Gb<\/p>\n<p><\/p>\n<ul>\n<li>Po CPU<br \/>\nSamo w sobie borg zu\u017cywa ma\u0142o przy domy\u015blnej kompresji, ale nale\u017cy ocenia\u0107 razem z procesem goofys. W sumie s\u0105 por\u00f3wnywalne i wykorzystuj\u0105 oko\u0142o 1,2 rdzenia na tej samej testowej maszynie wirtualnej.<\/li>\n<li>Pami\u0119\u0107. Restic oko\u0142o 0,5Gb, Borg oko\u0142o 200Mb. Ale to wszystko jest nieistotne w por\u00f3wnaniu z pami\u0119ci\u0105 podr\u0119czn\u0105 systemu. Tak wi\u0119c warto przydzieli\u0107 wi\u0119cej pami\u0119ci.<\/li>\n<li>R\u00f3\u017cnica w rozmiarze blob\u00f3w okaza\u0142a si\u0119 znacz\u0105ca.<\/li>\n<\/ul>\n<p><\/p>\n<p>Backuper<br \/>\nWymiary<\/p>\n<p>Borg<br \/>\noko\u0142o 500Mb<\/p>\n<p>Restic<br \/>\noko\u0142o 5Mb<\/p>\n<p><\/p>\n<ul>\n<li>Praca z S3 z Restic jest doskona\u0142a. Praca Borg przez goofys nie budzi w\u0105tpliwo\u015bci, ale zauwa\u017cono, \u017ce po zako\u0144czeniu backupu warto zrobi\u0107 umount, aby ca\u0142kowicie zresetowa\u0107 pami\u0119\u0107 podr\u0119czn\u0105. Specyfika pracy z S3 polega na tym, \u017ce niedoko\u0144czone cz\u0105stki nigdy nie zostan\u0105 wys\u0142ane do koszyka, a wi\u0119c niedoko\u0144czone dane prowadz\u0105 do powa\u017cnych uszkodze\u0144.<\/li>\n<li>Sprawdzanie integralno\u015bci dzia\u0142a dobrze w obu przypadkach, ale pr\u0119dko\u015b\u0107 si\u0119 znacznie r\u00f3\u017cni.<br \/>\nRestic \u2013 <strong>3,5 godziny<\/strong>.<br \/>\nBorg, z pami\u0119ci\u0105 podr\u0119czn\u0105 plik\u00f3w 100Gb SSD \u2013 <strong>5 godzin<\/strong>.Mniej wi\u0119cej taki sam wynik pr\u0119dko\u015bci, je\u015bli dane znajduj\u0105 si\u0119 na lokalnym dysku.<br \/>\nBorg odczytuje bezpo\u015brednio z S3 bez pami\u0119ci podr\u0119cznej <strong>33 godziny<\/strong>.Ogromnie d\u0142ugo.<\/li>\n<\/ul>\n<p><\/p>\n<p>W ostatecznym rozrachunku Borg potrafi kompresowa\u0107 i ma wi\u0119ksze bloby \u2014 co sprawia, \u017ce przechowywanie i operacje GET\/PUT w S3 s\u0105 ta\u0144sze. Ale za to trzeba p\u0142aci\u0107 bardziej skomplikowanym i wolniejszym sprawdzaniem. Je\u015bli chodzi o pr\u0119dko\u015b\u0107 przywracania \u2014 nie zauwa\u017cyli\u015bmy r\u00f3\u017cnicy. Kolejne kopie zapasowe (po pierwszym) restic wykonuje nieco d\u0142u\u017cej, ale nie znacz\u0105co.<\/p>\n<p><\/p>\n<p>Nie na ostatnim miejscu w wyborze sta\u0142 rozmiar spo\u0142eczno\u015bci.<\/p>\n<p><\/p>\n<p>I wybrali\u015bmy borg.<\/p>\n<p><\/p>\n<h2 id=\"paru-slov-o-szhatii\">Kilka s\u0142\u00f3w o kompresji<\/h2>\n<p><\/p>\n<p>Borg ma w arsenale doskona\u0142y nowy algorytm kompresji \u2014 zstd. Pod wzgl\u0119dem jako\u015bci kompresji nie gorszy ni\u017c gzip, ale znacznie szybszy. I por\u00f3wnywalny pod wzgl\u0119dem pr\u0119dko\u015bci z domy\u015blnym lz4.<\/p>\n<p><\/p>\n<p>Na przyk\u0142ad zrzut bazy MySQL kompresuje si\u0119 dwa razy lepiej ni\u017c lz4 przy tej samej pr\u0119dko\u015bci. Jednak do\u015bwiadczenie na rzeczywistych danych pokazuje bardzo niewielk\u0105 r\u00f3\u017cnic\u0119 w stopniu kompresji w\u0119z\u0142\u00f3w Nextcloud.<\/p>\n<p><\/p>\n<p>W Borg jest dosy\u0107 bonusowy tryb kompresji \u2014 je\u015bli plik ma du\u017c\u0105 entropi\u0119, kompresja w og\u00f3le nie jest stosowana, co zwi\u0119ksza pr\u0119dko\u015b\u0107 dzia\u0142ania. Jest w\u0142\u0105czana opcj\u0105 przy tworzeniu<br \/>\n<code>-C auto,zstd<\/code><br \/>\ndla algorytmu zstd<br \/>\nA wi\u0119c z t\u0105 opcj\u0105 w por\u00f3wnaniu z domy\u015bln\u0105 kompresj\u0105 uzyskali\u015bmy<br \/>\n560 Gb i 562 Gb odpowiednio. Jak przypominam, dane z powy\u017cszego przyk\u0142adu bez kompresji daj\u0105 wynik 628 Gb. Wynik z r\u00f3\u017cnic\u0105 2 Gb zaskoczy\u0142 nas nieco, ale uznali\u015bmy, \u017ce i tak wybierzemy. <code>auto,zstd<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"metodika-proverki-bekapa\">Metoda weryfikacji kopii zapasowej<\/h2>\n<p><\/p>\n<p>Na podstawie harmonogramu uruchamiana jest wirtualna maszyna bezpo\u015brednio u dostawcy lub u klienta, co znacznie zmniejsza obci\u0105\u017cenie sieci. Przynajmniej jest to ta\u0144sze ni\u017c uruchamianie u siebie i przesy\u0142anie ruchu.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">goofys --cache &quot;--free:5%:\\\/mnt\\\/cache&quot; -o allow_other --endpoint https:\/\/storage.yandexcloud.net --file-mode=0666 --dir-mode=0777 xxxxxxx.com \\\/mnt\\\/goofys\nexport BORG_PASSCOMMAND=&quot;cat \\\/home\\\/borg\\\/.borg-passphrase&quot;\nborg list \\\/mnt\\\/goofys\\\/borg1\\\/\nborg check --debug -p --verify-data \\\/mnt\\\/goofys\\\/borg1\\\/<\/code><\/pre>\n<p><\/p>\n<p>Na tej samej zasadzie sprawdzamy pliki antywirusowe (post factum). U\u017cytkownicy przesy\u0142aj\u0105 r\u00f3\u017cne dane do Nextcloud i nie wszyscy maj\u0105 oprogramowanie antywirusowe. Sprawdzenie w momencie przesy\u0142ania zajmuje zbyt du\u017co czasu i przeszkadza w dzia\u0142alno\u015bci.<\/p>\n<p><\/p>\n<p>Skalowalno\u015b\u0107 osi\u0105ga si\u0119 poprzez uruchamianie runner\u00f3w na r\u00f3\u017cnych w\u0119z\u0142ach z r\u00f3\u017cnymi tagami.<br \/>\nW naszym monitoringu gromadzone s\u0105 statusy kopii zapasowych przez API GitLab w jednym oknie, w razie potrzeby \u0142atwo zauwa\u017cy\u0107 problemy, kt\u00f3re r\u00f3wnie\u017c \u0142atwo mo\u017cna zlokalizowa\u0107.<\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Podsumowanie<\/h2>\n<p><\/p>\n<p>Ostatecznie dok\u0142adnie wiemy, \u017ce robimy kopie zapasowe, \u017ce nasze kopie zapasowe s\u0105 wa\u017cne, problemy, kt\u00f3re si\u0119 z nimi pojawiaj\u0105, zajmuj\u0105 ma\u0142o czasu i s\u0105 rozwi\u0105zywane na poziomie dy\u017curnego administratora. Kopie zapasowe zajmuj\u0105 naprawd\u0119 ma\u0142o miejsca w por\u00f3wnaniu z tar.gz lub Bacula.<\/p>\n<p>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508758\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0421\u0422\u041e \u0432 \u00ab\u041c\u043e\u043b\u043d\u0438\u044f \u0410\u041a\u00bb, \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c IT \u0441\u0438\u0441\u0442\u0435\u043c, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Nextcloud. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u0441 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":86905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-86904","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a GitLab \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 NextCloud | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-01T05:42:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-01T05:42:30+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jak GitLab pomaga w tworzeniu kopii zapasowych du\u017cych magazyn\u00f3w NextCloud | ProHoster","description":"Cze\u015b\u0107, Habr! Dzi\u015b chc\u0119 opowiedzie\u0107 o naszym do\u015bwiadczeniu w automatyzacji tworzenia kopii zapasowych du\u017cych danych w magazynach Nextcloud w r\u00f3\u017cnych konfiguracjach.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a GitLab \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 NextCloud | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-01T05:42:30+00:00","article:modified_time":"2020-07-01T05:42:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"86904","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:03:54","updated":"2022-10-06 09:05:46","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/86904","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=86904"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/86904\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/86905"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=86904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=86904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=86904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}