urocibg revidoval tento gist 10 months ago. Přejít na revizi
Žádné změny
urocibg revidoval tento gist 10 months ago. Přejít na revizi
Žádné změny
urocibg revidoval tento gist 10 months ago. Přejít na revizi
1 file changed, 117 insertions
backup_sync_pve1.sh(vytvořil soubor)
| @@ -0,0 +1,117 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | # Конфигурационен файл за първи Proxmox | |
| 4 | + | CONFIG_FILE="$(dirname "$0")/backup_config_pve1.conf" | |
| 5 | + | LOG_FILE="$(dirname "$0")/backup_sync_pve1.log" | |
| 6 | + | DOWNLOADED_FILE="$(dirname "$0")/.downloaded_backups_pve1" | |
| 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 - PVE1 | |
| 18 | + | PROXMOX_HOST=10.110.110.68 | |
| 19 | + | PROXMOX_USER=root | |
| 20 | + | REMOTE_BACKUP_PATH=/backup512/dump | |
| 21 | + | LOCAL_BACKUP_PATH=/mnt/d/backup_proxmox_pve1 | |
| 22 | + | ||
| 23 | + | # LXC контейнери за синхронизиране (разделени със запетая) | |
| 24 | + | LXC_IDS=111,114 | |
| 25 | + | ||
| 26 | + | # SSH опции | |
| 27 | + | SSH_OPTIONS="-o ConnectTimeout=30 -o ServerAliveInterval=60" | |
| 28 | + | ||
| 29 | + | # Максимален брой дни за задържане на локални бекъпи (0 = безкрайно) | |
| 30 | + | KEEP_DAYS=30 | |
| 31 | + | EOF | |
| 32 | + | log "Създаден е примерен конфигурационен файл: $CONFIG_FILE" | |
| 33 | + | log "Моля, редактирайте го според вашите нужди и стартирайте отново скрипта." | |
| 34 | + | exit 1 | |
| 35 | + | fi | |
| 36 | + | ||
| 37 | + | # Зареждане на конфигурацията | |
| 38 | + | source "$CONFIG_FILE" | |
| 39 | + | ||
| 40 | + | # Създаване на локална директория ако не съществува | |
| 41 | + | mkdir -p "$LOCAL_BACKUP_PATH" | |
| 42 | + | ||
| 43 | + | # Създаване на файл за проследяване на свалените бекъпи | |
| 44 | + | touch "$DOWNLOADED_FILE" | |
| 45 | + | ||
| 46 | + | log "Започвам проверка за нови бекъпи от $PROXMOX_HOST..." | |
| 47 | + | log "Наблюдавани LXC контейнери: $LXC_IDS" | |
| 48 | + | ||
| 49 | + | # Функция за получаване на списък с отдалечени бекъпи | |
| 50 | + | get_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 | + | # Функция за проверка дали бекъп е вече свален | |
| 57 | + | is_downloaded() { | |
| 58 | + | local backup_name=$1 | |
| 59 | + | grep -Fxq "$backup_name" "$DOWNLOADED_FILE" | |
| 60 | + | } | |
| 61 | + | ||
| 62 | + | # Функция за маркиране на бекъп като свален | |
| 63 | + | mark_as_downloaded() { | |
| 64 | + | local backup_name=$1 | |
| 65 | + | echo "$backup_name" >> "$DOWNLOADED_FILE" | |
| 66 | + | } | |
| 67 | + | ||
| 68 | + | # Функция за изтриване на стари локални бекъпи | |
| 69 | + | cleanup_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 контейнер | |
| 77 | + | IFS=',' read -ra LXC_ARRAY <<< "$LXC_IDS" | |
| 78 | + | for 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" | |
| 112 | + | done | |
| 113 | + | ||
| 114 | + | # Почистване на стари бекъпи | |
| 115 | + | cleanup_old_backups | |
| 116 | + | ||
| 117 | + | log "Завършена проверка за нови бекъпи от $PROXMOX_HOST." | |
Novější
Starší