#!/bin/bash # ============================================================================== # KanboardBackup — záloha Docker appdata kontejneru Kanboard # ============================================================================== # # CO DĚLÁ: # Zastaví kontejner Kanboard, zazálohuje celý jeho appdata adresář jako tar.gz, # pak kontejner znovu nastartuje. Záloha obsahuje konfiguraci, pluginy, # uploadované soubory a lokální data Kanboard. # # POZNÁMKA K DATABÁZI: # Kanboard používá MySQL — ta je zálohována samostatně skriptem # 3_MYSQL_BACKUP_WITH_GZIP (databáze "kanboard"). Tento skript zálohuje # pouze appdata (souborová část aplikace), nikoli databázi. # # PROČ STOP/START: # Kanboard může zapisovat do souborů (session, cache, uploady) za běhu. # Stop zaručí konzistentní snapshot bez rizika poškozených souborů v archivu. # # SCHEDULE: # Spouštěn jako Unraid User Script "KanboardBackup" — daily (4:40 ráno). # # STRUKTURA ZÁLOHY: # /mnt/user/Backup/Critical/KanboardBackup/tower/kanboard_YYYYMMDD_HHMMSS.tar.gz # # ROTACE: # Zálohy starší než KEEP_DAYS dní jsou automaticky mazány. # # RESTORE: # tar -xzf kanboard_DATUM.tar.gz -C /mnt/user/appdata # (pak docker start kanboard) # Databázi obnovit zvlášť z MySQL zálohy. # ============================================================================== CONTAINER="kanboard" # název kontejneru v Unraid APPDATA_DIR="/mnt/user/appdata/kanboard" # zdrojový adresář dat Kanboard BACKUP_DIR="/mnt/user/Backup/Critical/KanboardBackup/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}/kanboard_${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 Kanboard backup" # ------------------------------------------------------------------------------ # STOP KONTEJNERU # Zastavíme Kanboard před zálohou — souborový systém appdata (uploady, cache, # sessions) musí být v klidovém stavu pro konzistentní archiv. # Pokud stop selže, skript okamžitě skončí — nechceme zálohovat 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ář pro tar (cesta v archivu bude relativní) # kanboard: zazálohuje podadresář "kanboard" # BACKUP_STATUS se kontroluje až po startu kontejneru — Kanboard nesmí zůstat # offline kvůli chybě archivace. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Creating backup: ${BACKUP_FILE}" tar -czf "${BACKUP_FILE}" -C /mnt/user/appdata kanboard BACKUP_STATUS=$? # ------------------------------------------------------------------------------ # START KONTEJNERU — vždy, bez ohledu na výsledek zálohy # Záměrně před kontrolou BACKUP_STATUS: downtime Kanboard musí být minimální. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting container: ${CONTAINER}" docker start "${CONTAINER}" # ------------------------------------------------------------------------------ # KONTROLA VÝSLEDKU ZÁLOHY # Neúplný archiv (tar selhal) smažeme — je k ničemu a zabírá místo. # ------------------------------------------------------------------------------ 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 # -mtime +N: soubory starší než N dní (počítáno dle mtime = last modification) # -delete: atomické mazání bez mezikroku # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Removing backups older than ${KEEP_DAYS} days" find "${BACKUP_DIR}" -name "kanboard_*.tar.gz" -mtime +${KEEP_DAYS} -delete echo "[$(date '+%Y-%m-%d %H:%M:%S')] Done"