56 lines
1.3 KiB
Bash
Executable File
56 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "${ROOT_DIR}"
|
|
|
|
if [ ! -d "web/node_modules" ]; then
|
|
echo "[web] Missing dependencies. Run: npm --prefix web install"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -f ".env" ]; then
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source ".env"
|
|
set +a
|
|
fi
|
|
|
|
if [ -x "${ROOT_DIR}/.venv/bin/python" ] && \
|
|
"${ROOT_DIR}/.venv/bin/python" -c "import uvicorn" >/dev/null 2>&1; then
|
|
PYTHON_BIN="${ROOT_DIR}/.venv/bin/python"
|
|
elif python3 -c "import uvicorn" >/dev/null 2>&1; then
|
|
PYTHON_BIN="python3"
|
|
else
|
|
echo "[api] Missing dependency: uvicorn."
|
|
echo " Install with: python3 -m venv .venv && source .venv/bin/activate && python -m pip install -r api/requirements.txt"
|
|
exit 1
|
|
fi
|
|
|
|
cleanup() {
|
|
trap - INT TERM EXIT
|
|
|
|
if [ -n "${WEB_PID:-}" ] && kill -0 "${WEB_PID}" 2>/dev/null; then
|
|
kill "${WEB_PID}" 2>/dev/null || true
|
|
fi
|
|
|
|
if [ -n "${API_PID:-}" ] && kill -0 "${API_PID}" 2>/dev/null; then
|
|
kill "${API_PID}" 2>/dev/null || true
|
|
fi
|
|
}
|
|
|
|
trap cleanup INT TERM EXIT
|
|
|
|
echo "[api] Starting FastAPI at ${API_HOST:-0.0.0.0}:${API_PORT:-8000}"
|
|
"${PYTHON_BIN}" -m uvicorn api.app.main:app \
|
|
--reload \
|
|
--host "${API_HOST:-0.0.0.0}" \
|
|
--port "${API_PORT:-8000}" &
|
|
API_PID=$!
|
|
|
|
echo "[web] Starting Next.js on :3000"
|
|
npm --workspace web run dev &
|
|
WEB_PID=$!
|
|
|
|
wait -n "${API_PID}" "${WEB_PID}"
|