Назад към каталога
Илюстрация на автоматизация: терминал, зъбчати колела и конвейер от задачи
Автоматизация ⭐ Препоръчан v1.0.0 • 7.10.2026 г. • 🐚 bash

Автоматизирано сваляне и ротация на Proxmox LXC бекъпи с Bash

Подробно ръководство за Bash скрипт, който автоматично изтегля най-новите бекъпи на Proxmox LXC контейнери през SSH/SCP и поддържа ротация на локалното си пространство.

Зависимости

openssh-clientbashcoreutils

Употреба

./sync_proxmox_backups.sh
proxmoxbashbackuplxclinuxautomationscpssh

Управлението на резервни копия (backups) е един от най-важните стълбове в системната администрация. Въпреки че Proxmox VE предлага отлични вградени механизми за периодично архивиране на LXC контейнери и виртуални машини, съхраняването на копие извън основния сървър (off-site backup) гарантира защита срещу хардуерни повреди и непредвидени инциденти.

В тази статия разглеждаме Bash скрипт за автоматизирано сваляне на най-новите бекъпи за избрани LXC контейнери от отдалечен Proxmox сървър, както и автоматично премахване на остарелите архивни копия.


Какво представлява скриптът?

Този Bash скрипт е лека автоматизация за клиенти или вторични сървъри (например локална NAS система или работна станция), която:

  1. Свързва се с отдалечения Proxmox VE сървър през сигурна SSH връзка.
  2. Идентифицира най-новия бекъп файл за предварително определен списък от LXC контейнери (по техните ID-та).
  3. Проверява дали файлът вече съществува в локалното хранилище, предотвратявайки излишно повторно сваляне.
  4. Изтегля нови архивни копия чрез scp.
  5. Ротира (поддържа) само определен брой копия локално (KEEP), изтривайки по-старите архиви, за да спести дисково пространство.

Предварителни изисквания (Prerequisites)

За да работи скриптът правилно, е необходимо да организирате следната конфигурация:

  1. SSH ключ без парола: На машината, където ще се изпълнява скриптът, генерирайте SSH двойка ключове (ако нямате такава) и я копирайте на Proxmox сървъра:

    ssh-copy-id root@proxmox-ip
  2. Конфигуриран SSH хост (~/.ssh/config): За да съвпада със стойността SERVER="prox" в скрипта, добавете следния запис в файла ~/.ssh/config:

    Host prox
        HostName 192.168.1.100  # Заменете с IP на вашия Proxmox
        User root
        IdentityFile ~/.ssh/id_rsa
  3. Необходими пакети: Повечето 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')"

Така сам ще си прави нова папка всеки месец и няма да се налага да редактирате скрипта. 🎯

Начин на употреба

  1. Запазете скрипта във файл, например sync_proxmox.sh.
  2. Дайте му права за изпълнение:
    chmod +x sync_proxmox.sh
  3. Стартирайте го ръчно за тест:
    ./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 контейнери, като същевременно се грижи за дисковото пространство на локалната машина.