Backup, który leży na tym samym serwerze co dane, to trochę jak zapasowe klucze trzymane w tym samym zamku. Niby są, ale jak coś pójdzie nie tak, to razem z oryginałem.

Restic rozwiązuje ten problem w bardzo przyjemny sposób. Robi kopie szyfrowane i deduplikowane, czyli każdy kawałek danych wysyła tylko raz, i potrafi pchać je prosto do chmury. My weźmiemy na warsztat Backblaze B2: pierwsze 10 GB jest za darmo, a potem płacisz dosłownie grosze za gigabajt.

Na Mikrusie#

Tu żadnego mikrusowego skrótu nie ma. B2 to zewnętrzna usługa, więc restic konfigurujesz dokładnie tak samo, jak na każdym innym serwerze.

A jeśli nie upierasz się akurat przy B2 i wolisz coś za darmo? Restic równie chętnie trzyma repozytorium na lokalnym dysku, również na dokupionym Storage (montowany jest pod /storage/), albo na darmowej przestrzeni backupowej Strych przez SFTP. Wszystkie kroki poniżej, poza adresem repozytorium, zostają bez zmian.

Na dowolnym serwerze (Ubuntu/Debian)#

sudo apt update
sudo apt install restic

Zakładanie repozytorium na B2#

Najpierw formalności. Zakładasz konto na backblaze.com, tworzysz bucket, a potem klucz aplikacji (Application Key). Dostaniesz keyID i applicationKey.

Wrzucasz je do zmiennych środowiskowych, razem z hasłem, którym restic zaszyfruje dane:

export B2_ACCOUNT_ID=twoj_keyID
export B2_ACCOUNT_KEY=twoj_applicationKey
export RESTIC_REPOSITORY=b2:nazwa-bucketa:backup
export RESTIC_PASSWORD=twoje-bardzo-mocne-haslo

Teraz poważnie. RESTIC_PASSWORD szyfruje Twoje dane. Zgubisz je, to backupu nie odzyskasz, choćbyś miał pełny dostęp do bucketa. Wrzuć je do menedżera haseł, a nie tylko do historii terminala.

Repozytorium inicjujesz jeden raz:

restic init

Pierwszy backup#

restic backup /etc /home

Pierwszy raz trochę to potrwa. Każde następne uruchomienie tej samej komendy jest już dużo szybsze, bo restic wysyła wyłącznie zmienione bloki. Mniej danych do przepchnięcia, to i rachunek za B2 mniejszy.

Lista zrobionych backupów:

restic snapshots

Automatyzacja przez cron#

Ręczne odpalanie backupu działa dokładnie do momentu, w którym zapomnisz. Czyli zwykle dość krótko.

Cron nie widzi jednak zmiennych, które ustawiłeś w terminalu. Najprościej trzymać je w osobnym pliku:

sudo nano /etc/restic.env
export B2_ACCOUNT_ID=twoj_keyID
export B2_ACCOUNT_KEY=twoj_applicationKey
export RESTIC_REPOSITORY=b2:nazwa-bucketa:backup
export RESTIC_PASSWORD=twoje-bardzo-mocne-haslo
sudo chmod 600 /etc/restic.env
sudo crontab -e
0 3 * * * . /etc/restic.env && /usr/bin/restic backup /etc /home >> /var/log/restic-backup.log 2>&1

Po co chmod 600? W /etc/restic.env leżą czystym tekstem klucz do B2 i hasło do repozytorium. Nikt poza rootem nie powinien móc tego przeczytać.

Przywracanie danych#

Backup, którego nigdy nie próbowałeś przywrócić, to w gruncie rzeczy wiara, a nie backup. Warto więc przećwiczyć ten krok, zanim będzie naprawdę potrzebny.

Dostępne snapshoty i ich ID:

restic snapshots

Przywrócenie snapshotu do wybranego katalogu:

restic restore latest --target /tmp/przywrocone

Zamiast latest możesz podać konkretne ID z listy, jeśli najnowszy snapshot Cię nie interesuje.

Czyszczenie starych backupów#

Bez sprzątania repozytorium będzie tylko rosło. Rozsądny układ to na przykład 7 ostatnich kopii dziennych, 4 tygodniowe i 6 miesięcznych, a reszta do kosza:

restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

--prune jest tu kluczowe. Samo forget tylko oznacza snapshoty do usunięcia, ale miejsca na B2 nie zwalnia. Dopiero --prune fizycznie kasuje dane, których nie potrzebuje już żaden zachowany snapshot.

Najczęstsze błędy#

Fatal: unable to open repository po zmianie serwera. Zmienne (RESTIC_REPOSITORY i reszta) trzeba ustawiać w każdej nowej sesji terminala. Chyba że siedzą w /etc/restic.env albo w .bashrc.

Zapomniane RESTIC_PASSWORD. Nie ma przypomnienia hasła, nie ma odzyskiwania, nie ma nic. Jedyna ochrona to trzymać hasło w bezpiecznym miejscu, osobno od serwera.

Repozytorium puchnie mimo forget. Zabrakło --prune. Samo forget na B2 nic nie zwalnia.

Pierwszy backup trwa wieki. To normalne. Za pierwszym razem restic wysyła wszystko. Potem już tylko różnice.