- docker-services: 14 generic compose templates (portainer, npm, vaultwarden, gitea, jotty, nextcloud-aio, rustdesk, audiobookshelf, calibre-web, plex, erugo, jswiki, speedtest, watchtower) - install-scripts: bash scripts for Ubuntu server bootstrap, docker, portainer, npm, backup, restore - ansible: 4 playbooks (bootstrap, deploy-services, update-services, security-hardening) + roles skeleton - hermes-install: Hermes CLI setup on macOS - macos-setup: Brewfile + osx-defaults + fish-config - home-nas-tools: metadata index for NAS projects (no binaries) - docs: architecture, security, contributing - README, LICENSE (MIT), .gitignore
74 lines
2.0 KiB
Bash
74 lines
2.0 KiB
Bash
#!/usr/bin/env bash
|
|
#
|
|
# Záloha všech Docker dat na NAS
|
|
# - najde všechny kontejnery s volume mounty v /home/<user>/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"
|