169 lines
5.2 KiB
Bash
Executable File
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
|