#!/bin/bash # ============================================================================== # GiteaBackup — záloha Docker appdata kontejneru Gitea # ============================================================================== # # CO DĚLÁ: # Zastaví kontejner Gitea, zazálohuje celý jeho appdata adresář jako tar.gz, # pak kontejner znovu nastartuje. Záloha obsahuje vše — repozitáře, konfiguraci, # databázi (SQLite), SSH klíče, attachmenty. # # PROČ STOP/START: # Gitea průběžně zapisuje do SQLite a jiných souborů. Záloha za běhu by mohla # zachytit nekonzistentní stav. Stop zaručí čistý snapshot. # # SCHEDULE: # Spouštěn jako Unraid User Script "GiteaBackup" — daily (4:40 ráno). # # STRUKTURA ZÁLOHY: # /mnt/user/Backup/Critical/GiteaBackup/tower/gitea_YYYYMMDD_HHMMSS.tar.gz # # ROTACE: # Zálohy starší než KEEP_DAYS dní jsou automaticky mazány. # # RESTORE: # tar -xzf gitea_DATUM.tar.gz -C /mnt/user/appdata # (pak docker start Gitea) # ============================================================================== CONTAINER="Gitea" # název kontejneru v Unraid (velké G) APPDATA_DIR="/mnt/user/appdata/gitea" # zdrojový adresář dat Gitea BACKUP_DIR="/mnt/user/Backup/Critical/GiteaBackup/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}/gitea_${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 Gitea backup" # ------------------------------------------------------------------------------ # STOP KONTEJNERU # Musíme zastavit Gitea před zálohou — SQLite nelze bezpečně kopírovat za běhu. # Pokud stop selže (kontejner není spuštěn, Docker daemon problém), skript končí # s chybou místo aby pokračoval a vytvořil potenciálně poškozený archiv. # ------------------------------------------------------------------------------ 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: vytvoří gzip-komprimovaný archiv # -C /mnt/user/appdata: přepne do nadřazeného adresáře # gitea: zazálohuje pouze podadresář "gitea" (cesta v archivu bude relativní) # Výstupní kód tar se uchovává v BACKUP_STATUS — kontejner startujeme vždy, # i při chybě, aby Gitea nebyla zbytečně dlouho offline. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Creating backup: ${BACKUP_FILE}" tar -czf "${BACKUP_FILE}" -C /mnt/user/appdata gitea BACKUP_STATUS=$? # ------------------------------------------------------------------------------ # START KONTEJNERU — vždy, bez ohledu na výsledek zálohy # Tento blok je záměrně před kontrolou BACKUP_STATUS: i když tar selhal, # chceme Gitea co nejdříve zpět online. # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting container: ${CONTAINER}" docker start "${CONTAINER}" # ------------------------------------------------------------------------------ # KONTROLA VÝSLEDKU ZÁLOHY # Pokud tar selhal, smažeme případný neúplný archiv a skončíme s chybou. # ------------------------------------------------------------------------------ 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 hledá soubory dle vzoru jména a věku; -mtime +N = starší než N dní. # Mazání přes -delete je atomické (žádný mezikrok s xargs). # ------------------------------------------------------------------------------ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Removing backups older than ${KEEP_DAYS} days" find "${BACKUP_DIR}" -name "gitea_*.tar.gz" -mtime +${KEEP_DAYS} -delete echo "[$(date '+%Y-%m-%d %H:%M:%S')] Done"