#!/bin/bash set -e # Exit on any error # Configuration — source of truth for all paths DEPLOY_DIR="/opt/semblance" FRONTEND_DEST="/var/www/html/semblance" BACKEND_DIR="$DEPLOY_DIR/backend" PYTHON_CMD="python3.13" echo "======================================" echo "Starting deployment..." echo "======================================" # ── Pre-flight checks ───────────────────────────────────────────────────────── # Verify backend/.env exists (it is gitignored — must be provisioned manually) if [ ! -f "$BACKEND_DIR/.env" ]; then echo "" echo "ERROR: $BACKEND_DIR/.env not found." echo "This file is not tracked in git and must be created manually on the server." echo "Copy backend/.env.example and fill in real values:" echo " cp $BACKEND_DIR/.env.example $BACKEND_DIR/.env" echo " nano $BACKEND_DIR/.env" exit 1 fi # Verify required env vars are set in backend/.env for VAR in SECRET_KEY JWT_SECRET_KEY OPENAI_API_KEY GEMINI_API_KEY; do if ! grep -q "^${VAR}=.\+" "$BACKEND_DIR/.env" 2>/dev/null; then echo "" echo "ERROR: $VAR is not set in $BACKEND_DIR/.env" exit 1 fi done echo "✓ backend/.env present and required vars set" # ── Step 1: Pull latest changes ─────────────────────────────────────────────── echo "" echo "[1/7] Pulling latest changes from git..." cd "$DEPLOY_DIR" git pull # ── Step 2: Set up frontend environment ────────────────────────────────────── echo "" echo "[2/7] Setting up frontend environment..." cp .env.production .env # ── Step 3: Set up Python virtual environment ───────────────────────────────── echo "" echo "[3/7] Setting up Python virtual environment..." cd "$BACKEND_DIR" if [ ! -d "venv" ]; then echo "Creating new virtual environment with $PYTHON_CMD..." $PYTHON_CMD -m venv venv else echo "Virtual environment already exists." fi # ── Step 4: Install Python dependencies ────────────────────────────────────── echo "" echo "[4/7] Installing Python dependencies..." source venv/bin/activate pip install -r requirements.txt --quiet # ── Step 5: Build and deploy frontend ──────────────────────────────────────── echo "" echo "[5/7] Building and deploying frontend..." cd "$DEPLOY_DIR" npm install --silent npm run build echo "Cleaning deployment directory..." rm -rf "$FRONTEND_DEST"/* echo "Copying new build..." cp -r dist/* "$FRONTEND_DEST/" # ── Step 6: Ensure backend directories exist with correct ownership ─────────── echo "" echo "[6/7] Creating backend directories..." mkdir -p "$BACKEND_DIR/uploads" mkdir -p "$BACKEND_DIR/temp" sudo chown -R www-data:www-data "$BACKEND_DIR/uploads" "$BACKEND_DIR/temp" # ── Step 7: Restart backend service ────────────────────────────────────────── echo "" echo "[7/7] Restarting backend service..." sudo systemctl restart semblance.service echo "" echo "======================================" echo "Deployment complete!" echo "======================================" echo "" # Use || true so a non-active status doesn't cause set -e to abort with a confusing error systemctl status semblance.service --no-pager || true