Автоматизирано сваляне и ротация на Proxmox LXC бекъпи с Bash
Подробно ръководство за Bash скрипт, който автоматично изтегля най-новите бекъпи на Proxmox LXC контейнери през SSH/SCP и поддържа ротация на локалното си пространство.
Зависимости
openssh-clientbashcoreutils Употреба
./sync_proxmox_backups.sh Управлението на резервни копия (backups) е един от най-важните стълбове в системната администрация. Въпреки че Proxmox VE предлага отлични вградени механизми за периодично архивиране на LXC контейнери и виртуални машини, съхраняването на копие извън основния сървър (off-site backup) гарантира защита срещу хардуерни повреди и непредвидени инциденти.
В тази статия разглеждаме Bash скрипт за автоматизирано сваляне на най-новите бекъпи за избрани LXC контейнери от отдалечен Proxmox сървър, както и автоматично премахване на остарелите архивни копия.
Какво представлява скриптът?
Този Bash скрипт е лека автоматизация за клиенти или вторични сървъри (например локална NAS система или работна станция), която:
- Свързва се с отдалечения Proxmox VE сървър през сигурна SSH връзка.
- Идентифицира най-новия бекъп файл за предварително определен списък от LXC контейнери (по техните ID-та).
- Проверява дали файлът вече съществува в локалното хранилище, предотвратявайки излишно повторно сваляне.
- Изтегля нови архивни копия чрез
scp. - Ротира (поддържа) само определен брой копия локално (
KEEP), изтривайки по-старите архиви, за да спести дисково пространство.
Предварителни изисквания (Prerequisites)
За да работи скриптът правилно, е необходимо да организирате следната конфигурация:
-
SSH ключ без парола: На машината, където ще се изпълнява скриптът, генерирайте SSH двойка ключове (ако нямате такава) и я копирайте на Proxmox сървъра:
ssh-copy-id root@proxmox-ip -
Конфигуриран SSH хост (
~/.ssh/config): За да съвпада със стойносттаSERVER="prox"в скрипта, добавете следния запис в файла~/.ssh/config:Host prox HostName 192.168.1.100 # Заменете с IP на вашия Proxmox User root IdentityFile ~/.ssh/id_rsa -
Необходими пакети: Повечето Linux дистрибуции и WSL (Windows Subsystem for Linux) разполагат с
bash,scpиopenssh-clientпо подразбиране.
Пълен код на скрипта
#!/bin/bash
# ====== КОНФИГУРАЦИЯ ======
SERVER="prox" # SSH host (от ~/.ssh/config)
REMOTE_DIR="/backup512/dump" # Папка с бекъпи на сървъра
LOCAL_DIR="/mnt/d/backup_proxmox_10.2026" # Локална папка
CONTAINERS=(116 222 150 113) # ID-та на контейнерите
KEEP=2 # Колко бекъпа да пазим на контейнер
# ==========================
# Създаваме локалната папка, ако не съществува
mkdir -p "$LOCAL_DIR"
echo "=== Стартиране на $(date '+%Y-%m-%d %H:%M:%S') ==="
echo "Локална папка: $LOCAL_DIR"
echo
for CT in "${CONTAINERS[@]}"; do
echo "--- Контейнер $CT ---"
# Вземаме най-новия файл от сървъра за този CT
LATEST=$(ssh "$SERVER" "ls -t $REMOTE_DIR/vzdump-lxc-${CT}-*.tar.zst 2>/dev/null | head -n 1")
if [ -z "$LATEST" ]; then
echo " [!] Няма намерен бекъп за CT $CT на сървъра."
continue
fi
FILENAME=$(basename "$LATEST")
echo " Най-нов на сървъра: $FILENAME"
# Проверяваме дали вече го имаме локално
if [ -f "$LOCAL_DIR/$FILENAME" ]; then
echo " [=] Вече е изтеглен локално. Пропускаме."
else
echo " [↓] Сваляне..."
scp "$SERVER:$LATEST" "$LOCAL_DIR/" || {
echo " [X] Грешка при сваляне на $FILENAME"
continue
}
echo " [✓] Свален успешно."
fi
# Изтриваме стари бекъпи за този CT (пазим само последните $KEEP)
# Сортираме по дата (от името на файла), най-новите първи
mapfile -t OLD_FILES < <(ls -t "$LOCAL_DIR"/vzdump-lxc-${CT}-*.tar.zst 2>/dev/null | tail -n +$((KEEP + 1)))
if [ ${#OLD_FILES[@]} -gt 0 ]; then
for f in "${OLD_FILES[@]}"; do
echo " [x] Изтриване на стар: $(basename "$f")"
rm -f "$f"
done
fi
echo
done
echo "=== Готово на $(date '+%Y-%m-%d %H:%M:%S') ==="
Какво прави скриптът
✅ Създава /mnt/d/backup_proxmox_10.2026, ако не съществува
✅ За всеки контейнер (116, 222, 150, 113) намира най-новия бекъп на сървъра
✅ Проверява дали вече го има локално — ако да, не го сваля пак (спестява време и трафик)
✅ Сваля новия бекъп
✅ Изтрива най-старите, ако има повече от 2 за даден контейнер
✅ Пази оригиналните имена (с дата и час), за да не се объркваш
Промени в конфигурацията
-
SERVER="prox": Ако ползваш пълен адрес, сложи user@host вместо prox -
REMOTE_DIR: Директорията в Proxmox, в коятоvzdumpзаписва архивите (обикновено/var/lib/vz/dumpили външен storage mount point). -
LOCAL_DIR: Смени месеца, когато дойде ноември -
CONTAINERS: Добави/махни ID-та, разделени със интервал -
KEEP: Колко бекъпа да пази (ти искаш 2)
Бонус съвет 💡
Ако искате да сменяте папката автоматично всеки месец, заменете реда:
LOCAL_DIR="/mnt/d/backup_proxmox_10.2026"
с:
LOCAL_DIR="/mnt/d/backup_proxmox_$(date '+%m.%Y')"
Така сам ще си прави нова папка всеки месец и няма да се налага да редактирате скрипта. 🎯
Начин на употреба
- Запазете скрипта във файл, например
sync_proxmox.sh. - Дайте му права за изпълнение:
chmod +x sync_proxmox.sh - Стартирайте го ръчно за тест:
./sync_proxmox.sh
Настройка на автоматично изпълнение (Cron job)
За да се изпълнява скриптът автоматично (например всяка нощ в 03:00 ч.), добавете го в crontab:
crontab -e
Добавете следния ред:
0 3 * * * /path/to/sync_proxmox.sh >> /var/log/proxmox_sync.log 2>&1
Заключение
Този скрипт предлага проста, ефективна и независима от външни сложни системи автоматизация за архивиране. Той осигурява надеждна Off-site защита за вашите Proxmox LXC контейнери, като същевременно се грижи за дисковото пространство на локалната машина.