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

84 lines
1.7 KiB
Bash
Executable File

#!/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"