最后活跃于 1 month ago

за Windows 11 с WSL2, малкия сървър

修订 454c1d5845435ee8fddc720d34a603569442265a

backup_sync_pve2.sh 原始文件
1#!/bin/bash
2
3# Конфигурационен файл за втори Proxmox
4CONFIG_FILE="$(dirname "$0")/backup_config_pve2.conf"
5LOG_FILE="$(dirname "$0")/backup_sync_pve2.log"
6DOWNLOADED_FILE="$(dirname "$0")/.downloaded_backups_pve2"
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 - PVE2
18PROXMOX_HOST=10.110.110.110
19PROXMOX_USER=root
20REMOTE_BACKUP_PATH=/mnt/backup/dump
21LOCAL_BACKUP_PATH=/mnt/d/backup_proxmox_pve2
22
23# LXC контейнери за синхронизиране (разделени със запетая)
24# Пример: LXC_IDS=101,102,103
25LXC_IDS=
26
27# SSH опции
28SSH_OPTIONS="-o ConnectTimeout=30 -o ServerAliveInterval=60"
29
30# Максимален брой дни за задържане на локални бекъпи (0 = безкрайно)
31KEEP_DAYS=30
32EOF
33 log "Създаден е примерен конфигурационен файл: $CONFIG_FILE"
34 log "Моля, редактирайте го според вашите нужди и стартирайте отново скрипта."
35 exit 1
36fi
37
38# Зареждане на конфигурацията
39source "$CONFIG_FILE"
40
41# Създаване на локална директория ако не съществува
42mkdir -p "$LOCAL_BACKUP_PATH"
43
44# Създаване на файл за проследяване на свалените бекъпи
45touch "$DOWNLOADED_FILE"
46
47log "Започвам проверка за нови бекъпи от $PROXMOX_HOST..."
48log "Наблюдавани LXC контейнери: $LXC_IDS"
49
50# Функция за получаване на списък с отдалечени бекъпи
51get_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# Функция за проверка дали бекъп е вече свален
58is_downloaded() {
59 local backup_name=$1
60 grep -Fxq "$backup_name" "$DOWNLOADED_FILE"
61}
62
63# Функция за маркиране на бекъп като свален
64mark_as_downloaded() {
65 local backup_name=$1
66 echo "$backup_name" >> "$DOWNLOADED_FILE"
67}
68
69# Функция за изтриване на стари локални бекъпи
70cleanup_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 контейнер
78IFS=',' read -ra LXC_ARRAY <<< "$LXC_IDS"
79for 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"
113done
114
115# Почистване на стари бекъпи
116cleanup_old_backups
117
118log "Завършена проверка за нови бекъпи от $PROXMOX_HOST."