netgescon-day0/scripts/ops/netgescon-data-backup-incremental-gdrive.sh

80 lines
1.9 KiB
Bash
Executable File

#!/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 <dir>] [--remote <rclone-remote:path>] [--env-file <path>]"
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"