#!/usr/bin/env bash set -euo pipefail # Apply a versioned upgrade on production-like environments. # Usage: # scripts/ops/netgescon-upgrade-apply.sh --tag v1.3.0 --app-dir /var/www/netgescon TAG="" APP_DIR="/var/www/netgescon" BACKUP_DIR="/var/backups/netgescon" RUN_MIGRATIONS="yes" while [[ $# -gt 0 ]]; do case "$1" in --tag) TAG="$2" shift 2 ;; --app-dir) APP_DIR="$2" shift 2 ;; --backup-dir) BACKUP_DIR="$2" shift 2 ;; --skip-migrations) RUN_MIGRATIONS="no" shift 1 ;; *) echo "Unknown option: $1" exit 1 ;; esac done if [[ -z "$TAG" ]]; then echo "Usage: $0 --tag [--app-dir /var/www/netgescon] [--backup-dir /var/backups/netgescon] [--skip-migrations]" exit 1 fi STAMP="$(date +"%Y%m%d-%H%M%S")" mkdir -p "$BACKUP_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 # Load DB settings from .env for local mysqldump backup. 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 echo "Creating DB backup..." MYSQL_PWD="$DB_PASSWORD" mysqldump \ --host="$DB_HOST" \ --port="$DB_PORT" \ --user="$DB_USERNAME" \ --single-transaction \ --routines \ --triggers \ "$DB_DATABASE" > "$BACKUP_DIR/db-${STAMP}.sql" fi # Backup mutable app data. echo "Creating storage and env backup..." tar -czf "$BACKUP_DIR/app-${STAMP}.tar.gz" storage .env echo "Updating code to tag $TAG..." git fetch --tags origin git checkout "$TAG" composer install --no-dev --optimize-autoloader if [[ "$RUN_MIGRATIONS" == "yes" ]]; then php artisan migrate --force fi php artisan optimize:clear php artisan optimize popd >/dev/null echo "Upgrade completed successfully on tag $TAG" echo "Backups saved in $BACKUP_DIR"