最後活躍 1 month ago

за Windows 11 с WSL2

修訂 cfec3e6c90b82151ac9e848330d21cc8b6e11c7a

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