#!/usr/bin/env bash # # Záloha všech Docker dat na NAS # - najde všechny kontejnery s volume mounty v /home//docker # - zastaví je (volitelně), zabalí data do tar.gz, pošle na NAS # - ponechá běžící kontejnery běžet (default) # # Použití: # sudo bash backup-all.sh # zálohuj vše (bez zastavení) # sudo bash backup-all.sh --stop # zastav před zálohou # sudo bash backup-all.sh --dry-run # pouze ukaž co by se dělalo # sudo bash backup-all.sh --only portainer # jen jednu službu # set -euo pipefail DEPLOY_USER="${DEPLOY_USER:-deploy}" DOCKER_HOME="/home/$DEPLOY_USER/docker" NAS_MOUNT="${NAS_MOUNT:-/Volumes/Backups}" BACKUP_ROOT="$NAS_MOUNT/Prace/server-backups/$(hostname)" TS="$(date +%Y%m%d-%H%M%S)" STOP=false DRY_RUN=false ONLY="" while [[ $# -gt 0 ]]; do case $1 in --stop) STOP=true; shift ;; --dry-run) DRY_RUN=true; shift ;; --only) ONLY="$2"; shift 2 ;; *) echo "Neznámý parametr: $1" >&2; exit 1 ;; esac done [[ $EUID -eq 0 ]] || { echo "Spusť jako root: sudo bash $0" >&2; exit 1; } [[ -d "$DOCKER_HOME" ]] || { echo "Adresář $DOCKER_HOME neexistuje" >&2; exit 1; } run() { if $DRY_RUN; then echo "[DRY-RUN] $*" else echo "▶ $*" "$@" fi } mkdir -p "$BACKUP_ROOT" for SERVICE_DIR in "$DOCKER_HOME"/*/; do SERVICE=$(basename "$SERVICE_DIR") [[ -n "$ONLY" && "$SERVICE" != "$ONLY" ]] && continue [[ -f "$SERVICE_DIR/docker-compose.yml" ]] || continue BACKUP_DIR="$BACKUP_ROOT/$SERVICE" BACKUP_FILE="$BACKUP_DIR/${SERVICE}-$TS.tar.zst" if $STOP; then run docker compose -f "$SERVICE_DIR/docker-compose.yml" stop fi if [[ -d "$SERVICE_DIR/data" ]]; then run mkdir -p "$BACKUP_DIR" run tar --zstd -cf "$BACKUP_FILE" -C "$SERVICE_DIR" data echo "✓ $SERVICE: $BACKUP_FILE" fi if $STOP; then run docker compose -f "$SERVICE_DIR/docker-compose.yml" start fi done echo echo "🎯 Hotovo. Zálohy v: $BACKUP_ROOT"