#!/usr/bin/env bash # Deploy TGICS (frontend + API) to the VirtualEngage EC2 host. # # Usage: # ./deploy.sh # # Env overrides: # DEPLOY_KEY default ~/Documents/Keys/VirtualEngage.pem # DEPLOY_HOST default ubuntu@15.207.15.52 # DEPLOY_PATH default /var/www/tgics # DEPLOY_SITE default https://tgics.cttr.in # API_PORT default 3050 set -euo pipefail ROOT="$(cd "$(dirname "$0")" && pwd)" SSH_KEY="${DEPLOY_KEY:-$HOME/Documents/Keys/VirtualEngage.pem}" SSH_HOST="${DEPLOY_HOST:-ubuntu@15.207.15.52}" REMOTE_DIR="${DEPLOY_PATH:-/var/www/tgics}" SITE="${DEPLOY_SITE:-https://tgics.cttr.in}" API_PORT="${API_PORT:-3050}" PM2_NAME="tgics-api" 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" >&2 exit 1 fi chmod 400 "$SSH_KEY" 2>/dev/null || true echo "==> Building frontend (same-origin API via nginx)" ( cd "$ROOT/frontend" npm ci --cache "$ROOT/.npm-cache" # Empty base → browser calls /api on tgics.cttr.in (proxied to Hapi) VITE_API_BASE= npx vite build ) echo "==> Ensuring remote directories" ssh_cmd "sudo mkdir -p '$REMOTE_DIR/frontend/dist' '$REMOTE_DIR/backend' '$REMOTE_DIR/deploy' && sudo chown -R ubuntu:ubuntu '$REMOTE_DIR'" echo "==> Syncing frontend build" rsync_cmd \ "$ROOT/frontend/dist/" \ "$SSH_HOST:$REMOTE_DIR/frontend/dist/" echo "==> Syncing backend (keeps remote .env)" rsync_cmd \ --exclude node_modules \ --exclude .env \ "$ROOT/backend/" \ "$SSH_HOST:$REMOTE_DIR/backend/" echo "==> Syncing deploy assets" rsync_cmd \ "$ROOT/deploy/" \ "$SSH_HOST:$REMOTE_DIR/deploy/" echo "==> Installing deps, configuring nginx, restarting PM2" ssh_cmd \ "REMOTE_DIR=$(printf '%q' "$REMOTE_DIR") SITE=$(printf '%q' "$SITE") API_PORT=$(printf '%q' "$API_PORT") PM2_NAME=$(printf '%q' "$PM2_NAME") bash -s" <<'REMOTE' set -euo pipefail export PATH="/usr/bin:/usr/local/bin:$PATH" cd "$REMOTE_DIR/backend" if [[ ! -f .env ]]; then if [[ ! -f .env.example ]]; then echo "Missing $REMOTE_DIR/backend/.env on the server." >&2 exit 1 fi cp .env.example .env python3 - </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 "$PM2_NAME" NGINX_AVAIL="/etc/nginx/sites-available/tgics" NGINX_ENABLED="/etc/nginx/sites-enabled/tgics" if [[ -f "$REMOTE_DIR/deploy/nginx-tgics.conf" ]]; then sudo cp "$REMOTE_DIR/deploy/nginx-tgics.conf" "$NGINX_AVAIL" sudo ln -sfn "$NGINX_AVAIL" "$NGINX_ENABLED" sudo nginx -t sudo systemctl reload nginx echo "Nginx site installed for tgics.cttr.in" fi sleep 1 curl -fsS "http://127.0.0.1:${API_PORT}/health" echo REMOTE echo "==> Deployed to $SSH_HOST:$REMOTE_DIR" echo " Site: $SITE" echo " API: pm2 $PM2_NAME → 127.0.0.1:$API_PORT" echo " First time:" echo " 1) Point DNS tgics.cttr.in → 15.207.15.52" echo " 2) Edit $REMOTE_DIR/backend/.env (DB_*, RAPPORT_ACCESS_TOKEN, JWT_SECRET)" echo " 3) ssh … 'cd $REMOTE_DIR/backend && pm2 restart $PM2_NAME --update-env'" echo " 4) sudo certbot --nginx -d tgics.cttr.in"