Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

rsync — synchronizacja i backup plików na serwerze

Opublikowano: 9 kwietnia 2026 · Kategoria: Linux / Backup

rsync to podstawowe narzędzie każdego administratora serwera. Synchronizuje pliki wydajnie — przesyła tylko różnice między plikami (delta-transfer), obsługuje SSH, wyklucza katalogi i tworzy incremental backupy zajmujące ułamek miejsca dzięki hard linkom. Od prostego kopiowania plików po automatyczne backupy offsite z crona — wszystko w jednym narzędziu.

Podstawy rsync — najważniejsze flagi

Flaga Opis
-a Archive mode: zachowuje uprawnienia, właściciela, daty, symlinki (= -rlptgoD)
-v Verbose: wyświetla listę kopiowanych plików
-z Kompresja w locie (przydatne przez sieć, zbędne lokalnie)
--progress Pokazuje postęp transferu każdego pliku
--delete Usuwa z destination pliki nieistniejące w source (lustro)
--dry-run Symulacja — pokazuje co zostałoby zrobione, bez zmian
--exclude Wyklucza pliki/katalogi pasujące do wzorca
--link-dest Incremental backup z hard linkami do poprzedniego snapshotu
--bwlimit Ogranicza prędkość transferu (KB/s)

Synchronizacja lokalna i przez SSH

# Kopiowanie lokalnego katalogu
rsync -avz /var/www/html/ /backup/html/

# UWAGA: ukośnik na końcu source ma znaczenie!
# /var/www/html/  → kopiuje ZAWARTOŚĆ katalogu (bez samego html/)
# /var/www/html   → kopiuje katalog html/ (z samą nazwą)

# Synchronizacja z pokazaniem postępu
rsync -avz --progress /duzy-katalog/ /backup/duzy-katalog/

# Lustro (usuwaj pliki nieistniejące w source)
rsync -avz --delete /var/www/html/ /mirror/html/

# Dry-run — sprawdź co zostanie zrobione
rsync -avz --delete --dry-run /var/www/html/ /mirror/html/
# Synchronizacja przez SSH — lokalny backup zdalnego serwera
rsync -avz -e ssh user@zdalny-serwer:/var/www/html/ /lokalny/backup/

# Rsync przez SSH z niestandardowym portem
rsync -avz -e "ssh -p 2222" user@zdalny-serwer:/dane/ /backup/

# Upload lokalnych plików na zdalny serwer
rsync -avz /lokalny/projekt/ user@zdalny-serwer:/var/www/projekt/

Wykluczanie plików i katalogów (--exclude)

# Wyklucz jeden katalog
rsync -avz --exclude='.git' /projekt/ /backup/projekt/

# Wyklucz wiele wzorców
rsync -avz \
  --exclude='.git' \
  --exclude='node_modules' \
  --exclude='*.log' \
  --exclude='.env' \
  --exclude='cache/' \
  /var/www/aplikacja/ /backup/aplikacja/

# Wyklucz przez plik .rsync-filter (jak .gitignore)
rsync -avz --filter=':- .rsync-filter' /projekt/ /backup/projekt/
# Zawartość .rsync-filter (w katalogu source)
# .git
# node_modules/
# *.tmp
# .env
# vendor/

Incremental backup z --link-dest (hard linki)

Opcja --link-dest tworzy "snapshot" backupów: każdy nowy backup to osobny katalog z datą, ale niezmienione pliki są hard linkami do poprzedniego snapshotu — zajmują praktycznie zero dodatkowego miejsca.

# Struktura katalogów po kilku dniach:
# /backup/
#   2026-04-07/  (pełny snapshot)
#   2026-04-08/  (hard linki do 07 + zmienione pliki)
#   2026-04-09/  (hard linki do 08 + zmienione pliki)

# Ręczne wywołanie incremental backup
PREV="/backup/2026-04-08"
CURR="/backup/2026-04-09"

rsync -avz \
  --link-dest="$PREV" \
  /var/www/html/ \
  "$CURR/"

Skrypt backup z datą i crona

Kompletny skrypt backupowy z automatycznym --link-dest, logowaniem i rotacją starych backupów:

#!/bin/bash
# /usr/local/bin/backup-rsync.sh

SOURCE="/var/www/html/"
BACKUP_DIR="/backup/www"
DATE=$(date +%Y-%m-%d)
PREV_DATE=$(date -d "yesterday" +%Y-%m-%d)
LOG="/var/log/backup-rsync.log"

echo "=== Backup $DATE start ===" >> "$LOG"

# Utwórz katalog docelowy
mkdir -p "$BACKUP_DIR/$DATE"

# Incremental backup z hard linkami do poprzedniego dnia
rsync -avz \
  --link-dest="$BACKUP_DIR/$PREV_DATE" \
  --exclude='.git' \
  --exclude='node_modules' \
  --exclude='*.log' \
  "$SOURCE" \
  "$BACKUP_DIR/$DATE/" \
  >> "$LOG" 2>&1

echo "=== Backup $DATE end (exit: $?) ===" >> "$LOG"

# Usuń backupy starsze niż 30 dni
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \; >> "$LOG" 2>&1
# Nadaj uprawnienia i dodaj do crona
chmod +x /usr/local/bin/backup-rsync.sh

# Uruchamiaj codziennie o 2:30 w nocy
crontab -e
# Dodaj linię:
# 30 2 * * * /usr/local/bin/backup-rsync.sh

Backup offsite — rsync na zdalny serwer

Strategia 3-2-1 wymaga kopii offsite (poza główną lokalizacją). rsync przez SSH to najprostsze rozwiązanie:

# Konfiguracja kluczy SSH bez passphrase (dla automatyzacji)
ssh-keygen -t ed25519 -f ~/.ssh/backup_key -N ""
ssh-copy-id -i ~/.ssh/backup_key.pub [email protected]

# Synchronizacja backupów na zdalny serwer
rsync -avz \
  -e "ssh -i ~/.ssh/backup_key -o StrictHostKeyChecking=no" \
  /backup/www/ \
  [email protected]:/offsite-backup/www/

# Ograniczenie przepustowości (nie blokuj głównego łącza)
# --bwlimit=5000  = max 5 MB/s
rsync -avz \
  --bwlimit=5000 \
  -e "ssh -i ~/.ssh/backup_key" \
  /backup/www/ \
  [email protected]:/offsite-backup/www/

Weryfikacja i przywracanie z backupu

# Sprawdź rozmiar backupów (prawdziwy vs z hard linkami)
du -sh /backup/www/2026-04-*/       # Rozmiar per snapshot
du -sh --total /backup/www/         # Łączny rozmiar katalogów

# Policz unikalne dane (prawdziwe zużycie dysku)
df -h /backup                       # Wolne miejsce na partycji

# Przywróć pliki z konkretnego dnia (--dry-run najpierw!)
rsync -avz --dry-run \
  /backup/www/2026-04-07/ \
  /var/www/html/

# Przywróć po weryfikacji
rsync -avz \
  /backup/www/2026-04-07/ \
  /var/www/html/

Najczęstsze pytania

Jaka jest różnica między rsync --delete a rsync bez --delete? +
Bez --delete: rsync kopiuje nowe i zmienione pliki z source do destination, ale nie usuwa plików które istnieją tylko w destination. Wynik: destination może zawierać stare pliki usunięte z source. Z --delete: rsync usuwa z destination wszystkie pliki których nie ma w source — destination staje się dokładnym lustrem source. Dla backupów: NIE używaj --delete w kombinacji z --link-dest, bo usuniesz poprzednie snapshoty.
Czy rsync --link-dest rzeczywiście oszczędza miejsce na dysku? +
Tak, bardzo efektywnie. Hard linki nie kopiują danych — wiele nazw plików wskazuje na te same bloki danych na dysku. Jeśli plik 100 MB nie zmienił się przez 30 dni, 30 backupów zajmuje łącznie 100 MB (nie 3 GB). Zmienione pliki są kopiowane jako nowe. Sprawdź zużycie miejsca: du -sh backup/2026-04-09/ da rozmiar jednego snapshotu, ale rzeczywiste unikalne dane są znacznie mniejsze.
Jak rsync obsługuje przerwane transfery? +
rsync obsługuje wznawianie transferów dzięki algorytmowi delta-transfer. Jeśli transfer zostanie przerwany w połowie, następne uruchomienie rsync zsynchronizuje tylko brakujące/zmienione części. Dla dużych plików użyj --partial (zachowaj częściowo przetransferowane pliki) i --progress (pokaż postęp). Kombinacja --partial --inplace minimalizuje użycie dysku przy wznawianiu — rsync nadpisuje plik bezpośrednio zamiast tworzyć tymczasową kopię.
Jak backupować przez rsync bez podawania hasła SSH? +
Użyj kluczy SSH bez passphrase (lub z ssh-agent). Wygeneruj parę kluczy: ssh-keygen -t ed25519 -C "backup-key" -f ~/.ssh/backup_key -N "" (bez passphrase). Dodaj klucz publiczny do ~/.ssh/authorized_keys na zdalnym serwerze: ssh-copy-id -i ~/.ssh/backup_key.pub user@backup-host. Użyj w rsync: rsync -avz -e "ssh -i ~/.ssh/backup_key" ... W skryptach cron ta metoda działa bez interakcji użytkownika.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.