95 lines
4.5 KiB
Bash
95 lines
4.5 KiB
Bash
#!/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"
|