W świecie IT krąży brutalne porzekadło: ludzie dzielą się na tych, którzy robią backupy, i tych, którzy będą je robić. Jednak samo „robienie backupów” to dopiero połowa sukcesu. Prawdziwym wyzwaniem jest stworzenie systemu, który jest niezawodny, zautomatyzowany, zaszyfrowany i tani w utrzymaniu.
Dzisiaj pokażę Wam, jak zbudować taką infrastrukturę, łącząc Kopię (potężnego klienta kopii zapasowych) z Garage S3 (lekkim serwerem obiektowym) działającym na TrueNAS SCALE. To połączenie pozwala na stworzenie własnej „chmury” na dane, która działa tak sprawnie jak komercyjne rozwiązania typu AWS S3 czy Backblaze, ale pozostaje w 100% pod Waszą kontrolą.
Filary naszego rozwiązania
Zanim przejdziemy do konfiguracji, warto zrozumieć, dlaczego wybraliśmy właśnie te narzędzia:
- Kopia: To nowoczesne narzędzie do tworzenia kopii zapasowych, które wspiera deduplikację (nie wysyła dwa razy tych samych danych), kompresję oraz szyfrowanie end-to-end. Co ważne, Kopia nie przechowuje plików w ich naturalnej formie, lecz dzieli je na zaszyfrowane bloki (Content-Addressable Storage), co czyni ją niezwykle odporną na błędy transmisji.
- Garage S3: Napisany w Rust, lekki i rozproszony serwer obiektowy kompatybilny z API S3. W przeciwieństwie do ciężkiego MinIO, Garage jest stworzony do działania na mniejszych zasobach, oferując przy tym wysoką wydajność i natywną obsługę rozproszonych klastrów.
- TrueNAS SCALE: Jako system operacyjny NAS, SCALE daje nam stabilną bazę pod kontenery Dockerowe i bezpieczne składowanie danych na systemie plików ZFS.

Pułapki, czyli czego nie przeczytasz w oficjalnej dokumentacji
Moja droga do „zielonego statusu” w Kopii była usłana błędami, które mogą zniechęcić niejednego admina. Oto jak je pokonałem:
1. Wojna Portów: S3 API vs Web Server
W Garage porty są ściśle podzielone. Domyślnie Garage korzysta z:
- Port 3900 (u mnie 30188): To jest właściwe S3 API. To tutaj Kopia wysyła polecenia
PUT,GETiLIST. - Port 3902 (u mnie 30189): To serwer WWW, który służy wyłącznie do hostowania statycznych stron prosto z bucketów.
Próba połączenia Kopii z portem 30189 kończyła się błędem 404 Not Found. Dlaczego? Ponieważ serwer WWW nie rozumie poleceń zapisu danych. Jeśli widzisz błąd 404 przy próbie tworzenia repozytorium – sprawdź, czy nie pomyliłeś portów.
2. „Malformed Authorization Header”, czyli problem z Regionem
Kopia wysyłała nagłówki autoryzacji z regionem us-east-1 lub dc1. Garage odrzucał je z błędem:
Authorization header malformed, unexpected scope.
Okazało się, że Garage jest niezwykle rygorystyczny co do tzw. „Scope” w podpisie V4. Rozwiązaniem było wymuszenie pustego regionu (--region="") lub sprawdzenie w pliku garage.toml, jaka dokładnie nazwa została tam zdefiniowana (często po prostu garage).
Implementacja krok po kroku
Krok 1: Przygotowanie środowiska na Linux Mint
Instalujemy Kopię z pakietu .deb. Jeśli planujesz używać terminala (a będziesz musiał!), warto od razu przygotować binarne dowiązanie. Kopia zainstalowana z pakietu UI chowa swoją binarkę CLI głęboko w katalogu /opt.
# Tworzymy symlink, aby komenda 'kopia' była dostępna w systemie
sudo ln -s /opt/KopiaUI/resources/server/kopia /usr/local/bin/kopia
Krok 2: Konfiguracja po stronie Garage (TrueNAS)
Ponieważ obraz Garage jest często obrazem typu distroless (bez powłoki bash), operacje wykonujemy bezpośrednio przez docker exec:
# Tworzymy bucket pod backupy iMaca
docker exec ix-garage-garage-1 /garage bucket create mint
# Nadajemy uprawnienia kluczowi (Access Key)
docker exec ix-garage-garage-1 /garage bucket allow mint --read --write --key GK7c0b...
Krok 3: Inicjalizacja repozytorium (CLI to klucz do sukcesu)
Gdy GUI nie pozwala na wpisanie niestandardowych parametrów, terminal przychodzi z pomocą. Oto komenda, która ostatecznie „dogadała się” z Garage:
export AWS_S3_ADDRESSING_STYLE=path
kopia repository create s3 \
--bucket=mint \
--endpoint=192.168.0.13:30188 \
--access-key=GK... \
--secret-access-key=... \
--region="" \
--disable-tls
Zmienna AWS_S3_ADDRESSING_STYLE=path jest krytyczna – wymusza ona adresowanie typu ip:port/bucket, zamiast domyślnego dla AWS bucket.ip:port, którego adresy IP nie obsługują.
Higiena Backupów: Co ignorować i jak automatyzować?
Reguły ignorowania (Ignore Rules)
Nie ma sensu wysyłać na serwer śmieci. W mojej konfiguracji wykluczyłem:
.cache: Tysiące tymczasowych plików przeglądarek..rustup/.cargo: Dokumentacja i binarki Rusta (można je odtworzyć jedną komendą).Downloads: Bo to zazwyczaj składzik tymczasowy.VirtualBox VMs: Gigantyczne pliki dysków, które lepiej backupować rzadziej i dedykowanym narzędziem.
Automatyzacja
W Kopia-UI ustawiłem harmonogram „Every hour”. Aby mieć pewność, że proces zawsze działa, dodałem Kopia-UI do systemowych Aplikacji Startowych Linux Mint:
Command: /opt/KopiaUI/kopia-ui %U
Dodatkowo zaznaczyłem opcję „Run Missed Snapshots on Startup”. Jeśli iMac był wyłączony przez noc, Kopia nadrobi zaległy backup natychmiast po porannym zalogowaniu.
Podsumowanie: Czy warto było?
Zdecydowanie tak. Połączenie Kopii z Garage S3 daje mi:
- Odporność na Ransomware: Snapshoty są tylko do odczytu z poziomu klienta po ich utworzeniu (jeśli skonfigurujemy Object Lock).
- Oszczędność miejsca: Dzięki deduplikacji, moje snapshoty zajmują ułamek rzeczywistego rozmiaru danych.
- Prywatność: Dane opuszczają mój komputer już zaszyfrowane kluczem, którego TrueNAS nawet nie zna.
Jeśli szukacie alternatywy dla komercyjnych chmur, ten duet jest obecnie jednym z najlepszych wyborów dla każdego użytkownika Linuxa i TrueNAS.
A jak u Was wygląda „plan awaryjny”? Korzystacie z S3 w domu, czy zostajecie przy klasycznym Rsyncu? Dajcie znać w komentarzach!




Dodaj komentarz