#!/bin/bash # ============================================================================== # MicrobinBackup — záloha Docker appdata kontejneru Microbin # ============================================================================== # # CO DĚLÁ: # Zastaví kontejner Microbin, zazálohuje celý jeho appdata adresář jako tar.gz, # pak kontejner znovu nastartuje. Záloha obsahuje vložené pasty, soubory, # konfiguraci a vnitřní databázi (Microbin ukládá data do JSON souborů na disk). # # PROČ STOP/START: # Microbin ukládá pasty jako soubory na disk — záloha za běhu by mohla # zachytit soubor právě zapisovaný. Stop zajistí atomický, konzistentní snapshot. # # SCHEDULE: # Spouštěn jako Unraid User Script "MicrobinBackup" — daily (4:40 ráno). # # STRUKTURA ZÁLOHY: # /mnt/user/Backup/Critical/MicrobinBackup/tower/microbin_YYYYMMDD_HHMMSS.tar.gz # # ROTACE: # Zálohy starší než KEEP_DAYS dní jsou automaticky mazány. # # RESTORE: # tar -xzf microbin_DATUM.tar.gz -C /mnt/user/appdata # (pak docker start microbin) # ============================================================================== CONTAINER="microbin" # název kontejneru v Unraid APPDATA_DIR="/mnt/user/appdata/microbin" # zdrojový adresář dat Microbin BACKUP_DIR="/mnt/user/Backup/Critical/MicrobinBackup/tower" # kam se zálohy ukládají DATE=$(date +%Y%m%d_%H%M%S) # timestamp pro unikátní název souboru BACKUP_FILE="${BACKUP_DIR}/microbin_${DATE}.tar.gz" # výsledný archiv KEEP_DAYS=7 # počet dní po které se zálohy uchovávají mkdir -p "${BACKUP_DIR}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting Microbin backup" # ------------------------------------------------------------------------------ # STOP KONTEJNERU # Microbin zapisuje pasty jako JSON soubory — musíme zajistit, že žádný soubor # není právě zapisován v momentě archivace. Stop = čistý filesystem snapshot. # Při selhání stopování skript skončí — nikdy nezálohujeme za běhu. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Stopping container: ${CONTAINER}" docker stop "${CONTAINER}" if [ $? -ne 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: Failed to stop container" exit 1 fi # ------------------------------------------------------------------------------ # VYTVOŘENÍ ARCHIVU # tar -czf: gzip-komprimovaný archiv # -C /mnt/user/appdata: pracovní adresář (cesta v archivu bude "microbin/...") # microbin: zazálohuje celý podadresář # Exit kód se uchovává — kontejner startujeme vždy, ať se archivace povedla nebo ne. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Creating backup: ${BACKUP_FILE}" tar -czf "${BACKUP_FILE}" -C /mnt/user/appdata microbin BACKUP_STATUS=$? # ------------------------------------------------------------------------------ # START KONTEJNERU — vždy, bez ohledu na výsledek zálohy # Záměrně před kontrolou BACKUP_STATUS: Microbin musí být co nejdříve dostupný. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting container: ${CONTAINER}" docker start "${CONTAINER}" # ------------------------------------------------------------------------------ # KONTROLA VÝSLEDKU ZÁLOHY # Neúplný archiv smažeme — nechceme ukládat poškozená data. # ------------------------------------------------------------------------------ if [ ${BACKUP_STATUS} -ne 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: tar failed with exit code ${BACKUP_STATUS}" rm -f "${BACKUP_FILE}" exit 1 fi BACKUP_SIZE=$(du -sh "${BACKUP_FILE}" | cut -f1) echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup complete: ${BACKUP_FILE} (${BACKUP_SIZE})" # ------------------------------------------------------------------------------ # ROTACE STARÝCH ZÁLOH # find prochází zálohovací adresář a maže archivy starší než KEEP_DAYS dní. # Vzor "microbin_*.tar.gz" zajistí, že smažeme jen soubory tohoto skriptu. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Removing backups older than ${KEEP_DAYS} days" find "${BACKUP_DIR}" -name "microbin_*.tar.gz" -mtime +${KEEP_DAYS} -delete echo "[$(date '+%Y-%m-%d %H:%M:%S')] Done"