Скрипт за автоматични Proxmox бeкъпи директно във Windows (през WSL!)

Здравейте на всички!
Напоследък все повече се потапям в света на WSL (Windows Subsystem for Linux) и по-конкретно използвам Ubuntu на моя Windows 11 компютър. Като човек, който си играе доста с Proxmox у дома, винаги съм търсил елегантен начин да си правя бекъпи на виртуалките и LXC контейнерите директно на Windows дисковете. Честно казано, досега беше малко досадно да ги дърпам ръчно или да се чудя как да ги синхронизирам.
И така, реших да си напиша един bash скрипт, който да автоматизира целия процес! Исках нещо, което да е лесно за настройка, да дърпа само новите бекъпи и, най-важното, да чисти старите, за да не препълва диска.
Какво прави моят скрипт?
Накратко, този скрипт автоматизира процеса на копиране на Proxmox LXC архиви (файловете vzdump-lxc-*.tar.zst
) от вашия Proxmox сървър директно във ваша избрана папка на Windows, използвайки WSL. И не само това – той също така се грижи за автоматичното почистване на тези бекъпи, като поддържа само последните два и изтрива всички, които са по-стари от два дни.
Ето основните стъпки, които изпълнява:
- Проверява и създава локалната папка: Първо, скриптът се уверява, че избраната от вас папка във Windows съществува. Ако не, той я създава.
- Проверява SSH връзката: Преди да направи каквото и да е, скриптът тества дали може да се свърже с Proxmox сървъра ви през SSH. Това е супер удобно, защото веднага разбирате, ако има проблем с мрежата или SSH ключовете.
- Синхронизира бекъпите с
rsync
: Това е сърцето на операцията! Вместо простоscp
(което копира файл по файл), аз избрахrsync
.rsync
е много по-интелигентен – той копира само новите или променени части на файловете. Това означава, че ако един бекъп вече е копиран и е направен нов, който е почти същият,rsync
ще прехвърли само разликите, което е супер бързо и пести трафик. Скриптът е настроен да търси самоvzdump-lxc-*.tar.zst
файловете. - Почиства по-стари от 2 дни: След като всичко е синхронизирано, скриптът преглежда локалната папка и изтрива всички
vzdump-lxc-*.tar.zst
файлове, които са модифицирани преди повече от 2 дни. - Поддържа само 2 най-нови бекъпа: Като допълнителна мярка за чистота, дори ако имате няколко бекъпа, които не са по-стари от 2 дни, скриптът гарантира, че ще запази само двамата най-нови и ще изтрие всички останали (по-стари от тях). Така винаги имате само последните две версии на всеки LXC контейнер.
Как се използва? (Настройка и изпълнение)
Ако искате да го използвате, ето как става:
Стъпка 1: Инсталирайте WSL и Ubuntu
Ако все още нямате WSL и Ubuntu, инсталацията е доста лесна:
- Отворете PowerShell или Windows Terminal като администратор.
- Изпълнете командата:
wsl --install -d Ubuntu
- Следвайте инструкциите за настройка на потребителско име и парола.
Стъпка 2: Настройте SSH достъп до Proxmox
За да работи скриптът, вашият WSL Ubuntu трябва да може да се свързва с Proxmox без въвеждане на парола. Това става с SSH ключове:
- Генерирайте SSH ключ (ако нямате): Във вашия WSL терминал изпълнете:
ssh-keygen -t rsa -b 4096
НатискайтеEnter
за стандартните опции (без парола, освен ако не знаете какво правите). - Копирайте публичния ключ на Proxmox: Изпълнете:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@<IP_НА_ВАШИЯ_PROXMOX>
Въведете паролата заroot
на Proxmox, когато бъдете попитани. - Настройте SSH алиас (препоръчително!): За да направите скрипта по-чист, аз използвам SSH алиас. Създайте или редактирайте файла
~/.ssh/config
във вашия WSL Ubuntu:
Host prox
Hostname <IP_НА_ВАШИЯ_PROXMOX>
User root
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
- Запазете файла (Ctrl+O, Enter, Ctrl+X). Сега можете да използвате
ssh prox
вместоssh root@<IP_НА_ВАШИЯ_PROXMOX>
.
Стъпка 3: Създайте и конфигурирайте скрипта
- Създайте файла: Във вашия WSL Ubuntu терминал създайте нов файл, например
proxmox_backup.sh
:
nano proxmox_backup.sh
Поставете кода: Копирайте целия код на скрипта по-долу и го поставете във файла.
Настройте променливите:
LOCAL_DIR="/mnt/d/backup_proxmox"
: ВАЖНО! Променете този път така, че да сочи към желаната папка на вашия Windows диск./mnt/c/
е C: диск,/mnt/d/
е D: диск и т.н. След това добавете името на папката, която искате да използвате.REMOTE_DIR="/var/lib/vz/dump"
: Това е стандартната директория за бекъпи в Proxmox. Ако сте я променили, актуализирайте я.REMOTE_HOST="prox"
: Това е SSH алиасът, който настроихме по-горе. Ако не сте настроили алиас, трябва да го замените сroot@<IP_НА_ВАШИЯ_PROXMOX>
.
Ето го и кодът на скрипта:
#!/bin/bash
# Настройки
LOCAL_DIR="/mnt/d/backup_proxmox" # Локална папка за архивите (на Windows)
REMOTE_DIR="/var/lib/vz/dump" # Отдалечена папка с архиви на Proxmox
REMOTE_HOST="prox" # SSH алиас за Proxmox хоста (например в ~/.ssh/config)
# ---
# 1. Създаване на целевата папка, ако не съществува
echo "📂 Проверявам локалната папка: $LOCAL_DIR"
mkdir -p "$LOCAL_DIR"
if [ ! -d "$LOCAL_DIR" ]; then
echo "❌ Грешка: Не мога да създам или достъпя локалната папка '$LOCAL_DIR'. Проверете пътя и разрешенията."
exit 1
fi
echo "🔍 Започвам синхронизация на Proxmox LXC архиви..."
# 2. Проверка на SSH връзката преди старт на синхронизацията
echo "📡 Проверявам SSH връзка с '$REMOTE_HOST'..."
ssh -q "$REMOTE_HOST" exit
if [ $? -ne 0 ]; then
echo "❌ Грешка: Не мога да установя SSH връзка с '$REMOTE_HOST'. Моля, проверете SSH алиаса или мрежовата свързаност."
exit 1
fi
echo "🔄 Синхронизирам архиви от ${REMOTE_HOST}:${REMOTE_DIR} към ${LOCAL_DIR}"
# 3. Използване на rsync за синхронизация
# Опции на rsync:
# -a: (archive mode) - рекурсивно копиране, запазва собственик, група, права, времена, символични връзки.
# -z: (compress) - компресира данни по време на трансфера, което пести трафик.
# -h: (human-readable) - показва размерите на файловете в по-четим формат (напр. KB, MB, GB).
# --progress: показва подробен прогрес на всеки файл.
# --include='vzdump-lxc-*.tar.zst': включва само файлове, които съвпадат с този шаблон.
# --exclude='*': изключва всички останали файлове, които не са изрично включени.
rsync_output=$(rsync -azh --progress \
--include='vzdump-lxc-*.tar.zst' \
--exclude='*' \
"${REMOTE_HOST}:${REMOTE_DIR}/" "$LOCAL_DIR/" 2>&1)
# 4. Проверка на резултата от rsync
if [ $? -eq 0 ]; then
echo "✅ Синхронизацията приключи успешно!"
else
echo "❌ Грешка при синхронизацията с rsync."
echo "Подробности за грешката:"
echo "$rsync_output"
exit 1
fi
# --- Функционалност за почистване на стари архиви ---
echo "🧹 Започвам почистване на стари архиви в $LOCAL_DIR..."
# 5. Изтриване на архиви по-стари от 2 дни
echo "🗑️ Изтривам архиви, по-стари от 2 дни..."
find "$LOCAL_DIR" -maxdepth 1 -type f -name 'vzdump-lxc-*.tar.zst' -mtime +2 -print0 | while IFS= read -r -d $'\0' old_file; do
echo " Изтривам по-стар от 2 дни: $(basename "$old_file")"
rm -f "$old_file"
done
# 6. Изтриване на най-старите архиви, ако има повече от 2
echo "🗑️ Проверявам за излишни архиви (оставям само 2 най-нови)..."
mapfile -t all_backups < <(find "$LOCAL_DIR" -maxdepth 1 -type f -name 'vzdump-lxc-*.tar.zst' -print0 | xargs -0 ls -t 2>/dev/null)
num_backups=${#all_backups[@]}
if [ "$num_backups" -gt 2 ]; then
echo " Намерени са $num_backups архива. Изтривам най-старите, за да останат само 2."
files_to_delete=("${all_backups[@]:2}")
for file_to_delete in "${files_to_delete[@]}"; do
echo " Изтривам излишен архив: $(basename "$file_to_delete")"
rm -f "$file_to_delete"
done
else
echo " Намерени са $num_backups архива. Няма излишни за изтриване (лимитът е 2)."
fi
echo "✅ Почистването приключи."
echo "✅ Готово! Всички архиви са в $LOCAL_DIR"
echo "Текущи архиви в $LOCAL_DIR:"
ls -lh "$LOCAL_DIR"/vzdump-lxc-*.tar.zst 2>/dev/null || echo " Няма намерени архиви."
Стъпка 4: Дайте права за изпълнение и стартирайте скрипта
- Дайте права: В WSL терминала:
chmod +x proxmox_backup.sh
2. Изпълнете скрипта:
./proxmox_backup.sh
Скриптът ще започне да работи и ще ви дава подробна информация за всяка стъпка.
Автоматизация с cron (по желание)
Ако искате бекъпите да се правят автоматично, можете да използвате cron в Ubuntu:
- Отворете cron таблицата за редактиране:
crontab -e
Добавете ред за изпълнение: Например, за да изпълнявате скрипта всеки ден в 3 сутринта:
0 3 * * * /home/вашето_потребителско_име/proxmox_backup.sh >> /var/log/proxmox_backup.log 2>&1
- Заменете
/home/вашето_потребителско_име/proxmox_backup.sh
с пълния път до вашия скрипт.>> /var/log/proxmox_backup.log 2>&1
пренасочва изхода на скрипта към лог файл, което е полезно за дебъгване.
Надявам се, че този скрипт ще ви бъде толкова полезен, колкото е и на мен! Чувството да имаш автоматизирани и подредени бекъпи, директно на твоя компютър, е просто безценно. Успех и дано ви спести много време и главоболия!
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut