#!/usr/bin/env bash set -euo pipefail # Incremental backup of data files to Google Drive using rclone. # Copies only new/changed files and never deletes remote files. # # Usage: # scripts/ops/netgescon-data-backup-incremental-gdrive.sh \ # --source /var/www/netgescon/storage/app/amministratori \ # --remote gdrive:NetGesconBackups/prod/data-incremental ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" ENV_FILE="${ENV_FILE:-$ROOT_DIR/docker/.env.multisite}" SOURCE_DIR="" REMOTE_PATH="" load_env_file() { local env_file="$1" local line key value while IFS= read -r line || [[ -n "$line" ]]; do line="${line%$'\r'}" [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue [[ "$line" != *=* ]] && continue key="${line%%=*}" value="${line#*=}" export "$key=$value" done < "$env_file" } while [[ $# -gt 0 ]]; do case "$1" in --source) SOURCE_DIR="$2" shift 2 ;; --remote) REMOTE_PATH="$2" shift 2 ;; --env-file) ENV_FILE="$2" shift 2 ;; *) echo "Unknown option: $1" echo "Usage: $0 [--source ] [--remote ] [--env-file ]" exit 1 ;; esac done if [[ -f "$ENV_FILE" ]]; then load_env_file "$ENV_FILE" fi SOURCE_DIR="${SOURCE_DIR:-${NETGESCON_ARCHIVE_GDRIVE_SOURCE:-${PROD_STORAGE_PATH:-/srv/netgescon/prod/storage}/app/amministratori}}" REMOTE_PATH="${REMOTE_PATH:-${NETGESCON_ARCHIVE_GDRIVE_REMOTE:-gdrive:NetGesconBackups/prod/documenti-amministratori}}" if ! command -v rclone >/dev/null 2>&1; then echo "Error: rclone not installed." exit 1 fi if [[ ! -d "$SOURCE_DIR" ]]; then echo "Error: source directory not found: $SOURCE_DIR" exit 1 fi rclone copy "$SOURCE_DIR" "$REMOTE_PATH" \ --update \ --checksum \ --create-empty-src-dirs \ --progress echo "Incremental data backup completed." echo "SOURCE=$SOURCE_DIR" echo "REMOTE=$REMOTE_PATH"