fester/run.sh

169 lines
5.2 KiB
Bash
Executable File

#!/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 <<EOF
Fester Backend Runner
Usage: ./run.sh [options]
Options:
--dev Enable auto-reload (for development)
--mock-agent Also start a mock fester-agent on port 8787
--port PORT Listen on PORT (default: 8080)
--host HOST Bind to HOST (default: 0.0.0.0)
--help Show this help
Environment variables:
FESTER_HOST Bind host (default: 0.0.0.0)
FESTER_PORT Listen port (default: 8080)
FESTER_CONFIG Path to config.yaml (default: config.yaml)
FESTER_DB_PATH SQLite database path (default: ~/.fester/fester.db)
FESTER_NO_DRIFT Set to "1" to disable synthetic drift
FESTER_AUTOBUILD Set to "1" to auto-trigger builds every 60s
EOF
exit 0
;;
*)
echo "Unknown option: $1"
echo "Run './run.sh --help' for usage"
exit 1
;;
esac
done
# ------------------------------------------------------------
# Activate venv if present
# ------------------------------------------------------------
if [ -f "$REPO_ROOT/.venv/bin/activate" ]; then
# shellcheck disable=SC1091
source "$REPO_ROOT/.venv/bin/activate"
elif [ -f "$REPO_ROOT/venv/bin/activate" ]; then
# shellcheck disable=SC1091
source "$REPO_ROOT/venv/bin/activate"
else
echo "⚠️ No virtualenv found. Run ./bootstrap.sh first, or:"
echo " pip install fastapi uvicorn websockets pydantic aiohttp minio prometheus-client PyYAML requests websocket-client"
echo ""
echo "Attempting to run with system Python anyway..."
fi
# Verify fastapi is importable
if ! python3 -c "import fastapi" 2>/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