Skip to content
VDS · Bekapi i disk

Bekapi sa rsync-om

Kako da podesiš kopiranje fajlova na drugi server preko SSH-a, napraviš istoriju verzija pomoću hard linkova i izbegneš prekomerno brisanje sa opasnom opcijom --delete.

Ažurirano 23. avgust 2026.

rsync je najjednostavniji način da napraviš kopije: dostupan je svuda, prenosi samo izmenjene delove fajlova i radi preko SSH-a. Za male skupove podataka, to je dovoljno.

Osnovna komanda

rsync -avz --delete \
  -e "ssh -i /root/.ssh/backup_key -p 22" \
  /var/www/ backup@backup.example.com:/srv/backup/vds/www/

Objašnjenje zastavica:

  • -a — čuva dozvole, vlasnike, vremena i linkove;
  • -v — prikazuje šta se dešava;
  • -z — kompresuje tokom prenosa (korisno na propusnom opsegu do 500 Mbps ako ima mnogo podataka);
  • --delete — briše na primaocu ono što više ne postoji na izvoru.

Kosa crta na kraju putanje izvora znači „sadržaj direktorijuma”; bez nje se kopira sam direktorijum. /var/www/ i /var/www daju različite rezultate, a u kombinaciji sa --delete ta razlika briše pogrešnu stvar. Uvek prvo pokreni sa --dry-run.

rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/

Zastavica -n je probni režim.

Ključ za pristup bez lozinke

Zakazano kopiranje zahteva prijavljivanje bez unosa lozinke:

ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com

Na primaocu ograniči ovaj ključ na jednu komandu — tako ukradeni ključ neće dati shell. U ~/.ssh/authorized_keys na primaocu:

command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup

Istorija verzija sa hard linkovima

Običan rsync čuva samo trenutno stanje: ako si juče obrisao fajl i danas to primetio, nema odakle da ga vratiš. --link-dest ti daje istoriju: nepromenjeni fajlovi se ne kopiraju ponovo već se linkuju, pa trideset kopija zauzima malo više od jedne.

#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
  --link-dest="$DEST/latest" \
  /var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +

Pokreni skriptu po rasporedu noću, i uvek sa logovanjem.

Izuzeci

rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log

Kopiranje celog korena retko je potrebno: korisnije je napraviti tačan spisak iz članka šta tačno treba bekapovati.

Kada rsync nije dobro rešenje

  • Ako ti treba enkripcija skladišta i deduplikacija, koristi Restic.
  • Ako se podaci stalno menjaju i integritet je važan, prvo napravi dump baze, pa onda rsyncuj dobijeni fajl.
  • Primalac je nečije tuđe skladište kojem ne veruješ: rsync upisuje fajlove takve kakvi jesu, bez enkripcije na strani klijenta.

Česte greške

  • --delete sa pogrešnom putanjom izvora. Prazan direktorijum izvora briše primalac. Probni režim je obavezan.
  • Kopija na istom disku. To nije bekap, to je druga meta za isti kvar. Pogledaj kopije van lokacije.
  • Kompresija za već kompresovane podatke. -z samo usporava arhive i slike.
  • Noćno pokretanje udari u usko grlo diska. Ograničenje brzine upisa zavisi od tiera: pogledaj brzinu diska. Pomažu --bwlimit=20000 i pokretanje van najopterećenijih sati.
  • Niko ne proverava rezultat. Loguj povratni kod i prati ga: rsync ... || echo "backup failed" | mail -s alert you@example.com.