#!/usr/bin/env bash # ============================================================ # Fester Backend Runner # ============================================================ # Starts the FastAPI backend with sensible defaults. # # Usage: # ./run.sh # default: host=0.0.0.0, port=8080 # ./run.sh --dev # dev mode with auto-reload # ./run.sh --mock-agent # also start a mock fester-agent on :8787 # ./run.sh --port 9000 # custom port # ./run.sh --help # ============================================================ set -euo pipefail # Resolve repo root REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$REPO_ROOT" # Defaults HOST="${FESTER_HOST:-0.0.0.0}" PORT="${FESTER_PORT:-8080}" DEV_MODE=0 START_MOCK_AGENT=0 # Parse args while [[ $# -gt 0 ]]; do case "$1" in --dev) DEV_MODE=1 shift ;; --mock-agent) START_MOCK_AGENT=1 shift ;; --port) PORT="$2" shift 2 ;; --host) HOST="$2" shift 2 ;; --help|-h) cat </dev/null; then echo "❌ FastAPI not installed. Run ./bootstrap.sh first." exit 1 fi # ------------------------------------------------------------ # Optionally start a mock fester-agent # ------------------------------------------------------------ MOCK_PID="" if [ "$START_MOCK_AGENT" = "1" ]; then echo "🤖 Starting mock fester-agent on :8787..." MOCK_SCRIPT="$REPO_ROOT/scripts/mock_agent.py" if [ ! -f "$MOCK_SCRIPT" ]; then # Fall back to the global scripts dir MOCK_SCRIPT="/home/z/my-project/scripts/mock_agent.py" fi if [ -f "$MOCK_SCRIPT" ]; then python3 "$MOCK_SCRIPT" 8787 & MOCK_PID=$! echo " ✓ Mock agent started (PID $MOCK_PID)" sleep 1 else echo " ⚠ mock_agent.py not found — skipping" fi fi # ------------------------------------------------------------ # Print startup banner # ------------------------------------------------------------ CONFIG_PATH="${FESTER_CONFIG:-config.yaml}" DB_PATH="${FESTER_DB_PATH:-$HOME/.fester/fester.db}" echo "" echo "🧠 Fester backend starting..." echo " Config: $CONFIG_PATH" echo " DB: $DB_PATH" echo " URL: http://$HOST:$PORT" echo " Mode: $([ "$DEV_MODE" = "1" ] && echo "development (auto-reload)" || echo "production")" echo " Drift: $([ "${FESTER_NO_DRIFT:-0}" = "1" ] && echo "disabled" || echo "enabled (fallback)")" echo " Autobuild: $([ "${FESTER_AUTOBUILD:-0}" = "1" ] && echo "enabled" || echo "disabled")" echo "" echo " Press Ctrl+C to stop" echo " UI: http://localhost:$PORT" echo " API docs: http://localhost:$PORT/docs" echo " Health: http://localhost:$PORT/api/health" echo "" # ------------------------------------------------------------ # Cleanup on exit # ------------------------------------------------------------ cleanup() { echo "" echo "🛑 Shutting down..." if [ -n "$MOCK_PID" ]; then kill "$MOCK_PID" 2>/dev/null || true echo " ✓ Mock agent stopped" fi echo " ✓ Backend stopped" } trap cleanup EXIT INT TERM # ------------------------------------------------------------ # Start uvicorn # ------------------------------------------------------------ if [ "$DEV_MODE" = "1" ]; then exec python3 -m uvicorn backend.main:app \ --host "$HOST" \ --port "$PORT" \ --reload \ --log-level info else exec python3 -m uvicorn backend.main:app \ --host "$HOST" \ --port "$PORT" \ --log-level info fi