Add cross-platform setup and start scripts
Use shell-based setup and startup flows that work more reliably across Windows bash environments and Linux. This keeps environment bootstrap and service startup aligned while avoiding fragile process handling. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
204
setup.sh
Normal file
204
setup.sh
Normal file
@@ -0,0 +1,204 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
BACKEND_DIR="$SCRIPT_DIR/backend"
|
||||
FRONTEND_DIR="$SCRIPT_DIR/frontend"
|
||||
ROOT_ENV="$SCRIPT_DIR/.env"
|
||||
BACKEND_ENV="$BACKEND_DIR/.env"
|
||||
BACKEND_ENV_EXAMPLE="$BACKEND_DIR/.env.example"
|
||||
FRONTEND_ENV_LOCAL="$FRONTEND_DIR/.env.local"
|
||||
HOST_OS="$(uname -s)"
|
||||
USE_WINDOWS_TOOLS=false
|
||||
|
||||
if command -v cmd.exe >/dev/null 2>&1 || command -v powershell.exe >/dev/null 2>&1; then
|
||||
USE_WINDOWS_TOOLS=true
|
||||
fi
|
||||
|
||||
if [[ "$USE_WINDOWS_TOOLS" == true ]]; then
|
||||
BACKEND_PYTHON="$BACKEND_DIR/.venv/Scripts/python.exe"
|
||||
FRONTEND_NPM="npm.cmd"
|
||||
else
|
||||
BACKEND_PYTHON="$BACKEND_DIR/.venv/bin/python"
|
||||
FRONTEND_NPM="npm"
|
||||
fi
|
||||
|
||||
print_header() {
|
||||
echo "=========================================="
|
||||
echo " Jarvis - Setup"
|
||||
echo "=========================================="
|
||||
echo
|
||||
}
|
||||
|
||||
require_command() {
|
||||
local command_name="$1"
|
||||
local hint="$2"
|
||||
if ! command -v "$command_name" >/dev/null 2>&1; then
|
||||
echo "[ERROR] $command_name was not found."
|
||||
echo "[ERROR] $hint"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_backend_env() {
|
||||
if [[ -f "$BACKEND_ENV" ]]; then
|
||||
echo "[OK] Backend env file exists: $BACKEND_ENV"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "$ROOT_ENV" ]]; then
|
||||
cp "$ROOT_ENV" "$BACKEND_ENV"
|
||||
echo "[INFO] Created backend/.env from root .env"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "$BACKEND_ENV_EXAMPLE" ]]; then
|
||||
cp "$BACKEND_ENV_EXAMPLE" "$BACKEND_ENV"
|
||||
echo "[INFO] Created backend/.env from backend/.env.example"
|
||||
echo "[INFO] Edit $BACKEND_ENV before running start.sh if needed."
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "[ERROR] Could not create backend/.env"
|
||||
exit 1
|
||||
}
|
||||
|
||||
sync_frontend_env() {
|
||||
local backend_host
|
||||
local backend_port
|
||||
|
||||
backend_host="$(grep '^HOST=' "$BACKEND_ENV" | cut -d'=' -f2- | tr -d '\r' || true)"
|
||||
backend_port="$(grep '^PORT=' "$BACKEND_ENV" | cut -d'=' -f2- | tr -d '\r' || true)"
|
||||
|
||||
[[ -z "$backend_host" ]] && backend_host="127.0.0.1"
|
||||
[[ -z "$backend_port" ]] && backend_port="3337"
|
||||
|
||||
printf 'VITE_API_URL=http://%s:%s\n' "$backend_host" "$backend_port" > "$FRONTEND_ENV_LOCAL"
|
||||
echo "[OK] Synced frontend/.env.local -> http://$backend_host:$backend_port"
|
||||
}
|
||||
|
||||
print_header
|
||||
|
||||
require_command npm "Install Node.js and npm first."
|
||||
|
||||
if [[ "$USE_WINDOWS_TOOLS" == true ]]; then
|
||||
if command -v py.exe >/dev/null 2>&1; then
|
||||
PYTHON_BOOTSTRAP=("py.exe" "-3")
|
||||
elif command -v python.exe >/dev/null 2>&1; then
|
||||
PYTHON_BOOTSTRAP=("python.exe")
|
||||
elif command -v python >/dev/null 2>&1; then
|
||||
PYTHON_BOOTSTRAP=("python")
|
||||
else
|
||||
echo "[ERROR] Python was not found."
|
||||
echo "[ERROR] Install Python 3.12+ for Windows first."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if command -v python3 >/dev/null 2>&1; then
|
||||
PYTHON_BOOTSTRAP=("python3")
|
||||
elif command -v python >/dev/null 2>&1; then
|
||||
PYTHON_BOOTSTRAP=("python")
|
||||
else
|
||||
echo "[ERROR] python3/python was not found."
|
||||
echo "[ERROR] Install Python 3.12+ first."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
install_backend_dependencies() {
|
||||
if command -v uv >/dev/null 2>&1; then
|
||||
echo "[INFO] Using uv to install backend dependencies..."
|
||||
(
|
||||
cd "$BACKEND_DIR"
|
||||
uv sync
|
||||
)
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "[INFO] uv was not found. Falling back to venv + pip..."
|
||||
(
|
||||
cd "$BACKEND_DIR"
|
||||
if ! "${PYTHON_BOOTSTRAP[@]}" -m venv .venv; then
|
||||
echo "[WARN] python -m venv failed. Trying virtualenv fallback..."
|
||||
"${PYTHON_BOOTSTRAP[@]}" -m pip install --user virtualenv
|
||||
"${PYTHON_BOOTSTRAP[@]}" -m virtualenv .venv
|
||||
fi
|
||||
if [[ "$USE_WINDOWS_TOOLS" == true ]]; then
|
||||
.venv/Scripts/python.exe -m pip install --upgrade pip
|
||||
.venv/Scripts/python.exe -m pip install -e .
|
||||
else
|
||||
.venv/bin/python -m pip install --upgrade pip
|
||||
.venv/bin/python -m pip install -e .
|
||||
fi
|
||||
)
|
||||
}
|
||||
|
||||
install_frontend_dependencies() {
|
||||
if [[ "$USE_WINDOWS_TOOLS" == true ]]; then
|
||||
(
|
||||
cd "$FRONTEND_DIR"
|
||||
if [[ -f "package-lock.json" ]]; then
|
||||
cmd.exe /c npm ci
|
||||
else
|
||||
cmd.exe /c npm install
|
||||
fi
|
||||
)
|
||||
else
|
||||
(
|
||||
cd "$FRONTEND_DIR"
|
||||
if [[ -f "package-lock.json" ]]; then
|
||||
npm ci
|
||||
else
|
||||
npm install
|
||||
fi
|
||||
)
|
||||
fi
|
||||
|
||||
if [[ -f "$FRONTEND_DIR/node_modules/.bin/vite" || -f "$FRONTEND_DIR/node_modules/.bin/vite.cmd" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "[ERROR] Frontend dependencies were installed, but vite was not found."
|
||||
echo "[ERROR] Check frontend/node_modules and npm output."
|
||||
exit 1
|
||||
}
|
||||
|
||||
echo "[1/4] Prepare backend environment file..."
|
||||
ensure_backend_env
|
||||
|
||||
echo
|
||||
echo "[2/4] Install backend dependencies..."
|
||||
install_backend_dependencies
|
||||
|
||||
if [[ "$USE_WINDOWS_TOOLS" == true ]]; then
|
||||
if [[ ! -f "$BACKEND_PYTHON" ]]; then
|
||||
echo "[ERROR] Backend virtual environment Python was not found after setup: $BACKEND_PYTHON"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if [[ ! -x "$BACKEND_PYTHON" ]]; then
|
||||
echo "[ERROR] Backend virtual environment Python was not found after setup: $BACKEND_PYTHON"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "[OK] Backend dependencies installed."
|
||||
|
||||
echo
|
||||
echo "[3/4] Install frontend dependencies..."
|
||||
install_frontend_dependencies
|
||||
echo "[OK] Frontend dependencies installed."
|
||||
|
||||
echo
|
||||
echo "[4/4] Sync frontend API configuration..."
|
||||
sync_frontend_env
|
||||
|
||||
echo
|
||||
echo "=========================================="
|
||||
echo " Setup complete"
|
||||
echo
|
||||
echo " Backend env: $BACKEND_ENV"
|
||||
echo " Frontend env: $FRONTEND_ENV_LOCAL"
|
||||
echo
|
||||
echo " Next: bash start.sh"
|
||||
echo "=========================================="
|
||||
Reference in New Issue
Block a user