616b20f285
- init-r2-repository.sh: inicializa repositorio Kopia en R2 - run-backup.sh: ejecuta backup de rutas definidas en backup-paths.txt - pre-backup-dumps.sh: vuelca bases de datos (Postgres, MariaDB) antes del backup - kopia-common.sh: funciones compartidas de autenticación y configuración - restore-smoke-test.sh: test de restauración para verificar integridad - backup-paths.txt / excludes.txt: rutas y exclusiones del backup - systemd/: unidades kopia-server, kopia-docker-backup (service + timer) - traefik-kopia.yml: exposición del servidor Kopia vía Traefik - env.example: plantilla de variables (credenciales R2, contraseña repo) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
70 lines
1.6 KiB
Bash
Executable File
70 lines
1.6 KiB
Bash
Executable File
#!/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"
|