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

rsync — kopia zapasowa VPS, incremental backup i retencja

Czym jest rsync i dlaczego to najlepsze narzędzie do backupu?

rsync (Remote Sync) to narzędzie synchronizacji plików używające algorytmu delta — przesyła tylko zmiany, nie całe pliki. Dla serwera VPS to oznacza:

  • Backup 100 GB katalogu po pierwszym pełnym backupie zajmuje sekundy (tylko delta)
  • Każda kopia wygląda jak pełny backup, ale zajmuje miejsce tylko dla zmienionych plików (hard linki)
  • Transfer przez SSH — szyfrowany, nie wymaga osobnego oprogramowania na serwerze zdalnym

Powiązane tematy: strategia backup hosting, SSH keys na VPS, backup PostgreSQL. Porównaj VPS z automatycznym backupem na stronie VPS.

Podstawowe użycie rsync

# Synchronizacja lokalnych katalogów
rsync -av /katalog/zrodlowy/ /katalog/docelowy/

# Opcje:
# -a  = archive (rekursywnie, zachowaj uprawnienia, daty, symlinki)
# -v  = verbose (pokaż co jest kopiowane)
# -z  = kompresja podczas transferu (dla wolnych łączy)
# -P  = pokazuj postęp + kontynuuj po przerwaniu
# --delete = usuń pliki z dest których nie ma w source

# Transfer na zdalny serwer przez SSH
rsync -avz -e "ssh -p 22" /var/www/ user@backup-server:/backups/www/

# Transfer z zdalnego serwera (pull backup)
rsync -avz -e "ssh -i /root/.ssh/backup_key" root@vps-server:/var/www/ /local/backups/www/

Incremental backup z --link-dest (Time Machine style)

Opcja --link-dest tworzy hard linki do plików z poprzedniego backupu zamiast kopiowania. Każda kopia wygląda jak pełny snapshot, ale niezmienizone pliki zajmują miejsce tylko raz na dysku.

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

BACKUP_SRC="/var/www /etc /home"
BACKUP_DEST="/backups/vps"
DATE=$(date +%Y-%m-%d_%H-%M)
LATEST="$BACKUP_DEST/latest"

# Stwórz nowy snapshot
rsync -az --delete \
    --link-dest="$LATEST" \
    $BACKUP_SRC \
    "$BACKUP_DEST/$DATE/"

# Zaktualizuj symlink "latest"
rm -f "$LATEST"
ln -s "$BACKUP_DEST/$DATE" "$LATEST"

echo "Backup zakończony: $DATE"

Po kilku uruchomieniach struktura katalogów:

/backups/vps/
├── 2026-04-01_02-00/   # Pełny snapshot (tylko tu pliki fizycznie)
├── 2026-04-02_02-00/   # Zmienione pliki + hard linki do 04-01
├── 2026-04-03_02-00/   # Zmienione pliki + hard linki do 04-02
└── latest -> 2026-04-03_02-00/  # Symlink do najnowszego

Backup przez SSH bez hasła (klucze)

Automatyczne backupy wymagają logowania bez hasła. Wygeneruj dedykowany klucz SSH dla backupów z ograniczonymi uprawnieniami.

# Na serwerze backup (mastera)
ssh-keygen -t ed25519 -f ~/.ssh/backup_key -N "" -C "backup-automation"

# Skopiuj klucz publiczny na VPS źródłowy
ssh-copy-id -i ~/.ssh/backup_key.pub root@vps-server

# Lub ręcznie — dodaj do authorized_keys z ograniczeniami
# Na VPS źródłowym w /root/.ssh/authorized_keys:
# command="rsync --server --sender -az . /",no-pty,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAA...

# Test połączenia
ssh -i ~/.ssh/backup_key root@vps-server echo "OK"

Backup bazy danych + plików razem

Pliki i baza muszą być zsynchronizowane. Najpierw zrób dump bazy do katalogu, który potem backupujesz przez rsync.

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

BACKUP_DIR="/backups/vps"
DATE=$(date +%Y-%m-%d_%H-%M)
SNAPSHOT="$BACKUP_DIR/$DATE"
LATEST="$BACKUP_DIR/latest"
DB_DUMP_DIR="/tmp/db-dumps"

# 1. Dump bazy PostgreSQL
mkdir -p "$DB_DUMP_DIR"
pg_dump -U postgres myapp > "$DB_DUMP_DIR/myapp.sql"
pg_dumpall -U postgres > "$DB_DUMP_DIR/all-databases.sql"

# Lub MySQL/MariaDB:
# mysqldump --all-databases -u root -p"HASLO" > "$DB_DUMP_DIR/mysql-all.sql"

# 2. rsync: pliki + dump bazy
rsync -az --delete \
    --link-dest="$LATEST" \
    /var/www /etc /home "$DB_DUMP_DIR" \
    "$SNAPSHOT/"

# 3. Zaktualizuj symlink
rm -f "$LATEST"
ln -s "$SNAPSHOT" "$LATEST"

# 4. Wyczyść tymczasowe dumpy
rm -rf "$DB_DUMP_DIR"

echo "Backup DONE: $SNAPSHOT ($(du -sh $SNAPSHOT | cut -f1))"

Retencja — automatyczne usuwanie starych backupów

Polityka retencji decyduje ile kopii przechowujesz. Klasyczna zasada 3-2-1: 3 kopie, 2 nośniki, 1 zdalnie. Dla VPS typowe podejście: 7 dni, 4 tygodnie, 12 miesięcy.

#!/bin/bash
# Usuń backupy starsze niż 30 dni
find /backups/vps -maxdepth 1 -type d -mtime +30 | while read dir; do
    echo "Usuwam: $dir"
    rm -rf "$dir"
done

# Lub z ograniczeniem do N ostatnich backupów
ls -dt /backups/vps/20*/ | tail -n +8 | xargs rm -rf
# (zachowaj ostatnie 7, usuń resztę)

Weryfikacja backupów

# Sprawdź rozmiar snapshots (hard linki = mały przyrost)
du -sh /backups/vps/20*/

# Sprawdź ile miejsca zajmuje cały katalog (z dedupl.)
du -sh /backups/vps/

# Test przywracania pliku
cp /backups/vps/latest/var/www/html/index.php /tmp/test-restore.php
diff /var/www/html/index.php /tmp/test-restore.php && echo "OK — pliki identyczne"

# Lista zmienionych plików między snapshots
rsync -av --dry-run \
    /backups/vps/2026-04-01_02-00/ \
    /backups/vps/2026-04-02_02-00/ | grep -v "/$"

Automatyzacja przez cron

# Dodaj do crontab (sudo crontab -e)
# Backup codziennie o 2:00 w nocy
0 2 * * * /usr/local/bin/full-backup.sh >> /var/log/backup.log 2>&1

# Sprawdź logi
tail -f /var/log/backup.log

Monitoring backupów: Dodaj powiadomienie email lub webhook gdy backup się nie powiedzie:

#!/bin/bash
# Na końcu skryptu backup:
if [ $? -ne 0 ]; then
    curl -X POST "https://hooks.slack.com/services/..." \
        -H 'Content-type: application/json' \
        --data '{"text":"BACKUP FAILED na vps-server!"}'
fi

rsync vs inne narzędzia backupu

Narzędzie Zalety Wady
rsync Wszędzie dostępny, incremental, SSH, zero zależności Brak szyfrowania w spoczynku, trudniejsza deduplikacja
Borg Backup Deduplikacja blokowa, szyfrowanie, kompresja Wymaga instalacji na obu końcach, wolniejszy restore
Restic Szyfrowanie, S3/Backblaze B2 support, snapshots Większe użycie CPU, wymaga metadanych w repo
Tar + gzip Prosty, jeden plik archiwum Pełny backup za każdym razem, wolny dla dużych danych

Rekomendacja: rsync dla codziennych incremental backupów plików + pg_dump/mysqldump dla baz danych. Dla backupów do chmury (S3) użyj Restic lub rclone.