BorgBackup — deduplikacja, szyfrowanie i remote backup przez SSH
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Backup
BorgBackup to jeden z najpotężniejszych narzędzi do backupu dla Linuxa — łączy deduplikację na poziomie bloków, silne szyfrowanie, kompresję i elegancki CLI. W praktyce 30 dziennych snapshotów 20 GB systemu zajmuje 25 GB, a nie 600 GB. W tym przewodniku przejdziemy przez instalację, inicjalizację repo lokalnego i zdalnego, tworzenie archiwów, politykę prune, przywracanie danych i zabezpieczenie przez append-only mode.
Jak działa deduplikacja w Borg
Borg dzieli pliki na chunki zmiennej wielkości (buzhash, średnio ~2 MB) i przechowuje każdy chunk w repo tylko raz — po hashu SHA-256. Kolejne backupy odwołują się do istniejących chunków przez ich hash i zapisują tylko nowości. Efekt: dodanie pojedynczego pliku kosztuje jego rozmiar (nie rozmiar całego archiwum), a edycja końcówki wielkiego pliku zapisuje tylko zmieniony fragment.
Instalacja
# Debian / Ubuntu sudo apt install borgbackup # RHEL / Rocky sudo dnf install borgbackup # Single-file binary (najnowsza wersja) wget https://github.com/borgbackup/borg/releases/latest/download/borg-linux64 chmod +x borg-linux64 sudo mv borg-linux64 /usr/local/bin/borg # Weryfikacja borg --version
Inicjalizacja repozytorium
# Lokalne repo borg init --encryption=repokey-blake2 /mnt/backup/borgrepo # Repo na zdalnym serwerze przez SSH (najczestszy scenariusz) borg init --encryption=repokey-blake2 [email protected]:/srv/borg/vps01 # Podczas init Borg zapyta o passphrase - wpisz MOCNE haslo. # Bez passphrase nie odzyskasz danych. # Eksport klucza (zapisz bezpiecznie offline!) borg key export [email protected]:/srv/borg/vps01 /root/borg-key-vps01.txt
Tryby szyfrowania: repokey-blake2 (klucz w repo, zalecane),
keyfile-blake2 (klucz lokalnie, trzeba backupować), none (brak szyfrowania
— NIE używaj w produkcji).
Tworzenie archiwum
# Aby nie trzymac passphrase w terminalu export BORG_PASSPHRASE='twoje-mocne-haslo' export BORG_REPO='[email protected]:/srv/borg/vps01' # Utworz archiwum z nazwa zawierajaca hostname i date borg create \ --verbose --stats --show-rc \ --compression zstd,3 \ --exclude-caches \ --exclude '/var/cache/*' \ --exclude '/var/log/*.gz' \ --exclude '/tmp/*' \ --exclude '/proc' --exclude '/sys' \ ::'{hostname}-{now:%Y-%m-%d_%H:%M}' \ /etc /home /var/www /var/lib/mysql /root
zstd,3 to dobry balans szybkość/kompresja. Dla CPU-bound użyj lz4, dla maksymalnej kompresji zstd,22 albo lzma.
Flaga --stats pokaże ile chunków było nowych vs deduplikowanych — typowo 95% po pierwszym
backupie jest deduplikowane.
Prune policy — retencja starych archiwów
Bez prune repo rośnie w nieskończoność. Borg prune usuwa stare archiwa według polityki dziennej/tygodniowej/miesięcznej/rocznej — pamięta o najmłodszym z każdej kategorii:
# Zachowaj: 7 dziennych, 4 tygodniowe, 6 miesiecznych, 1 roczny
borg prune \
--verbose --list --stats \
--glob-archives '{hostname}-*' \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--keep-yearly 1 \
::
# Po prune zwolnij miejsce (usuwa nieuzywane chunki)
borg compact Uwaga: Od Borg 1.2 prune NIE zwalnia miejsca od razu — musisz uruchomić
borg compact. Starsze wersje robiły to automatycznie.
Listowanie i restore
# Wszystkie archiwa w repo borg list # Zawartosc konkretnego archiwum borg list ::vps01-2026-04-09_03:00 # Informacje o repo (rozmiar, liczba chunkow, deduplikacja) borg info # Restore calego archiwum do biezacego katalogu mkdir /tmp/restore && cd /tmp/restore borg extract ::vps01-2026-04-09_03:00 # Restore pojedynczego pliku / katalogu borg extract ::vps01-2026-04-09_03:00 etc/nginx # Mount archiwum jako FUSE (przegladanie bez extract) mkdir /mnt/borgmount borg mount ::vps01-2026-04-09_03:00 /mnt/borgmount ls /mnt/borgmount borg umount /mnt/borgmount
Append-only mode — ochrona przed ransomware
Jeśli klient zostanie skompromitowany, atakujący może uruchomić borg delete
i zniszczyć backupy. Obrona: append-only mode na serwerze backup — klient może dodawać archiwa,
ale nie usuwać. Prune robisz ręcznie lokalnie na serwerze backup z pełnym dostępem.
# /srv/borg/users/vps01/.ssh/authorized_keys (na serwerze backup) command="borg serve --append-only --restrict-to-path /srv/borg/vps01",restrict ssh-ed25519 AAAA... vps01@example
Borg vs inne narzędzia
| Narzędzie | Deduplikacja | Szyfrowanie | Backendy | Prune |
|---|---|---|---|---|
| Borg | Tak (chunks, zmienna wielkość) | Tak (AES-256, BLAKE2) | Lokalny, SSH | Tak (keep-*) |
| Restic | Tak (chunks) | Tak (AES-256) | Lokalny, S3, B2, GCS, Azure, REST, SFTP | Tak (forget) |
| rsync | Nie (tylko --link-dest) | Nie (SSH na transport) | Lokalny, SSH, rsyncd | Nie (ręcznie) |
| Duplicity | Nie (diff-based) | Tak (GPG) | Lokalny, S3, FTP, WebDAV, SSH | Tak |
Automatyzacja przez cron / systemd timer
#!/bin/bash # /usr/local/bin/borg-backup.sh set -euo pipefail export BORG_PASSPHRASE_FILE=/root/.borg-passphrase export BORG_REPO='[email protected]:/srv/borg/vps01' borg create --stats --compression zstd,3 \ ::'{hostname}-{now:%Y-%m-%d_%H:%M}' \ /etc /home /var/www /var/lib/mysql /root borg prune --list --keep-daily 7 --keep-weekly 4 --keep-monthly 6 :: borg compact echo "Backup OK at $(date)" | tee -a /var/log/borg-backup.log
# Crontab - codziennie o 3:00 0 3 * * * /usr/local/bin/borg-backup.sh >> /var/log/borg-backup.log 2>&1