Terminal pogryzł człowieka: duplicity

W mrokach niepewności jakie spowiły nasze obecne czasy, coraz bardziej na miejscu wydaje się być zapytanie „Obywatelu, czy zrobiłeś już kopię bezpieczeństwa swoich danych?”. I prawidłowo odpowiedzią jest „Tak jest!”. Szczególnie, że mamy co backupować. Rozliczenia PIT, dowody wpłat, elektroniczne faktury, pisma, adnotacje urzędowe i wszystko, co może być kiedyś opacznie zinterpretowane i wykorzystane przeciwko nam. Do tego dochodzą nasze np. zdjęcia, filmiki z komórki i inne pliki dokumentujących szlak naszego życia. Przy tak sporej kolekcji okazuje się, że często najlepszymi rozwiązaniami są te najbardziej niepozorne. Jak choćby tekstowe narzędzie duplicity.

Duplicity podczas wykonywania obowiązków
Duplicity znajdziemy w repozytoriach niemal wszystkich dystrybucji, zatem nikt nie będzie miał trudności z jego zainstalowaniem. To co wyróżnia duplicity na tle innych narzędzi umożliwiających tworzenie kopii zapasowych, to jego bajeczny wachlarz obsługiwanych protokołów. Bo jeżeli zdecydujemy się odkładać nasze dane gdzieś w sieci, to dla tego programu niestraszne są ssh, scp, ftp, ftps, rsync, imap, webdav. Co więcej, dla duplicity przeszkody nie stanowią również różne niuanse zaszyte w komercyjnych rozwiązaniach chmurowych – bez większych ceregieli utworzymy swoje archiwum bezpieczeństwa zarówno na popularnym Dropboksie jak i Amazon S3, kontenerze w Azure, OneDrive, B2 oraz OwnCloud (webdav). Zasada wykorzystania tego rozwiązania jest prosta – stworzyć archiwum, skonfigurować połączenie, wrzucić skrypt wykonujący backupy do crontaba i zapomnieć o całości na najbliższe lata – o ile nie będziemy potrzebowali przywrócić jakiegoś pliku.

O czym warto wspomnieć, to dwie umiejętności duplicity – tworzenia kopii „zwykłych” oraz przyrostowych, a także szyfrowania naszego archiwum. Dzięki temu ten niewielki programik staje się bardzo ciekawą propozycją zarówno dla zwykłego użytkownika (pracującego na desktopie) a także i profesjonalistów zarządzających serwerami.

Zatem, czym można nakarmić duplicity… Na początek zestaw standardowych komend, z których nas będzie interesowało póki co full/incremental (czyli jaki rodzaj kopii bezpieczeństwa ma wykonać program), następnie verify, list-current-files oraz przede wszystkim restore. Jak można się domyślić, to wszystko pozwala na stworzenie kopii, zweryfikowanie poprawności, wylistowania zarchiwizowanych plików oraz przywrócenie wybranego.

Usage: 
  duplicity [full|incremental] [opcje] katalog_źródłowy url_docelowy
  duplicity [restore] [opcje] url_źródłowy katalog_docelowy
  duplicity verify [opcje] url_źródłowy katalog_docelowy
  duplicity collection-status [opcje] url_docelowy
  duplicity list-current-files [opcje] url_docelowy
  duplicity cleanup [opcje] url_docelowy
  duplicity remove-older-than data [opcje] url_docelowy
  duplicity remove-all-but-n-full liczba [opcje] url_docelowy
  duplicity remove-all-inc-of-but-n-full liczba [opcje] url_docelowy

Można nad tym zapanować. Ale jak określać co chcemy backupować i gdzie? Nic prostszego. Wybieramy jeden z obsługiwanych protokołów:

Backendy oraz ich formaty URL:
  cf+http://nazwa_kontenera
  file:///katalog
  ftp://użytkownik[:hasło]@zdalny_adres[:port]/katalog
  ftps://użytkownik[:hasło]@zdalny_adres[:port]/katalog
  hsi://użytkownik[:hasło]@zdalny_adres[:port]/katalog
  imap://użytkownik[:hasło]@zdalny_adres[:port]/katalog
  rsync://użytkownik[:hasło]@zdalny_adres[:port]::/moduł/katalog
  rsync://użytkownik[:hasło]@zdalny_adres[:port]/ścieżka_względna
  rsync://użytkownik[:hasło]@zdalny_adres[:port]//ścieżka_absolutna
  s3://zdalny_adres/nazwa_bucketa[/prefiks]
  s3+http://nazwa_bucketa[/prefiks]
  scp://użytkownik[:hasło]@zdalny_adres[:port]/katalog
  ssh://użytkownik[:hasło]@zdalny_adres[:port]/katalog
  swift://nazwa_kontenera
  tahoe://alias/katalog
  webdav://użytkownik[:hasło]@zdalny_adres/katalog
  webdavs://użytkownik[:hasło]@zdalny_adres/katalog
  gdocs://użytkownik[:hasło]@zdalny_adres/katalog
  pydrive://użytkownik@zdalny_adres/katalog
  mega://użytkownik[:hasło]@zdalny_adres/katalog
  copy://użytkownik[:hasło]@zdalny_adres/katalog
  dpbx:///katalog
  onedrive://katalog
  azure://nazwa_kontenera
  b2://account_id[:application_key]@nazwa_bucketa/[katalog/]

… i dopisujemy co należy:

Dla pełnej kopii na innych dysk:

duplicity full /home/user/moje_wazne_pliki file:///home/backup

Uwaga na trzy ukośniki po nazwie protokołu (file://). Dwa ukośniki są przynależne do protokołu, trzeci jest dlatego, że podajemy ścieżkę bezwzględną (/home/backup). Jeżeli chcemy tworzyć kopie przyrostowe to zastępujemy full parametrem incremental.

Jeżeli będziemy chcieli coś przywrócić z takiej kopii, to:

duplicity -t plik_sprzed_ilu_dni --force --file-to-restore nazwa_pliku/lub_katalogu file:///home/backup gdzie_chcemy_zapisac_przywrocony_plik

Parametr -t jest opcjonalny.

Prawda, że banalne? Jak wykorzystać jednak nieco bardziej skomplikowane lokalizacje? Najpopularniejsze będzie SSH/SCP (wymaga zainstalowania paczki python-paramiko). Tworząc dwój klucz PGP i umieszczając go na zdalnym serwerze pominiemy kłopotliwe umieszczanie haseł w skryptach:

ssh-keygen -t rsa
ssh-copy-id user@zdalny_host
duplicity incremental /home/user/moje_wazne_pliki scp://user@zdalny_host/nasze_zdalne_archiwum

Nic nie stoi na przeszkodzie, by dane gromadzić w naszej chmurce OwnCloud:

duplicity incremental /home/user/moje_wazne_pliki webdavs://user:haslo_usera@zdalny_host/nasze_zdalne_archiwum

Ta cała metoda nabiera znamion łatwej, prostej i przyjemnej, gdy podane powyżej polecenia tworzące backup dodamy sobie np. do crontaba. Wtedy np. jeden raz dziennie kopia wykona się samoczynnie.

Gdyby dla kogoś wersja duplicity w repozytorium Ubuntu 16.04/Mint 18.xx była nieodpowiednia, możemy jeszcze skorzystać z autorskiego PPA:

sudo add-apt-repository ppa:duplicity-team/ppa
sudo apt-get update
sudo apt-get install duplicity