#!/usr/bin/env bash set -euo pipefail ROOT="$(cd "$(dirname "$0")" && pwd)" SSH_KEY="${SSH_KEY:-$HOME/Documents/Keys/VirtualEngage.pem}" SSH_HOST="${SSH_HOST:-ubuntu@15.207.15.52}" REMOTE_DIR="${REMOTE_DIR:-/var/www/virtualpr}" SSH_OPTS=(-i "$SSH_KEY" -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new) ssh_cmd() { ssh "${SSH_OPTS[@]}" "$SSH_HOST" "$@" } rsync_cmd() { rsync -az --delete --progress \ -e "ssh ${SSH_OPTS[*]}" \ "$@" } if [[ ! -f "$SSH_KEY" ]]; then echo "SSH key not found: $SSH_KEY" exit 1 fi chmod 400 "$SSH_KEY" 2>/dev/null || true echo "==> Building frontend" ( cd "$ROOT/frontend" npm ci --cache "$ROOT/.npm-cache" npx vite build ) echo "==> Ensuring remote directories" ssh_cmd "sudo mkdir -p '$REMOTE_DIR/frontend' '$REMOTE_DIR/backend' && sudo chown -R ubuntu:ubuntu '$REMOTE_DIR'" echo "==> Syncing frontend build" rsync_cmd \ --exclude node_modules \ "$ROOT/frontend/dist/" \ "$SSH_HOST:$REMOTE_DIR/frontend/dist/" echo "==> Syncing backend (keeps remote .env and uploads)" rsync_cmd \ --exclude node_modules \ --exclude .env \ --exclude uploads \ "$ROOT/backend/" \ "$SSH_HOST:$REMOTE_DIR/backend/" echo "==> Installing backend production deps and restarting PM2" ssh_cmd "bash -s" </dev/null 2>&1; then sudo npm install -g pm2 fi npm ci --omit=dev pm2 startOrReload ecosystem.config.cjs --update-env pm2 save pm2 status virtualpr EOF echo "==> Deployed to $SSH_HOST:$REMOTE_DIR"