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/