#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" # shellcheck disable=SC1091 source "$SCRIPT_DIR/kopia-common.sh" require_cmd kopia require_cmd docker require_real_env KOPIA_PASSWORD ensure_runtime_dirs "$SCRIPT_DIR/pre-backup-dumps.sh" if ! kopia_cmd repository status >/dev/null 2>&1; then echo "Kopia repository is not connected. Run $SCRIPT_DIR/init-r2-repository.sh first." >&2 exit 1 fi mapfile -t SNAPSHOT_PATHS < <( while IFS= read -r path; do [[ -z "$path" || "$path" =~ ^[[:space:]]*# ]] && continue if [[ -e "$path" ]]; then printf '%s\n' "$path" else log "Skip missing path: $path" >&2 fi done < "$BACKUP_PATHS_FILE" ) if [[ "${#SNAPSHOT_PATHS[@]}" -eq 0 ]]; then echo "No backup paths found from $BACKUP_PATHS_FILE" >&2 exit 1 fi mapfile -t IGNORE_PATTERNS < <( while IFS= read -r pattern; do [[ -z "$pattern" || "$pattern" =~ ^[[:space:]]*# ]] && continue printf '%s\n' "$pattern" done < "$KOPIA_EXCLUDES_FILE" ) POLICY_ARGS=( --global \ --keep-latest=7 \ --keep-daily=7 \ --keep-weekly=4 \ --keep-monthly=6 \ --compression=zstd \ --clear-ignore ) for pattern in "${IGNORE_PATTERNS[@]}"; do POLICY_ARGS+=(--add-ignore="$pattern") done log "Applying retention, compression and ignore policy" kopia_cmd policy set "${POLICY_ARGS[@]}" log "Starting Kopia snapshot with ${#SNAPSHOT_PATHS[@]} paths" kopia_cmd snapshot create \ --description="docker-host restore backup" \ --tags="source:docker-host,type:restore" \ "${SNAPSHOT_PATHS[@]}" log "Validating R2 provider" kopia_cmd repository validate-provider log "Backup completed"