Brze shell skripte za backup i obnovu na Linux terminalu

Article Image

Zašto brzo i automatizovano bekapovanje ima smisla na Linux terminalu

Kao korisnik Linux sistema, verovatno upravljate fajlovima i servisima koji su kritični za rad sistema ili vašeg posla. Ručno kopiranje podataka je sporo i podložno greškama — zato se oslanjanje na brze shell skripte za backup i obnovu značajno smanjuje rizik od gubitka podataka. Vi dobijaš veću kontrolu: pokretanje iz terminala, planiranje putem cron-a, integracija sa sistemskim logovima i lakša obnova u slučaju kvara.

U ovom delu naučićete zašto su shell skripte često najbolji izbor za jednostavan, pouzdan i prenosiv backup: koriste osnovne alate već instalirane na skoro svakom Linux sistemu, male su i lako ih je verzionisati uz git. Fokus će biti na praktičnim principima koje možete brzo primeniti.

Šta treba da pripremite pre nego što pišete skriptu

Osnovni zahtevi i alati

  • Alati: tar za arhiviranje, rsync za inkrementalne kopije, gzip/bzip2/xz za kompresiju, cron za raspoređivanje zadataka, systemd timers kao alternativa.
  • Pristup: korisnik sa odgovarajućim pravima za čitanje izvora i pisanje ciljne lokacije (lokalni disk, eksterni disk, mrežni share).
  • Prostor i kvote: osigurajte dovoljno prostora i plan zadržavanja starih backup fajlova.
  • Sigurnost: enkripcija (gpg) ako backup ide van lokalne mreže ili na cloud.

Osnovni principi koje vaša skripta treba da poštuje

Kada pišete brzu skriptu, držite se nekoliko jednostavnih pravila kako bi bila pouzdana i laka za održavanje:

  • Imenujte fajlove sa datumom (npr. backup-2026-03-11.tar.gz) da biste lako identifikovali verzije.
  • Logujte izvršenje i greške u poseban fajl kako biste mogli retroaktivno da proverite šta se dogodilo.
  • Radite atomsku zamenu: prvo stvaranje novo arhive pa tek zatim brisanje starih — tako se smanjuje rizik od nedovršenih backup-a.
  • Koristite rsync za velike skupove podataka jer prenosi samo razlike i štedi vreme i prostor.
  • Testirajte obnovu — backup nije vredan dok ne možete uspešno da vratite podatke.

Posmatrajte skriptu kao deo operativnog postupka: plan zadržavanja, verifikacija integriteta i automatizacija su jednako bitni kao i sama komanda koja pravi kopiju. U sledećem delu ću vam pokazati konkretnu, minimalnu ali robusnu shell skriptu korak po korak, objasniću svaku naredbu i kako je možete prilagoditi za rsync, tar i cron automatizaciju.

Minimalna, robusna shell skripta (korak po korak)

Evo jednostavnog primera koji možete smestiti u /usr/local/bin/backup.sh i prilagoditi svojim putanjama. Fokus je na jasnoći, logovanju, zaključavanju (da se dva procesa ne pokreću istovremeno) i verifikaciji arhive.

#!/bin/bash
set -euo pipefail

SRC="/home/user/data"
DEST="/mnt/backup"
DATE=$(date +%F_%H%M)
FNAME="backup-${DATE}.tar.gz"
LOGFILE="/var/log/backup.log"
LOCKDIR="/var/lock/backup.lock"
RETENTION_DAYS=14

# create dest and log dir
mkdir -p "$DEST"
touch "$LOGFILE"

# simple lock using mkdir (atomic)
if ! mkdir "$LOCKDIR" 2>/dev/null; then
  echo "$(date +'%F %T') - Backup already running, exiting" >> "$LOGFILE"
  exit 1
fi
trap 'rm -rf "$LOCKDIR"' EXIT

echo "$(date +'%F %T') - Starting backup $FNAME" >> "$LOGFILE"

# create archive atomically: create in dest with temporary name then rename
TMP="${DEST}/${FNAME}.tmp"
tar --exclude='.cache' -czf "$TMP" -C "$(dirname "$SRC")" "$(basename "$SRC")"
# verify tar (list contents) - non-zero exit on failure
tar -tzf "$TMP" >/dev/null

# atomic move to final filename
mv "$TMP" "${DEST}/${FNAME}"
echo "$(date +'%F %T') - Backup completed: ${DEST}/${FNAME}" >> "$LOGFILE"

# rotate old backups
find "$DEST" -maxdepth 1 -name 'backup-*.tar.gz' -mtime +"$RETENTION_DAYS" -exec rm -f {} ;

Objašnjenje ključnih delova:

  • set -euo pipefail — strogo grešenje i zaštita od nedefinisanih promenljivih
  • LOCKDIR + trap — sprečava istovremeno pokretanje skripte; trap obezbeđuje čišćenje
  • TMP fajl i mv — prvo napravite kompletan fajl pa ga atomično premestite, smanjujući rizik od delimičnih backup-a
  • tar -tzf — brz način da proverite da je arhiva konzistentna
  • find … -mtime — jednostavna rotacija starih arhiva
Article Image

Prilagođavanje: rsync, enkripcija i cron automatizacija

Ako imate velike skupove podataka ili želite efikasne inkrementalne kopije, rsync je bolji izbor. Primer inkrementalnog pristupa koristeći rsync snapshot (hardlink snapshot metoda):

# rsync snapshot primer (sa hardlinkovima)
DEST_ROOT="/mnt/backup/snapshots"
LATEST="${DEST_ROOT}/latest"
NEW="${DEST_ROOT}/$(date +%F_%H%M)"
mkdir -p "$DEST_ROOT"
rsync -aAX --delete --link-dest="$LATEST" /home/user/data/ "$NEW/"
ln -sfn "$NEW" "$LATEST"

Ovaj pristup čuva prethodne verzije ekonomično (hardlink-ovi) dok –delete sinhronizuje tačno stanje izvora. Potrudite se da ciljni fajl sistem podržava hardlinkove (npr. ext4, xfs).

Za enkripciju pre slanja van mreže možete koristiti GPG. Primer simetrične enkripcije (pažljivo čuvajte lozinku):

gpg --symmetric --cipher-algo AES256 --batch --passphrase-file /root/.backup_passphrase 
  --output "${DEST}/${FNAME}.gpg" "${DEST}/${FNAME}"
rm -f "${DEST}/${FNAME}"  # obrišite nekriptovanu arhivu ako je sve ok

Napomena: bolja praksa je korišćenje asimetrične enkripcije sa javnim ključem servera ili korišćenje ključeva u sigurnom keystore-u.

Za automatizaciju koristite cron ili systemd timers. Jedna linija za dnevni pokret u 2:00 ujutru:

0 2   * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Ako želite veću kontrolu nad okruženjem i retry logikom, systemd timer daje bolju integraciju (restart policy, zavisnosti, izolovano okruženje). Kreirajte .service koji poziva skriptu i .timer koji ga raspoređuje.

U sledećem delu pokazaću kako dodati verifikaciju integriteta (SHA checksums), obaveštavanje putem e-maila, i primer systemd timer konfiguracije za pouzdanije raspoređivanje.

Article Image

Verifikacija, obaveštavanje i systemd timer

Nakon kreiranja arhive, korisno je dodati još slojeva provere i obaveštavanja kako biste brzo uočili i rešili probleme:

  • Verifikacija integriteta: generišite SHA256 sumu za svaku arhivu (sha256sum) i čuvajte je zasebno. Pri obnovi prvo uporedite sumu da biste potvrdili da arhiva nije oštećena. Takođe razmislite o periodičnom testnom otvaranju arhiva ili probe vraćanja nekoliko fajlova.
  • Obaveštavanje: nakon uspešnog ili neuspešnog backup-a pošaljite email ili Slack/Telegram obaveštenje sa kratkim rezimeom i logom. Na serveru možete koristiti msmtp, sendmail ili alate za webhook integraciju; u skriptu presrećite greške i pošaljite odgovarajući status.
  • Systemd timer: umesto cron-a, systemd timer omogućava bolju kontrolu restart politika, izolaciju i zavisnosti. Napravite .service koji pokreće skriptu i .timer koji određuje raspored; systemctl status i journalctl će olakšati dijagnostiku.

Završne smernice

Testirajte svaki korak u izolovanom okruženju pre nego što ga uvedete u produkciju. Automatski backup bez verifikacije i periodičnih testova vraćanja lako daje lažan osećaj sigurnosti — proveravajte restore proces najmanje jednom u nekoliko meseci. Takođe, čuvajte lozinke i privatne ključeve na sigurnom mestu, koristite enkripciju za off-site kopije i razmislite o geografskom razmeštaju podataka radi otpornosti na katastrofe. Ako želite dublje da proučite raspoređivanje sa systemd timerima, pogledajte systemd timers dokumentaciju.

Frequently Asked Questions

Kako sprečiti da se backup skripta pokrene dva puta istovremeno?

Korišćenjem jednostavnog mehanizma zaključavanja — na primer atomskog mkdir ili lockf — i postavljanjem trap koji uklanja lock pri izlazu. U skripti iz primera koristili smo LOCKDIR + trap da bismo sprečili paralelno izvršavanje.

Kako brzo proveriti da li je tar arhiva ispravna?

Najbrži test je pokretanje tar -tzf da biste listali sadržaj arhive; ukoliko komanda uspe bez greške, arhiva nije oštećena. Dodatno, generisanje i provera SHA256 sume daje veću sigurnost integriteta fajla na nivou bita.

Da li treba enkriptovati backup koji šaljem van mreže?

Da — uvek enkriptujte backup koji izlazi iz vaše kontrolisane mreže. Simetrična enkripcija može biti jednostavnija za automatizaciju, ali asimetrična enkripcija (javni ključ servera) ili korišćenje sigurnog keystore-a pruža bolju zaštitu ključeva.