V predošlom článku som konfiguroval rclone, pomocou ktorého dokážem odosielať zálohy LXC/KVM na úložisko google drive. Na zálohovanie a odosielanie súborov som použil jednoriadkové príkazy. Prvý príkaz vytvorí zálohu LXC a druhým príkazom sa odošle na google disk.
vzdump 115 --mode stop --compress zstd --storage local --notes "moja poznamka k lxc/kvm"
rclone copy /var/lib/vz/dump/vzdump-lxc-115-2024_09_01-16_00_38.tar.zst mygdrive_crypt:/backup
V súčasnosti na mojom Proxmox VE beží 15x LXC a 2x KVM. Ako som uviedol v predošlom článku, zálohovať by som chcel 1x do týždňa. Nič mi nebráni v tom, aby som proces zálohy a odosielania na google disk nerobil v jednom riadku s dvojitým ampersandom &&.
vzdump 115 --mode stop --compress zstd --storage local --notes "moja poznamka k lxc/kvm" && rclone copy /var/lib/vz/dump/vzdump-lxc-115-2024_09_01-16_00_38.tar.zst mygdrive_crypt:/backup
Tento príkaz by som musel spustiť 17x, vždy upraviť ID LXC/KVM a názov zálohy. Preto som uvažoval nad skriptom, ktorý spraví túto prácu za mňa. Ak by som si platil google drive, tak by som mal omnoho väčší priestor pre zálohy, ale teraz mám priestor obmedzený, takže staršie zálohy musím postupne odstraňovať.
Najprv uvediem ako si predstavujem kompletný proces od zálohy až po odstránenie prebytočných záloh.
- Pomocou vzdump sa vytvori záloha LXC/KVM v režime stop
- Pomocou vzdump sa vytvori záloha 1x KVM v režime snapshot (vysvetlím neskôr)
- Pomocou rclone sa záloha zašifruj a odošle na google drive
- predošlá záloha sa z google disku odstráni
- predošlá záloha sa tiež odstráni z Proxmox úložiska
- Toto sa nastaví pre každý LXC/KVM bez zásahu užívateľa
- Nastaví sa cron aby sa tento proces spúšťal automaticky
Vzhľadom k tomu, že na Proxmoxe virtualizujem aj firewall/router pfSense (zabezpečuje pripojenie na internet), musím túto zálohu vytvoriť v režime snapshot. Dôvod je ten, že ak by som pfSense zálohoval v režime stop, tak po zálohovaní a znovu spustení KVM by sa rclone nevedel pripojiť na google disk. Bola by tu možnosť aby si skript očekoval dostupnosť internetu a začal kopírovať až potom, ale odpojenie internetu by toho skomplikovalo podstatne viac.
Rclone sme inštalovali priamo na Proxmox VE ako root a tak isto to spravíme aj s auto-backup skriptom. Prihlásime sa cez SSH (alebo webshell) na Proxmox VE a vytvorime súbor
nano backup.sh
Do súboru nakopírujeme obsah skriptu
#!/bin/bash
# Konfiguracia
BACKUP_DIR="/var/lib/vz/dump" # Prednastaveny adresar, kde Proxmox uklada zalohy
REMOTE_NAME="mygdrive_crypt" # Nazov vzdialeneho uloziska nakonfigurovany v rclone
REMOTE_DIR="/backup" # Cielovy adresar na Google Drive
# Ziskanie zoznamu vsetkych LXC kontajnerov
LXC_IDS=$(/usr/sbin/pct list | awk 'NR>1 {print $1}')
# Ziskanie zoznamu vsetkych VM
VM_IDS=$(/usr/sbin/qm list | awk 'NR>1 {print $1}')
# Funkcia na zalohovanie a nahratie na Google Drive
backup_and_upload() {
local ID=$1
local TYPE=$2
local MODE=$3
echo "Spustam zalohu pre $TYPE s ID $ID v rezime $MODE..."
vzdump $ID --mode $MODE --compress zstd --dumpdir $BACKUP_DIR
# Zistenie nazvu suboru poslednej zalohy
if [ "$TYPE" == "LXC" ]; then
BACKUP_FILE=$(ls -t $BACKUP_DIR/vzdump-lxc-$ID-*.tar.zst | head -n 1)
PREVIOUS_BACKUP_FILE=$(rclone lsf "$REMOTE_NAME:$REMOTE_DIR" | grep "vzdump-lxc-$ID-.*\.tar\.zst")
else
BACKUP_FILE=$(ls -t $BACKUP_DIR/vzdump-qemu-$ID-*.vma.zst | head -n 1)
PREVIOUS_BACKUP_FILE=$(rclone lsf "$REMOTE_NAME:$REMOTE_DIR" | grep "vzdump-qemu-$ID-.*\.vma\.zst")
fi
# Kontrola, ci bola zaloha uspesne vytvorena
if [ -f "$BACKUP_FILE" ]; then
echo "Zaloha uspesne vytvorena: $BACKUP_FILE"
else
echo "Zaloha zlyhala!"
return 1
fi
# Nahratie novej zalohy na Google Drive
echo "Nahravam zalohu na Google Drive..."
rclone copy "$BACKUP_FILE" "$REMOTE_NAME:$REMOTE_DIR"
# Kontrola, ci bolo nahravanie uspesne
if [ $? -eq 0 ]; then
echo "Zaloha uspesne nahrana na Google Drive!"
# Ak existuje predosla zaloha na Google Drive, trvale ju vymaz
if [ ! -z "$PREVIOUS_BACKUP_FILE" ]; then
echo "Trvale mazanie predoslej zalohy z Google Drive: $PREVIOUS_BACKUP_FILE"
rclone delete "$REMOTE_NAME:$REMOTE_DIR/$PREVIOUS_BACKUP_FILE" --drive-use-trash=false
fi
# Vymazanie predoslej lokalnej zalohy
if [ ! -z "$PREVIOUS_BACKUP_FILE" ]; then
echo "Mazem predoslu lokalnu zalohu: $PREVIOUS_BACKUP_FILE"
rm -f "$BACKUP_DIR/$PREVIOUS_BACKUP_FILE"
fi
else
echo "Nahravanie na Google Drive zlyhalo!"
return 1
fi
echo "Zalohovaci proces pre $TYPE s ID $ID dokonceny."
}
# Cyklenie cez vsetky LXC kontajnery a vykonanie zalohy
for ID in $LXC_IDS; do
backup_and_upload $ID "LXC" "stop"
done
# Cyklenie cez vsetky VM a vykonanie zalohy
for ID in $VM_IDS; do
if [ "$ID" -eq 100 ]; then
backup_and_upload $ID "VM" "snapshot"
else
backup_and_upload $ID "VM" "stop"
fi
done
echo "Vsetky zalohovacie procesy su dokoncene."
Skript je komentovaný, takže, len v skratke uvediem o čo ide. Na začiatku nastavíme 3 konštanty (riadok 4,5,6). Vypíšeme, koľko máme LXC a koľko KVM. Ďalej nasleduje funkcia zálohovania a uploadu záloh na google disk. Následne skript vytvorí prvú zálohu pomocou vzdump. Ďalej si uložíme do premenných poslednú zálohu LXC/KVM v Proxmoxe a na google drive. Podmienka IF rozpozná či pôjde o LXC, alebo KVM. Na riadku 33 preveríme či bola záloha skutočne vytvorená. Na riadku 42, odosielame zálohu na google drive. Ak je návratový kód s predošlého príkazu rovný nule, tak záloha sa na google drive úspešne nahrala. Odstránia sa predošlé zálohy z google drive a z lokálneho úložiska. Od riadku 69 nasleduje FOR cyklus pre každý LXC a KVM. Ako je vidieť, tak KVM 100, musím zálohovať v režime snapshot, preto je v cykle, ďalšia podmienka. Ako som už uviedol vyššie, tak KVM 100 je pfSense a ten si nemôžem dovoliť vypnúť. Skript uložíme a nastavíme práva pre spustenie. Skript môžeme spustiť aby sme otestovali funkčnosť. V mojom prípade trvá celý proces asi 45 minút.
chmod +x backup.sh
./backup.sh
Nakoniec som sa rozhodol, že v mojom prípade bude stačiť zálohovať 1x do mesiaca. Čiže som to nastavil na prvý pondelok v mesiaci o 02:30 hod. Ak by som chcel spúšťať skript, 1x do týždňa, tak to nastavíme ako je v druhom riadku.
touch backup.log
crontab -e
30 2 * * 1 [ "$(date +\%d)" -le 7 ] && /root/backup.sh >> /root/backup.log 2>&1
30 2 * * 1 /root/backup.sh >> /root/backup.log 2>&1
Záver
Tento skript je špecifický nastavený pre môj konkrétny prípad. Jeho funkčnosť som otestoval a funguje správne. Ak by niekto chcel skript použiť, tak nech si ho upraví podľa svojich parametrov. Ide najmä o riadok 5, 6 a cykly for od riadku 74 (príp. aj riadok 70 ak je záujem o iný režim zálohy).