urocibg bu gisti düzenledi 1 month ago. Düzenlemeye git
1 file changed, 6 insertions, 5 deletions
backup_sync_pve2.sh
| @@ -97,15 +97,16 @@ for lxc_id in "${LXC_ARRAY[@]}"; do | |||
| 97 | 97 | log "Започвам сваляне..." | |
| 98 | 98 | ||
| 99 | 99 | # Изпълнение на rsync | |
| 100 | - | if rsync -avz --partial --progress \ | |
| 101 | - | -e "ssh $SSH_OPTIONS" \ | |
| 100 | + | rsync -avz --partial --progress \ | |
| 101 | + | -e "ssh ${SSH_OPTIONS}" \ | |
| 102 | 102 | "${PROXMOX_USER}@${PROXMOX_HOST}:${REMOTE_BACKUP_PATH}/${backup_file}" \ | |
| 103 | - | "${LOCAL_BACKUP_PATH}/"; then | |
| 104 | - | ||
| 103 | + | "${LOCAL_BACKUP_PATH}/" 2>&1 | tee -a "$LOG_FILE" | |
| 104 | + | ||
| 105 | + | if [ ${PIPESTATUS[0]} -eq 0 ]; then | |
| 105 | 106 | log "Успешно свален: $backup_file" | |
| 106 | 107 | mark_as_downloaded "$backup_file" | |
| 107 | 108 | else | |
| 108 | - | log "ERROR: Грешка при сваляне на $backup_file" | |
| 109 | + | log "ERROR: Грешка при сваляне на $backup_file (rsync exit code: ${PIPESTATUS[0]})" | |
| 109 | 110 | fi | |
| 110 | 111 | else | |
| 111 | 112 | log "Бекъп $backup_file вече е свален, прескачам..." | |
urocibg bu gisti düzenledi 1 month ago. Düzenlemeye git
1 file changed, 2 insertions, 1 deletion
backup_sync_pve2.sh
| @@ -97,7 +97,8 @@ for lxc_id in "${LXC_ARRAY[@]}"; do | |||
| 97 | 97 | log "Започвам сваляне..." | |
| 98 | 98 | ||
| 99 | 99 | # Изпълнение на rsync | |
| 100 | - | if rsync -avz --partial --progress -e "ssh $SSH_OPTIONS" \ | |
| 100 | + | if rsync -avz --partial --progress \ | |
| 101 | + | -e "ssh $SSH_OPTIONS" \ | |
| 101 | 102 | "${PROXMOX_USER}@${PROXMOX_HOST}:${REMOTE_BACKUP_PATH}/${backup_file}" \ | |
| 102 | 103 | "${LOCAL_BACKUP_PATH}/"; then | |
| 103 | 104 | ||
urocibg bu gisti düzenledi 1 month ago. Düzenlemeye git
1 file changed, 118 insertions
backup_sync_pve2.sh(dosya oluşturuldu)
| @@ -0,0 +1,118 @@ | |||
| 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." | |