84 lines
1.7 KiB
Bash
Executable File
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"
|