#!/usr/bin/env bash set -euo pipefail # Backup database + storage to Google Drive via rclone. # Prerequisites: # 1) rclone installed # 2) remote configured, e.g. 'gdrive' # Usage: # scripts/ops/netgescon-backup-gdrive.sh --app-dir /var/www/netgescon --remote gdrive:NetGesconBackups/prod APP_DIR="/var/www/netgescon" REMOTE_PATH="gdrive:NetGesconBackups/prod" TMP_DIR="/tmp/netgescon-backup" while [[ $# -gt 0 ]]; do case "$1" in --app-dir) APP_DIR="$2" shift 2 ;; --remote) REMOTE_PATH="$2" shift 2 ;; --tmp-dir) TMP_DIR="$2" shift 2 ;; *) echo "Unknown option: $1" exit 1 ;; esac done mkdir -p "$TMP_DIR" STAMP="$(date +"%Y%m%d-%H%M%S")" WORK_DIR="$TMP_DIR/$STAMP" mkdir -p "$WORK_DIR" pushd "$APP_DIR" >/dev/null if [[ ! -f artisan ]]; then echo "Error: '$APP_DIR' is not a Laravel app (artisan not found)." exit 1 fi if [[ -f .env ]]; then # shellcheck disable=SC1091 set -a source .env set +a fi DB_HOST="${DB_HOST:-127.0.0.1}" DB_PORT="${DB_PORT:-3306}" DB_DATABASE="${DB_DATABASE:-}" DB_USERNAME="${DB_USERNAME:-}" DB_PASSWORD="${DB_PASSWORD:-}" if [[ -n "$DB_DATABASE" && -n "$DB_USERNAME" ]]; then MYSQL_PWD="$DB_PASSWORD" mysqldump \ --host="$DB_HOST" \ --port="$DB_PORT" \ --user="$DB_USERNAME" \ --single-transaction \ --routines \ --triggers \ "$DB_DATABASE" > "$WORK_DIR/db.sql" fi tar -czf "$WORK_DIR/storage.tar.gz" storage cp .env "$WORK_DIR/.env.backup" popd >/dev/null ARCHIVE="$TMP_DIR/netgescon-backup-$STAMP.tar.gz" tar -czf "$ARCHIVE" -C "$WORK_DIR" . rclone copy "$ARCHIVE" "$REMOTE_PATH" --progress echo "Backup uploaded to $REMOTE_PATH" echo "Local archive: $ARCHIVE"