VirtualPR/deploy.sh

69 lines
1.7 KiB
Bash
Executable File

#!/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" <<EOF
set -euo pipefail
export PATH="/usr/bin:/usr/local/bin:\$PATH"
cd "$REMOTE_DIR/backend"
if [[ ! -f .env ]]; then
echo "Missing $REMOTE_DIR/backend/.env on the server. Copy it there before the API will start."
exit 1
fi
if ! command -v pm2 >/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"