Files
Project_Velocity/backend/scripts/restore_and_seed_demo.sh
sayan eeb684b46c
All checks were successful
Production Readiness / backend-contracts (push) Successful in 1m47s
Production Readiness / webos-typecheck (push) Successful in 1m50s
Production Readiness / ipad-parse (push) Successful in 1m34s
feat: Ipad app production readiness, Colony orchestration, Social posting (#44)
#38 Ipad app production readiness, Colony orchestration, Social posting

Co-authored-by: Sayan Datta <sayan@Sayans-MacBook-Air.local>
Reviewed-on: #44
2026-05-03 18:30:38 +05:30

153 lines
5.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# Velocity Backend — Recovery + Investor Demo Seed
# =============================================================================
# Run this on the production server (via SSH) to:
# 1. Diagnose why the FastAPI backend is down (502 gateway)
# 2. Restart the uvicorn service on port 8001
# 3. Verify the /health endpoint responds through nginx
# 4. Run the iPad investor-demo seed script to populate 50 realistic
# clients, 11 properties with Unsplash media, calendar events, and tasks
#
# Usage:
# ssh ubuntu@<SERVER_IP>
# cd /path/to/Project_Velocity
# bash backend/scripts/restore_and_seed_demo.sh
#
# Prerequisites on server:
# - Python 3.11+
# - backend/.env with DATABASE_URL or VELOCITY_DB_* vars set
# - asyncpg installed (pip install -r backend/requirements.txt)
# =============================================================================
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
BACKEND_DIR="$REPO_ROOT/backend"
VENV_PATH="${VENV_PATH:-$REPO_ROOT/.venv}"
UVICORN_PORT="${UVICORN_PORT:-8001}"
UVICORN_WORKERS="${UVICORN_WORKERS:-2}"
OPERATOR_EMAIL="${VELOCITY_DEMO_OPERATOR_EMAIL:-sayan@desineuron.in}"
echo ""
echo "============================================================"
echo " Velocity Backend Recovery + Demo Seed"
echo " Server: $(hostname)"
echo " Repo: $REPO_ROOT"
echo " Port: $UVICORN_PORT"
echo "============================================================"
echo ""
# ── Step 1: Diagnose ─────────────────────────────────────────────────────────
echo "▶ Step 1/4 — Diagnosing current process state"
PIDS=$(lsof -ti tcp:"$UVICORN_PORT" 2>/dev/null || true)
if [ -n "$PIDS" ]; then
echo " ✓ Found process(es) on port $UVICORN_PORT: $PIDS"
echo " Killing stale/hung processes..."
kill -9 $PIDS 2>/dev/null || true
sleep 1
else
echo " ✗ No process on port $UVICORN_PORT — backend is down. Will restart."
fi
# Check systemd service if present
if systemctl list-units --full --all | grep -q "velocity-backend"; then
echo " Found systemd unit: velocity-backend"
sudo systemctl stop velocity-backend 2>/dev/null || true
fi
# ── Step 2: Activate venv and verify deps ────────────────────────────────────
echo ""
echo "▶ Step 2/4 — Activating virtualenv and verifying dependencies"
if [ -f "$VENV_PATH/bin/activate" ]; then
source "$VENV_PATH/bin/activate"
echo " ✓ Activated venv: $VENV_PATH"
else
echo " ! No venv at $VENV_PATH — using system Python"
fi
PYTHON="${PYTHON:-python3}"
# Quick dep check
$PYTHON -c "import fastapi, uvicorn, asyncpg, dotenv" 2>/dev/null || {
echo " Installing backend requirements..."
$PYTHON -m pip install --quiet -r "$BACKEND_DIR/requirements.txt"
}
echo " ✓ Dependencies OK"
# ── Step 3: Start uvicorn ─────────────────────────────────────────────────────
echo ""
echo "▶ Step 3/4 — Starting uvicorn on port $UVICORN_PORT"
cd "$REPO_ROOT"
LOG_FILE="/tmp/velocity_backend_$(date +%Y%m%d_%H%M%S).log"
nohup $PYTHON -m uvicorn backend.main:app \
--host 127.0.0.1 \
--port "$UVICORN_PORT" \
--workers "$UVICORN_WORKERS" \
--log-level info \
--timeout-keep-alive 75 \
> "$LOG_FILE" 2>&1 &
UVICORN_PID=$!
echo " uvicorn PID: $UVICORN_PID Log: $LOG_FILE"
# Wait for it to bind
echo " Waiting for backend to accept connections..."
MAX_WAIT=30
WAITED=0
until curl -sf "http://127.0.0.1:$UVICORN_PORT/health" > /dev/null 2>&1; do
sleep 1
WAITED=$((WAITED + 1))
if [ $WAITED -ge $MAX_WAIT ]; then
echo ""
echo " ✗ Backend did not start within ${MAX_WAIT}s. Last log output:"
tail -40 "$LOG_FILE"
exit 1
fi
echo -n "."
done
echo ""
HEALTH=$(curl -sf "http://127.0.0.1:$UVICORN_PORT/health")
echo " ✓ Backend healthy: $HEALTH"
# Verify nginx can reach it
echo ""
echo " Checking nginx → backend proxy..."
if curl -sf "https://api.desineuron.in/health" > /dev/null 2>&1; then
echo " ✓ api.desineuron.in/health is UP — 502 is resolved."
else
echo " ! api.desineuron.in/health still failing."
echo " Check: sudo nginx -t && sudo systemctl reload nginx"
echo " Continuing to seed anyway (backend is healthy on localhost)."
fi
# ── Step 4: Seed investor demo data ──────────────────────────────────────────
echo ""
echo "▶ Step 4/4 — Running iPad investor demo seed"
echo " Operator: $OPERATOR_EMAIL"
echo " Target: 50 clients, 11 properties, media, tasks, calendar events"
echo ""
cd "$REPO_ROOT"
$PYTHON backend/scripts/seed_ipad_investor_demo.py \
--operator-email "$OPERATOR_EMAIL" \
${VELOCITY_DEMO_TENANT_ID:+--tenant-id "$VELOCITY_DEMO_TENANT_ID"}
echo ""
echo "============================================================"
echo " ✅ Recovery complete."
echo ""
echo " Backend: http://127.0.0.1:$UVICORN_PORT (PID $UVICORN_PID)"
echo " Public: https://api.desineuron.in"
echo " Log: $LOG_FILE"
echo ""
echo " The iPad dashboard will show live data on next refresh."
echo " Tap 'Updated now' in the header to trigger an immediate sync."
echo "============================================================"
echo ""