backup_sync_pve2.sh
· 4.5 KiB · Bash
Surowy
#!/bin/bash
# Конфигурационен файл за втори Proxmox
CONFIG_FILE="$(dirname "$0")/backup_config_pve2.conf"
LOG_FILE="$(dirname "$0")/backup_sync_pve2.log"
DOWNLOADED_FILE="$(dirname "$0")/.downloaded_backups_pve2"
# Функция за логване
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# Проверка дали конфигурационният файл съществува
if [[ ! -f "$CONFIG_FILE" ]]; then
log "ERROR: Конфигурационният файл $CONFIG_FILE не съществува!"
cat > "$CONFIG_FILE" << 'EOF'
# Конфигурация за Proxmox backup sync - PVE2
PROXMOX_HOST=10.110.110.110
PROXMOX_USER=root
REMOTE_BACKUP_PATH=/mnt/backup/dump
LOCAL_BACKUP_PATH=/mnt/d/backup_proxmox_pve2
# LXC контейнери за синхронизиране (разделени със запетая)
# Пример: LXC_IDS=101,102,103
LXC_IDS=
# SSH опции
SSH_OPTIONS="-o ConnectTimeout=30 -o ServerAliveInterval=60"
# Максимален брой дни за задържане на локални бекъпи (0 = безкрайно)
KEEP_DAYS=30
EOF
log "Създаден е примерен конфигурационен файл: $CONFIG_FILE"
log "Моля, редактирайте го според вашите нужди и стартирайте отново скрипта."
exit 1
fi
# Зареждане на конфигурацията
source "$CONFIG_FILE"
# Създаване на локална директория ако не съществува
mkdir -p "$LOCAL_BACKUP_PATH"
# Създаване на файл за проследяване на свалените бекъпи
touch "$DOWNLOADED_FILE"
log "Започвам проверка за нови бекъпи от $PROXMOX_HOST..."
log "Наблюдавани LXC контейнери: $LXC_IDS"
# Функция за получаване на списък с отдалечени бекъпи
get_remote_backups() {
local lxc_id=$1
ssh $SSH_OPTIONS "${PROXMOX_USER}@${PROXMOX_HOST}" \
"find ${REMOTE_BACKUP_PATH} -name 'vzdump-lxc-${lxc_id}-*.tar.zst' -type f -printf '%f\n'" 2>/dev/null
}
# Функция за проверка дали бекъп е вече свален
is_downloaded() {
local backup_name=$1
grep -Fxq "$backup_name" "$DOWNLOADED_FILE"
}
# Функция за маркиране на бекъп като свален
mark_as_downloaded() {
local backup_name=$1
echo "$backup_name" >> "$DOWNLOADED_FILE"
}
# Функция за изтриване на стари локални бекъпи
cleanup_old_backups() {
if [[ "$KEEP_DAYS" -gt 0 ]]; then
log "Изтривам локални бекъпи по-стари от $KEEP_DAYS дни..."
find "$LOCAL_BACKUP_PATH" -name "vzdump-lxc-*.tar.zst" -type f -mtime +$KEEP_DAYS -delete
fi
}
# Главен цикъл за всеки LXC контейнер
IFS=',' read -ra LXC_ARRAY <<< "$LXC_IDS"
for lxc_id in "${LXC_ARRAY[@]}"; do
lxc_id=$(echo "$lxc_id" | xargs) # Премахване на интервали
log "Проверявам за нови бекъпи на LXC $lxc_id..."
# Получаване на списък с отдалечени бекъпи
remote_backups=$(get_remote_backups "$lxc_id")
if [[ -z "$remote_backups" ]]; then
log "Няма намерени бекъпи за LXC $lxc_id"
continue
fi
# Проверка за всеки бекъп
while IFS= read -r backup_file; do
[[ -z "$backup_file" ]] && continue
if ! is_downloaded "$backup_file"; then
log "Намерен нов бекъп: $backup_file"
log "Започвам сваляне..."
# Изпълнение на rsync
if rsync -avz --partial --progress -e "ssh $SSH_OPTIONS" \
"${PROXMOX_USER}@${PROXMOX_HOST}:${REMOTE_BACKUP_PATH}/${backup_file}" \
"${LOCAL_BACKUP_PATH}/"; then
log "Успешно свален: $backup_file"
mark_as_downloaded "$backup_file"
else
log "ERROR: Грешка при сваляне на $backup_file"
fi
else
log "Бекъп $backup_file вече е свален, прескачам..."
fi
done <<< "$remote_backups"
done
# Почистване на стари бекъпи
cleanup_old_backups
log "Завършена проверка за нови бекъпи от $PROXMOX_HOST."
| 1 | #!/bin/bash |
| 2 | |
| 3 | # Конфигурационен файл за втори Proxmox |
| 4 | CONFIG_FILE="$(dirname "$0")/backup_config_pve2.conf" |
| 5 | LOG_FILE="$(dirname "$0")/backup_sync_pve2.log" |
| 6 | DOWNLOADED_FILE="$(dirname "$0")/.downloaded_backups_pve2" |
| 7 | |
| 8 | # Функция за логване |
| 9 | log() { |
| 10 | echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" |
| 11 | } |
| 12 | |
| 13 | # Проверка дали конфигурационният файл съществува |
| 14 | if [[ ! -f "$CONFIG_FILE" ]]; then |
| 15 | log "ERROR: Конфигурационният файл $CONFIG_FILE не съществува!" |
| 16 | cat > "$CONFIG_FILE" << 'EOF' |
| 17 | # Конфигурация за Proxmox backup sync - PVE2 |
| 18 | PROXMOX_HOST=10.110.110.110 |
| 19 | PROXMOX_USER=root |
| 20 | REMOTE_BACKUP_PATH=/mnt/backup/dump |
| 21 | LOCAL_BACKUP_PATH=/mnt/d/backup_proxmox_pve2 |
| 22 | |
| 23 | # LXC контейнери за синхронизиране (разделени със запетая) |
| 24 | # Пример: LXC_IDS=101,102,103 |
| 25 | LXC_IDS= |
| 26 | |
| 27 | # SSH опции |
| 28 | SSH_OPTIONS="-o ConnectTimeout=30 -o ServerAliveInterval=60" |
| 29 | |
| 30 | # Максимален брой дни за задържане на локални бекъпи (0 = безкрайно) |
| 31 | KEEP_DAYS=30 |
| 32 | EOF |
| 33 | log "Създаден е примерен конфигурационен файл: $CONFIG_FILE" |
| 34 | log "Моля, редактирайте го според вашите нужди и стартирайте отново скрипта." |
| 35 | exit 1 |
| 36 | fi |
| 37 | |
| 38 | # Зареждане на конфигурацията |
| 39 | source "$CONFIG_FILE" |
| 40 | |
| 41 | # Създаване на локална директория ако не съществува |
| 42 | mkdir -p "$LOCAL_BACKUP_PATH" |
| 43 | |
| 44 | # Създаване на файл за проследяване на свалените бекъпи |
| 45 | touch "$DOWNLOADED_FILE" |
| 46 | |
| 47 | log "Започвам проверка за нови бекъпи от $PROXMOX_HOST..." |
| 48 | log "Наблюдавани LXC контейнери: $LXC_IDS" |
| 49 | |
| 50 | # Функция за получаване на списък с отдалечени бекъпи |
| 51 | get_remote_backups() { |
| 52 | local lxc_id=$1 |
| 53 | ssh $SSH_OPTIONS "${PROXMOX_USER}@${PROXMOX_HOST}" \ |
| 54 | "find ${REMOTE_BACKUP_PATH} -name 'vzdump-lxc-${lxc_id}-*.tar.zst' -type f -printf '%f\n'" 2>/dev/null |
| 55 | } |
| 56 | |
| 57 | # Функция за проверка дали бекъп е вече свален |
| 58 | is_downloaded() { |
| 59 | local backup_name=$1 |
| 60 | grep -Fxq "$backup_name" "$DOWNLOADED_FILE" |
| 61 | } |
| 62 | |
| 63 | # Функция за маркиране на бекъп като свален |
| 64 | mark_as_downloaded() { |
| 65 | local backup_name=$1 |
| 66 | echo "$backup_name" >> "$DOWNLOADED_FILE" |
| 67 | } |
| 68 | |
| 69 | # Функция за изтриване на стари локални бекъпи |
| 70 | cleanup_old_backups() { |
| 71 | if [[ "$KEEP_DAYS" -gt 0 ]]; then |
| 72 | log "Изтривам локални бекъпи по-стари от $KEEP_DAYS дни..." |
| 73 | find "$LOCAL_BACKUP_PATH" -name "vzdump-lxc-*.tar.zst" -type f -mtime +$KEEP_DAYS -delete |
| 74 | fi |
| 75 | } |
| 76 | |
| 77 | # Главен цикъл за всеки LXC контейнер |
| 78 | IFS=',' read -ra LXC_ARRAY <<< "$LXC_IDS" |
| 79 | for lxc_id in "${LXC_ARRAY[@]}"; do |
| 80 | lxc_id=$(echo "$lxc_id" | xargs) # Премахване на интервали |
| 81 | log "Проверявам за нови бекъпи на LXC $lxc_id..." |
| 82 | |
| 83 | # Получаване на списък с отдалечени бекъпи |
| 84 | remote_backups=$(get_remote_backups "$lxc_id") |
| 85 | |
| 86 | if [[ -z "$remote_backups" ]]; then |
| 87 | log "Няма намерени бекъпи за LXC $lxc_id" |
| 88 | continue |
| 89 | fi |
| 90 | |
| 91 | # Проверка за всеки бекъп |
| 92 | while IFS= read -r backup_file; do |
| 93 | [[ -z "$backup_file" ]] && continue |
| 94 | |
| 95 | if ! is_downloaded "$backup_file"; then |
| 96 | log "Намерен нов бекъп: $backup_file" |
| 97 | log "Започвам сваляне..." |
| 98 | |
| 99 | # Изпълнение на rsync |
| 100 | if rsync -avz --partial --progress -e "ssh $SSH_OPTIONS" \ |
| 101 | "${PROXMOX_USER}@${PROXMOX_HOST}:${REMOTE_BACKUP_PATH}/${backup_file}" \ |
| 102 | "${LOCAL_BACKUP_PATH}/"; then |
| 103 | |
| 104 | log "Успешно свален: $backup_file" |
| 105 | mark_as_downloaded "$backup_file" |
| 106 | else |
| 107 | log "ERROR: Грешка при сваляне на $backup_file" |
| 108 | fi |
| 109 | else |
| 110 | log "Бекъп $backup_file вече е свален, прескачам..." |
| 111 | fi |
| 112 | done <<< "$remote_backups" |
| 113 | done |
| 114 | |
| 115 | # Почистване на стари бекъпи |
| 116 | cleanup_old_backups |
| 117 | |
| 118 | log "Завършена проверка за нови бекъпи от $PROXMOX_HOST." |