#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' log() { echo -e "${GREEN}[bx-backend]${NC} $*"; } warn() { echo -e "${YELLOW}[bx-backend]${NC} $*"; } err() { echo -e "${RED}[bx-backend]${NC} $*" >&2; } # ---- Virtual Env ---- if [ -d ".venv" ]; then log "Activating .venv" source .venv/bin/activate elif [ -d "venv" ]; then log "Activating venv" source venv/bin/activate else warn "No virtual environment found, using system Python" fi # Resolve python command (prefer python, fallback to python3) PYTHON_BIN="$(command -v python 2>/dev/null || true)" if [ -z "$PYTHON_BIN" ]; then PYTHON_BIN="$(command -v python3 2>/dev/null || true)" fi if [ -z "$PYTHON_BIN" ]; then err "Neither 'python' nor 'python3' command found. Install Python 3.11+ or activate a venv." exit 1 fi PYTHON_MAJOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.major)' 2>/dev/null || echo 0)" PYTHON_MINOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.minor)' 2>/dev/null || echo 0)" if [ "$PYTHON_MAJOR" -lt 3 ] || { [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 11 ]; }; then err "Python 3.11+ is required, but got: $("$PYTHON_BIN" --version 2>&1)" err "Please make sure 'python' or 'python3' points to a compatible version." exit 1 fi PYTHON="$PYTHON_BIN" log "Using Python: $PYTHON ($($PYTHON --version 2>&1))" # ---- Load .env ---- if [ -f ".env" ]; then log "Loading .env" set -a while IFS='=' read -r key value; do [[ -z "$key" || "$key" =~ ^# ]] && continue value="${value%\"}" value="${value#\"}" value="${value%\'}" value="${value#\'}" export "$key=$value" done < .env set +a fi HOST="${APP_HOST:-0.0.0.0}" PORT="${APP_PORT:-8011}" DEBUG="${DEBUG:-false}" log "Starting 报销系统后端服务 on ${HOST}:${PORT} (debug=${DEBUG})" # ---- Start Server ---- if [ "$DEBUG" = "true" ]; then $PYTHON -m uvicorn app.main:app --host "$HOST" --port "$PORT" --reload else $PYTHON -m uvicorn app.main:app --host "$HOST" --port "$PORT" fi