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

Скрипт за автоматични 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. И не само това – той също така се грижи за автоматичното почистване на тези бекъпи, като поддържа само последните два и изтрива всички, които са по-стари от два дни.

Ето основните стъпки, които изпълнява:

  1. Проверява и създава локалната папка: Първо, скриптът се уверява, че избраната от вас папка във Windows съществува. Ако не, той я създава.
  2. Проверява SSH връзката: Преди да направи каквото и да е, скриптът тества дали може да се свърже с Proxmox сървъра ви през SSH. Това е супер удобно, защото веднага разбирате, ако има проблем с мрежата или SSH ключовете.
  3. Синхронизира бекъпите с rsync: Това е сърцето на операцията! Вместо просто scp (което копира файл по файл), аз избрах rsync. rsync е много по-интелигентен – той копира само новите или променени части на файловете. Това означава, че ако един бекъп вече е копиран и е направен нов, който е почти същият, rsync ще прехвърли само разликите, което е супер бързо и пести трафик. Скриптът е настроен да търси само vzdump-lxc-*.tar.zst файловете.
  4. Почиства по-стари от 2 дни: След като всичко е синхронизирано, скриптът преглежда локалната папка и изтрива всички vzdump-lxc-*.tar.zst файлове, които са модифицирани преди повече от 2 дни.
  5. Поддържа само 2 най-нови бекъпа: Като допълнителна мярка за чистота, дори ако имате няколко бекъпа, които не са по-стари от 2 дни, скриптът гарантира, че ще запази само двамата най-нови и ще изтрие всички останали (по-стари от тях). Така винаги имате само последните две версии на всеки LXC контейнер.

Как се използва? (Настройка и изпълнение)

Ако искате да го използвате, ето как става:

Стъпка 1: Инсталирайте WSL и Ubuntu

Ако все още нямате WSL и Ubuntu, инсталацията е доста лесна:

  • Отворете PowerShell или Windows Terminal като администратор.
  • Изпълнете командата: wsl --install -d Ubuntu
  • Следвайте инструкциите за настройка на потребителско име и парола.

Стъпка 2: Настройте SSH достъп до Proxmox

За да работи скриптът, вашият WSL Ubuntu трябва да може да се свързва с Proxmox без въвеждане на парола. Това става с SSH ключове:

  1. Генерирайте SSH ключ (ако нямате): Във вашия WSL терминал изпълнете: ssh-keygen -t rsa -b 4096 Натискайте Enter за стандартните опции (без парола, освен ако не знаете какво правите).
  2. Копирайте публичния ключ на Proxmox: Изпълнете: ssh-copy-id -i ~/.ssh/id_rsa.pub root@<IP_НА_ВАШИЯ_PROXMOX> Въведете паролата за root на Proxmox, когато бъдете попитани.
  3. Настройте SSH алиас (препоръчително!): За да направите скрипта по-чист, аз използвам SSH алиас. Създайте или редактирайте файла ~/.ssh/config във вашия WSL Ubuntu:
Host prox
    Hostname <IP_НА_ВАШИЯ_PROXMOX>
    User root
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

  1. Запазете файла (Ctrl+O, Enter, Ctrl+X). Сега можете да използвате ssh prox вместо ssh root@<IP_НА_ВАШИЯ_PROXMOX>.

Стъпка 3: Създайте и конфигурирайте скрипта

  1. Създайте файла: Във вашия 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: Дайте права за изпълнение и стартирайте скрипта

  1. Дайте права: В WSL терминала:
chmod +x proxmox_backup.sh

2. Изпълнете скрипта:

./proxmox_backup.sh

Скриптът ще започне да работи и ще ви дава подробна информация за всяка стъпка.


Автоматизация с cron (по желание)

Ако искате бекъпите да се правят автоматично, можете да използвате cron в Ubuntu:

  1. Отворете cron таблицата за редактиране:
crontab -e

Добавете ред за изпълнение: Например, за да изпълнявате скрипта всеки ден в 3 сутринта:

0 3 * * * /home/вашето_потребителско_име/proxmox_backup.sh >> /var/log/proxmox_backup.log 2>&1

  1. Заменете /home/вашето_потребителско_име/proxmox_backup.sh с пълния път до вашия скрипт. >> /var/log/proxmox_backup.log 2>&1 пренасочва изхода на скрипта към лог файл, което е полезно за дебъгване.

Надявам се, че този скрипт ще ви бъде толкова полезен, колкото е и на мен! Чувството да имаш автоматизирани и подредени бекъпи, директно на твоя компютър, е просто безценно. Успех и дано ви спести много време и главоболия!

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: