#!/usr/bin/env bash set -euo pipefail REMOTE_HOST="${REMOTE_HOST:-player@shineup.me}" ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" TODAY="$(date +%F)" DEST_NAME="${DEST_NAME:-${TODAY}}" DEST_DIR="${ROOT_DIR}/archive/${DEST_NAME}" RSYNC_REMOTE_SUDO=(--rsync-path="sudo -n rsync") mkdir -p "${DEST_DIR}" remote_exists() { ssh "${REMOTE_HOST}" "test -e '$1'" } copy_optional_dir() { local remote_path="$1" local local_path="$2" if remote_exists "$remote_path"; then rsync -aH --delete "${RSYNC_REMOTE_SUDO[@]}" "${REMOTE_HOST}:${remote_path}/" "${local_path}/" else mkdir -p "${local_path}" echo "missing: ${remote_path}" > "${local_path}/MISSING.txt" fi } copy_optional_file() { local remote_path="$1" local local_path="$2" if remote_exists "$remote_path"; then rsync -aH "${RSYNC_REMOTE_SUDO[@]}" "${REMOTE_HOST}:${remote_path}" "${local_path}" else mkdir -p "$(dirname "${local_path}")" echo "missing: ${remote_path}" > "${local_path}.MISSING.txt" fi } echo "[1/4] Создаю структуру бэкапа: ${DEST_DIR}" mkdir -p "${DEST_DIR}/home-player" "${DEST_DIR}/etc-system" "${DEST_DIR}/var-lib/docker-images" echo "[2/4] Копирую основные данные /home/player" rsync -aH --delete \ "${RSYNC_REMOTE_SUDO[@]}" \ --exclude='SHiNE/shine-server/logs/' \ --exclude='SHiNE/**/.elaira_logs/' \ --exclude='**/*.log' \ "${REMOTE_HOST}:/home/player/SHiNE/" "${DEST_DIR}/home-player/SHiNE/" copy_optional_dir "/home/player/sites" "${DEST_DIR}/home-player/sites" copy_optional_dir "/home/player/gitea" "${DEST_DIR}/home-player/gitea" copy_optional_dir "/home/player/agent-memory" "${DEST_DIR}/home-player/agent-memory" echo "[3/4] Копирую системные конфиги" copy_optional_dir "/etc/caddy" "${DEST_DIR}/etc-system/caddy" copy_optional_dir "/var/lib/caddy" "${DEST_DIR}/var-lib/caddy" copy_optional_file "/etc/turnserver.conf" "${DEST_DIR}/etc-system/turnserver.conf" copy_optional_file "/etc/systemd/system/shine-server.service" "${DEST_DIR}/etc-system/shine-server.service" copy_optional_file "/etc/systemd/system/agent-memory.service" "${DEST_DIR}/etc-system/agent-memory.service" if ssh "${REMOTE_HOST}" 'command -v docker >/dev/null 2>&1 && sudo -n docker image inspect gitea/gitea:1.22.6 >/dev/null 2>&1'; then ssh "${REMOTE_HOST}" 'sudo -n docker image save gitea/gitea:1.22.6' > "${DEST_DIR}/var-lib/docker-images/gitea_gitea_1.22.6.tar" else echo "missing: docker image gitea/gitea:1.22.6" > "${DEST_DIR}/var-lib/docker-images/gitea_gitea_1.22.6.tar.MISSING.txt" fi echo "[4/4] Создаю манифест" { echo "backup_date=${TODAY}" echo "remote_host=${REMOTE_HOST}" echo "created_at_utc=$(date -u +%Y-%m-%dT%H:%M:%SZ)" echo echo "sizes:" du -sh "${DEST_DIR}/home-player/SHiNE" || true du -sh "${DEST_DIR}/home-player/sites" || true du -sh "${DEST_DIR}/home-player/gitea" || true du -sh "${DEST_DIR}/home-player/agent-memory" || true du -sh "${DEST_DIR}/etc-system" || true du -sh "${DEST_DIR}/var-lib/caddy" || true du -sh "${DEST_DIR}/var-lib/docker-images" || true echo echo "total:" du -sh "${DEST_DIR}" || true } > "${DEST_DIR}/MANIFEST.txt" echo "Готово: ${DEST_DIR}"