Files
Administrator 916ab42bcc notebookvb
2026-05-23 09:38:53 +02:00

93 lines
4.5 KiB
Bash

#!/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"